跳转至

看小林coding网络note

以TCP/IP 四层网络模型为例

但如果看不懂也别担心,这并不影响你后续知识的学习。

基础篇

1 IP层|IP地址-网络号-子网掩码计算

如果知道了IP地址、子网掩码(或者掩码位),就可以计算网络号、主机号了

IP地址和子网掩码 按位相与 得到网络号

子网掩码取反,然后和IP地址 按位相与 得到主机号

2 每层封装格式

网络接口层的传输单位是帧(frame),IP 层的传输单位是包【报】(packet),TCP 层的传输单位是段(segment),HTTP 的传输单位则是消息或报文(message)。但这些名词并没有什么本质的区分,可以统称为数据包。

3 DNS 的解析全过程

  1. 客户端发出DNS请求,问www.server.com的IP是什么,并发给本地 DNS 服务器。
  2. 本地域名服务器收到请求后,在缓存中寻找www.server.com对应的IP地址。如果有,就返回,如果没有,本地 DNS 会去问它的根域名服务器:“老大, 能告诉我 www.server.com 的 IP 地址吗?” 根域名服务器是最高层次的,它不直接用于域名解析,但能指明一条道路。
  3. 根 DNS 收到来自本地 DNS 的请求后,发现后置是 .com,说:“www.server.com 这个域名归 .com 区域管理”,我给你 .com 顶级域名服务器地址给你
  4. 本地 DNS 收到顶级域名服务器的地址后,发起请求问“老二, 你能告诉我 www.server.com 的 IP 地址吗?”
  5. 顶级域名服务器说:“我给你负责 www.server.com 区域的权威 DNS 服务器的地址,你去问它应该能问到”。
  6. 本地的DNS,再去问权威DNS服务器server.com。server.com 的权威 DNS 服务器,它是域名解析结果的原出处。为啥叫权威呢?就是我的域名我做主
  7. 权威 DNS 服务器查询后将对应的 IP 地址 X.X.X.X 告诉本地 DNS。
  8. 本地 DNS 再将 IP 地址返回客户端,客户端和目标建立连接。

缓存:

浏览器会先看自身有没有对这个域名的缓存,如果有,就直接返回,如果没有,就去问操作系统,操作系统也会去看自己的缓存,如果有,就直接返回,如果没有,再去 hosts 文件看,也没有,才会去问「本地 DNS 服务器」。

4 从网址到网页显示的全过程

  1. 浏览器解析URL,生成HTTP请求信息
  2. 根据域名利用DNS服务器查询对应 IP地址
  3. 把 HTTP 的传输工作交给操作系统中的 协议栈。建立TCP连接,加上TCP头部
  4. 再加上IP头部的数据包
  5. 利用ARP协议,IP地址找MAC地址。加上MAC头部
  6. 网卡将数字信息转换为电信号,在网线上传输
  7. 电信号到达网线接口,交换机里的模块进行接收,接下来交换机里的模块将电信号转换为数字信号。交换机根据自带的MAC地址表,将信息进行转发到目标端口。
  8. 如果在多个网络上进行传输的话。网络包经过交换机之后,现在到达了路由器,并在此被转发到下一个路由器或目标设备。

5 路由器和交换机区别

区别:

  • 因为路由器是基于 IP 设计的,俗称三层网络设备,路由器的各个端口都具有 MAC 地址和 IP 地址;
  • 交换机是基于以太网设计的,俗称二层网络设备,交换机的端口不具有 MAC 地址。交换机就是转发信息的作用,来者不拒。

路由器的端口具有 MAC 地址,因此它就能够成为以太网的发送方和接收方;同时还具有 IP 地址,从这个意义上来说,它和计算机的网卡是一样的。

当转发包时,首先路由器端口会接收发给自己的以太网包,然后路由表查询转发目标,再由相应的端口作为发送方将以太网包发送出去。


为什么路由器要有MAC地址和IP地址,有MAC地址不就够了吗?

路由器的端口具有 MAC 地址,因此它就能够成为以太网的发送方和接收方,可以接收交换机发来的以太网包。

