当我们在页面上发起一个AJAX请求的时候,阿紫网络协议层面都经历了哪些内容?
使用Wireshark 抓包结果如下:
HTTP、TCP、IP、以太网 - 图1
图中可看到,请求baidu.com 时,首先通过TCP 3次握手建立连接,然后通过HTTP 传输内容,最后通过TCP 4次挥手断开连接。

真实过程更加复杂,我们主要分析以下几点:

1.建立连接阶段

1.1.DNS域名解析

只有在DNS缓存都没有命中的时候才会请求DNS服务器
判断步骤如下:

  1. 判断浏览器是否有缓存IP地址
  2. 判断本机是否有缓存IP地址,如Host文件
  3. 判断本地域名解析服务器是否有缓存IP地址,如:电信,联通等运营商
  4. 向DNS根域名解析服务器,解析域名IP地址
  5. 向DNS二级域名解析服务器,解析域名IP地址
  6. 以此类推,最终获得IP地址

2.建立TCP连接

有IP地址后,客户端和服务端就能建立连接了,首先是建立TCP连接。TCP是一种面向连接的、可靠地、基于字节流的传输层通信协议。

在这一层,我们传输的数据会按照一个个字节装入报文中,当报文的长度达到最大分段(MSS)时,就会发送这个报文。如果传输的报文很长,可能会被拆分成多个TCP报文进行传输。TCP报文头如下:
HTTP、TCP、IP、以太网 - 图2
我们主要看以下几点:

  1. 源端口、目的端口
  2. 序列号:seq,报文的唯一标识
  3. 确认号:ack,报文的确认标识,便于确认seq 是否已经收到
  4. TCP标记:SYN、ACK、FIN
  5. 窗口:表示发送方可以接收的字节数,及接收窗口大小,用于流量控制。

接下来,我们看一下TCP 是怎样建立连接的?
HTTP、TCP、IP、以太网 - 图3
如图,建立TCP连接需要3个步骤,

三次握手

  1. 客户端向服务器发送序列号seq = x 的标识,表示开始建立连接
  2. 服务端回发一个ack=x+1 的标识,表示确认收到第一次握手,同时发送自己的标识seq=y
  3. 客户端发送ack=y+1的标识,表示确认收到第二次握手

经过3次握手,既保证了客户端和服务端都能正常发送和接收数据,TCP的连接也建立成功了

3.TCP可靠传输原理

停止等待协议ARQ

TCP是可靠地传输,这是因为TCP 内部是用来停止等待协议ARQ,他通过确认和重传机制,实现了信息的可靠传输。
HTTP、TCP、IP、以太网 - 图4

  1. 客户端发送数据 M1
  2. 服务端确认数据 M1 收到
  3. 客户端发送数据 M2
  4. 服务端确认数据 M2 收到
  5. 以此类推…

在这期间,如果某一次数据很久未得到确认,客户端就会重传这条数据。这样一来,对每一次发送的数据,服务端都得到了确认,即保证了数据的可靠性

虽然ARQ可以满足数据可靠性,但每次只能发送和确认一个请求,效率太低,于是产生了连续ARQ协议

连续ARQ协议

会连续发送一组数据,然后再批量等待这一组数据的确认信息,好比把单线程ARQ变成了多线程,大大提高了资源的利用效率
HTTP、TCP、IP、以太网 - 图5
如:

  1. 客户端发送数据 M1、M2、M3、M4
  2. 服务端确认数据 M4收到,表示 M4 及之前的数据都收到了

累计确认

在这个流程中,服务端不需要对每一个数据都返回确认信息,而是接收到多个数据时一并确认,这个方式叫做 累计确认

1.根据IP协议找到目标服务器

TCP的每一次握手,是怎么找到目的服务器的?
答:通过IP协议

IP协议的目的是实现网络层的数据转发,他通过路由器不断跳转,最终把数据成功送达目的地。上文中每一次TCP握手及数据交互,都是通过IP协议去出传输的

IP报文头如下:
HTTP、TCP、IP、以太网 - 图6

2.IP寻址算法

我们可以把网络中的所有计算机都看作是一个点,计算机之间的连接看作是一条线,这些点和线就组合成了一个图
HTTP、TCP、IP、以太网 - 图7
通过上图,我们就把复杂的网络转化为数学问题。IP寻址算法,就是图论中的最短路径的算法。

最短路径算法在IP协议中有2种实现:

  1. RIP协议:使用距离矢量算法,确保IP路由跳转的次数最小
  2. OSPF协议:使用地杰斯特拉算法,确保IP 路由跳转的速度最快

通过以上两个协议,我们就能找到通往目的地的路径了

3.以太网协议

IP 数据是怎样从一个路由器跳到另一个路由器的?
答: 通过以太网协议

IP协议主要是用来寻找最优路径的,具体的传输是由以太网协议来做的

以太网属于数据链路层,他主要负责相邻设备的通信。原理是通过查询交换机 Mac 表,找到通信双方的物理接口,进而开始通信

以太网报文头如下:

HTTP、TCP、IP、以太网 - 图8
我们只用关心以下3个点:

  1. 源Mac 地址
  2. 目的Mac 地址
  3. 校验码 CRC :校验当前帧是否有效。

4.通过网线向服务器硬件接口传输比特信息

通过以太网协议,我们找到了目标机器的硬件接口,接下来怎么发送信息呢?
答:通过物理层

网线就是物理层的设备之一

2.发送数据阶段

1.建立安全层 SSL

本文的案例是发送一个 HTTPS 的请求,所以在发送数据之前,会创建一个 SSL 安全层,用于数据加密,通常的加密方式有两种:

  1. 非对称加密
    1. A有钥匙,B没有钥匙,且他们都有一个公共的锁,B给 A发送数据时,都会先把数据锁起来再发送。
      1. 接收数据时,A 用钥匙解开锁,即可得到数据。除A 以外,其他人没有钥匙,也就获取不到数据
      2. 实现了单向通信加密
  2. 对称加密
    1. A、B双方都有一把相同的钥匙和一个公共的锁,每次发送数据时,都把数据放在锁里进行发送
    2. 接收数据时,A、B双方就用各自的钥匙来解锁。其他人没有钥匙,也就获取不到数据
    3. 实现了双向通信加密

到这里为止,所有的准备工作都就绪了,接下来才是发送HTTP 请求。

2.发送HTTP 请求

HTTP 协议其实就是制定了一个通信规则,规定了客户端和服务端直接的通信格式。以请求baidu 首页为例
HTTP、TCP、IP、以太网 - 图9

如上图所示,发起HTTP 请求时,必须遵守以下规则:

  1. 请求方法(必填)GET
  2. 请求地址(必填)/
  3. HTTP 协议版本(必填)1.1
  4. 其他HTTP 头部字段(可选) Host、User-Agent、Accept
  5. 请求参数,放在空行后面(可选)

    服务器响应请求时,同样遵守了Http 响应规则

  6. Http协议版本(必填)1.1

  7. 响应状态码(必填)200
  8. 状态码描述(必填)OK
  9. 其他HTTP头部字段(可选)Date、Server、ETag、Last-Modified等
  10. 请求参数,放在空行后面(可选)

只要我们遵守这个规则,就能进行HTTP 通信了