当我们在页面上发起一个AJAX请求的时候,阿紫网络协议层面都经历了哪些内容?
使用Wireshark 抓包结果如下:
图中可看到,请求baidu.com 时,首先通过TCP 3次握手建立连接,然后通过HTTP 传输内容,最后通过TCP 4次挥手断开连接。
1.建立连接阶段
1.1.DNS域名解析
只有在DNS缓存都没有命中的时候才会请求DNS服务器
判断步骤如下:
- 判断浏览器是否有缓存IP地址
- 判断本机是否有缓存IP地址,如Host文件
- 判断本地域名解析服务器是否有缓存IP地址,如:电信,联通等运营商
- 向DNS根域名解析服务器,解析域名IP地址
- 向DNS二级域名解析服务器,解析域名IP地址
- 以此类推,最终获得IP地址
2.建立TCP连接
有IP地址后,客户端和服务端就能建立连接了,首先是建立TCP连接。TCP是一种面向连接的、可靠地、基于字节流的传输层通信协议。
在这一层,我们传输的数据会按照一个个字节装入报文中,当报文的长度达到最大分段(MSS)时,就会发送这个报文。如果传输的报文很长,可能会被拆分成多个TCP报文进行传输。TCP报文头如下:
我们主要看以下几点:
- 源端口、目的端口
- 序列号:seq,报文的唯一标识
- 确认号:ack,报文的确认标识,便于确认seq 是否已经收到
- TCP标记:SYN、ACK、FIN
- 窗口:表示发送方可以接收的字节数,及接收窗口大小,用于流量控制。
接下来,我们看一下TCP 是怎样建立连接的?
如图,建立TCP连接需要3个步骤,
三次握手
- 客户端向服务器发送序列号seq = x 的标识,表示开始建立连接
- 服务端回发一个ack=x+1 的标识,表示确认收到第一次握手,同时发送自己的标识seq=y
- 客户端发送ack=y+1的标识,表示确认收到第二次握手
经过3次握手,既保证了客户端和服务端都能正常发送和接收数据,TCP的连接也建立成功了
3.TCP可靠传输原理
停止等待协议ARQ
TCP是可靠地传输,这是因为TCP 内部是用来停止等待协议ARQ,他通过确认和重传机制,实现了信息的可靠传输。
- 客户端发送数据 M1
- 服务端确认数据 M1 收到
- 客户端发送数据 M2
- 服务端确认数据 M2 收到
- 以此类推…
在这期间,如果某一次数据很久未得到确认,客户端就会重传这条数据。这样一来,对每一次发送的数据,服务端都得到了确认,即保证了数据的可靠性
虽然ARQ可以满足数据可靠性,但每次只能发送和确认一个请求,效率太低,于是产生了连续ARQ协议
连续ARQ协议
会连续发送一组数据,然后再批量等待这一组数据的确认信息,好比把单线程ARQ变成了多线程,大大提高了资源的利用效率
如:
- 客户端发送数据 M1、M2、M3、M4
- 服务端确认数据 M4收到,表示 M4 及之前的数据都收到了
累计确认
在这个流程中,服务端不需要对每一个数据都返回确认信息,而是接收到多个数据时一并确认,这个方式叫做 累计确认
1.根据IP协议找到目标服务器
TCP的每一次握手,是怎么找到目的服务器的?
答:通过IP协议
IP协议的目的是实现网络层的数据转发,他通过路由器不断跳转,最终把数据成功送达目的地。上文中每一次TCP握手及数据交互,都是通过IP协议去出传输的
2.IP寻址算法
我们可以把网络中的所有计算机都看作是一个点,计算机之间的连接看作是一条线,这些点和线就组合成了一个图
通过上图,我们就把复杂的网络转化为数学问题。IP寻址算法,就是图论中的最短路径的算法。
最短路径算法在IP协议中有2种实现:
- RIP协议:使用距离矢量算法,确保IP路由跳转的次数最小
- OSPF协议:使用地杰斯特拉算法,确保IP 路由跳转的速度最快
通过以上两个协议,我们就能找到通往目的地的路径了
3.以太网协议
IP 数据是怎样从一个路由器跳到另一个路由器的?
答: 通过以太网协议
IP协议主要是用来寻找最优路径的,具体的传输是由以太网协议来做的
以太网属于数据链路层,他主要负责相邻设备的通信。原理是通过查询交换机 Mac 表,找到通信双方的物理接口,进而开始通信
以太网报文头如下:

我们只用关心以下3个点:
- 源Mac 地址
- 目的Mac 地址
- 校验码 CRC :校验当前帧是否有效。
4.通过网线向服务器硬件接口传输比特信息
通过以太网协议,我们找到了目标机器的硬件接口,接下来怎么发送信息呢?
答:通过物理层
网线就是物理层的设备之一
2.发送数据阶段
1.建立安全层 SSL
本文的案例是发送一个 HTTPS 的请求,所以在发送数据之前,会创建一个 SSL 安全层,用于数据加密,通常的加密方式有两种:
- 非对称加密
- A有钥匙,B没有钥匙,且他们都有一个公共的锁,B给 A发送数据时,都会先把数据锁起来再发送。
- 接收数据时,A 用钥匙解开锁,即可得到数据。除A 以外,其他人没有钥匙,也就获取不到数据
- 实现了单向通信加密
- A有钥匙,B没有钥匙,且他们都有一个公共的锁,B给 A发送数据时,都会先把数据锁起来再发送。
- 对称加密
- A、B双方都有一把相同的钥匙和一个公共的锁,每次发送数据时,都把数据放在锁里进行发送
- 接收数据时,A、B双方就用各自的钥匙来解锁。其他人没有钥匙,也就获取不到数据
- 实现了双向通信加密
到这里为止,所有的准备工作都就绪了,接下来才是发送HTTP 请求。
2.发送HTTP 请求
HTTP 协议其实就是制定了一个通信规则,规定了客户端和服务端直接的通信格式。以请求baidu 首页为例
如上图所示,发起HTTP 请求时,必须遵守以下规则:
- 请求方法(必填)GET
- 请求地址(必填)/
- HTTP 协议版本(必填)1.1
- 其他HTTP 头部字段(可选) Host、User-Agent、Accept
-
服务器响应请求时,同样遵守了Http 响应规则
Http协议版本(必填)1.1
- 响应状态码(必填)200
- 状态码描述(必填)OK
- 其他HTTP头部字段(可选)Date、Server、ETag、Last-Modified等
- 请求参数,放在空行后面(可选)
只要我们遵守这个规则,就能进行HTTP 通信了