这个时候,就要看看路由器一整个接收包和转发包的流程了:

  1. 路由器接收交换机发来的以太网包,检查 MAC 头部中的接收方 MAC 地址,看看是不是发给自己的包,如果是就放到接收缓冲区中,否则就丢弃这个包。
  2. 完成包接收操作之后,路由器就会去掉包开头的 MAC 头部。MAC 头部的作用就是将包送达路由器,其中的接收方 MAC 地址就是路由器端口的 MAC 地址。因此,当包到达路由器之后,MAC 头部的任务就完成了,于是 MAC 头部就会被丢弃。(这一个MAC头部就没有用了,注意下面会有新的MAC头部)
  3. 接下来路由器根据IP头部,查询路由表,目标IP地址的网络地址。根据路由表的网关,判断目标IP地址是否已经抵达终点。(如果网关是个IP地址,则这个IP地址就是我们要转发到的目标地址;为空,则已经抵达终点)
  4. 如果未抵达,则根据这个网关的IP地址,通过ARP协议查询接收方的MAC地址。路由器将自己输出端口的MAC地址作为发送方的MAC地址字段,重新封装一个MAC头部。转发给另外一个路由器
  5. 另外一个路由器重新执行步骤1-4
  6. 如果在某个路由器抵达了终点,执行步骤3,并重新封装一个MAC头部(这个时候发送方的MAC地址是该路由器输出端口的MAC地址,接收方的MAC地址是某台个人计算机的MAC地址),并将它交给交换机
  7. 交换机利用目标MAC地址 通过MAC地址表,将包转发到目标计算机上。

TIPS:在网络包传输的过程中,源 IP 和目标 IP 始终是不会变的,一直变化的是 MAC 地址,因为需要 MAC 地址在以太网内进行两个设备之间的包传输。

HTTP篇

HTTP 是一个在计算机世界里专门在「两点」之间「传输」文字、图片、音频、视频等「超文本」数据的「约定和规范」。

1 HTTP常见的字段

  1. Host:指定服务器域名
  2. Content-Length :表明本次回应的数据长度。
  3. Connection :最常用于客户端要求服务器使用「HTTP 长连接」机制,以便其他请求复用。
  4. Content-Type :用于服务器回应时,告诉客户端,本次数据是什么格式。
  5. Accept :客户端声明自己可以接受哪些数据格式。
  6. Content-Encoding :说明数据的压缩方法。表示服务器返回的数据使用了什么压缩格式
  7. Accept-Encoding :客户端说明自己可以接受哪些压缩方法。

2 GET和POST

GET:从从服务器获取指定的资源,这个资源可以是静态的文本、页面、图片视频等。GET 请求的参数位置一般是写在 URL 中。

POST 的语义是根据请求负荷(报文body)对指定的资源做出处理,具体的处理方式视资源类型而不同。POST 请求携带数据的位置一般是写在报文 body 中,body 中的数据可以是任意格式的数据,只要客户端与服务端协商好即可,而且浏览器不会对 body 大小做限制。

POST是否比GET更安全?

都是一样的,GET的请求参数在URL中可见,而POST看似不可见,其实可见。因为 HTTP 传输的内容都是明文的,虽然在浏览器地址拦看不到 POST 提交的 body 数据,但是只要抓个包就都能看到了。

3 HTTP和HTTPS区别

  • HTTP 是超文本传输协议,信息是明文传输,存在安全风险的问题。HTTPS 则解决 HTTP 不安全的缺陷,在 TCP 和 HTTP 网络层之间加入了 SSL/TLS 安全协议,使得报文能够加密传输。

  • HTTP 连接建立相对简单, TCP 三次握手之后便可进行 HTTP 的报文传输。而 HTTPS 在 TCP 三次握手之后,还需进行 SSL/TLS 的握手过程,才可进入加密报文传输。

  • 两者的默认端口不一样,HTTP 默认端口号是 80,HTTPS 默认端口号是 443。

  • HTTPS 协议需要向 CA(证书权威机构)申请数字证书,来保证服务器的身份是可信的。

SSL/TLS: 信息加密、校验机制、身份证书

4 HTTP/1.1的优化方案

  1. 避免发送HTTP请求-缓存技术
  2. 减少HTTP请求的次数-减少重定向次数、合并请求、延迟请求(按需获取)
  3. 减少HTTP响应的数据大小:有损压缩、无损压缩

5 HTTPS RSA握手解析

HTTP 由于是明文传输,所谓的明文,就是说客户端与服务端通信的信息都是肉眼可见的,随意使用一个抓包工具都可以截获通信的内容。

存在三个风险:

  • 窃听风险:客户端->服务器端,可以在通信链路上获取通信内容,用户信息没了
  • 篡改风险:服务器端->客户端,植入广告,影响客户端收到的数据
  • 冒充风险:服务器端被冒充,即客户端<->冒牌服务器 之间进行信息交互

SSL/TLS是建立在TCP连接之上的,所以需要先进行TCP连接。

传统的 TLS 握手基本都是使用 RSA 算法来实现密钥交换的

TLS的四次握手

简单看就是双方互相发送加密的随机数,解密后,共享随机数。将这些随机数叫会话密钥。之后握手完成后利用会话密钥,进行加解密HTTP请求和响应。

  1. 客户端:发送Client Hello (TLS 版本号、支持的密码套件列表,以及生成的随机数(Client Random
  2. 服务端:
    1. 返回「Server Hello」消息,消息里面有服务器确认的 TLS 版本号,也给出了随机数(Server Random),然后从客户端的密码套件列表选择了一个合适的密码套件。
    2. 再发送「Server Certificate」给客户端,这个消息里含有数字证书。
    3. Server Hello Done」消息,目的是告诉客户端,我已经把该给你的东西都给你了,本次打招呼完毕。
  3. 客户端:
    1. 生成一个新的随机数 (pre-master),用服务器的 RSA 公钥(这个公钥是从证书中得到的)加密该随机数,通过「Client Key Exchange」消息传给服务端。
    2. 服务端收到后,用 RSA 私钥解密,得到客户端发来的随机数 (pre-master)。
    3. 双方共享使用三个随机数Client Random、Server Random、pre-master,生成会话密钥
    4. 客户端发一个「Change Cipher Spec」,告诉服务端开始使用加密方式发送消息。
    5. 客户端再发一个「Encrypted Handshake Message(Finishd)」消息,把之前所有发送的数据做个摘要,再用会话密钥(master secret)加密一下,让服务器做个验证,验证加密通信「是否可用」和「之前握手信息是否有被中途篡改过」。
  4. 服务端:服务器也是同样的操作,发「Change Cipher Spec」和「Encrypted Handshake Message」消息,如果双方都验证加密和解密没问题,那么握手正式完成。

这是所说的一次握手是,一方发送全部数据后(无论发送了几条),对方返回一个ACK,算一次。也就是一个大的来回算一次。

优化算法是ECDHE 算法 优化了握手的时间 和 客户端可以抢先在第三次握手之后发送信息

6 应用层协议WebSocket

  • TCP 协议本身是全双工的,但我们最常用的 HTTP/1.1,虽然是基于 TCP 的协议,但它是半双工的,对于大部分需要服务器主动推送数据到客户端的场景,都不太友好,因此我们需要使用支持全双工的 WebSocket 协议。
  • 在 HTTP/1.1 里,只要客户端不问,服务端就不答。基于这样的特点,对于登录页面这样的简单场景,可以使用定时轮询或者长轮询的方式实现服务器推送(comet)的效果。
  • 对于客户端和服务端之间需要频繁交互的复杂场景,比如网页游戏,都可以考虑使用 WebSocket 协议。

作用:服务器主动向客户端推送数据,实现全双工。

应用:网页游戏

TCP篇

1 为什么要三次握手?

  1. 第三次握手可以 防止历史的建立
  2. 第三次握手可以 减少不必要的资源浪费
  3. 可以同步双方序列号

2 为什么每次建立 TCP 连接时,初始化的序列号都要求不一样呢?

  • 为了防止历史报文被下一个相同四元组的连接接收(主要方面);
  • 为了安全性,防止黑客伪造的相同序列号的 TCP 报文被对方接收;

3 MTU和MSS是什么

MTU 的全称是最大传输单元(Maximum Transmission Unit),它是指在网络通信中,数据链路层可以一次性传输的最大数据包的大小。

MSS 的全称是最大报文段长度(Maximum Segment Size),它是指在传输控制协议(TCP)中,TCP 数据段(也称为报文段)的最大长度。

  • MTU:一个网络包的最大长度,以太网中一般为 1500 字节;
  • MSS:除去 IP 和 TCP 头部之后,一个网络包所能容纳的 TCP 数据的最大长度;

在分片传输中,一旦某个分片丢失,则会造成整个 IP 数据报作废,所以 TCP 引入了 MSS 也就是在 TCP 层进行分片不由 IP 层分片,那么对于 UDP 我们尽量不要发送一个大于 MTU 的数据报文。

IP篇

1 IP层和MAC层的区别

2 分类判断ABCD类地址

3 什么是环回地址

环回地址是在同一台计算机上的程序之间进行网络通信时所使用的一个默认地址。

环回地址是不会流向网络

计算机使用一个特殊的 IP 地址 127.0.0.1 作为环回地址。与该地址具有相同意义的是一个叫做 localhost 的主机名。使用这个 IP 或主机名时,数据包不会流向网络。

4 ICMP

ICMP 全称是 Internet Control Message Protocol,也就是互联网控制报文协议

ICMP 主要的功能包括:确认 IP 包是否成功送达目标地址、报告发送过程中 IP 包被废弃的原因和改善网络设置等。

ICMP 包头的类型字段,大致可以分为两大类:

  • 一类是用于诊断的查询消息,也就是「查询报文类型
  • 另一类是通知出错原因的错误消息,也就是「差错报文类型