![618496199ce0d4841fd759776f48a903.png](https://img-blog.csdnimg.cn/img_convert/618496199ce0d4841fd759776f48a903.png)
通过《浏览器之数据包传输》我们基本已经搞清了TCP、IP、UDP之前的关系,现在我们再来看一下HTTP协议。
计算机七层模型自下而上,IP属于传输层协议,TCP和UDP属于网络层协议,而最上层就是HTTP应用层协议,也就是说TCP是TCP/IP协议的调用者,HTTP协议是通过TCP/IP协议进行传输数据的。
![7f41dd66b6c1d0ea876749cf46d16bb8.png](https://img-blog.csdnimg.cn/img_convert/7f41dd66b6c1d0ea876749cf46d16bb8.png)
(数据包是由主机A的应用层HTTP协议创建,最后交由主机B应用层的HTTP协议解析)
整个HTTP请求构建过程如下:
1. 构建请求
浏览器构建请求行信息,包含了请求方法、请求 URI和 HTTP 协议版本。
GET /index.html HTTP1.1
2. 查找缓存
① DNS缓存:请求头中目标服务器HOST通常使用域名,想要获取服务器IP还需要经过一步DNS解析。DNS层层缓存可以帮助我们快速解析找到目标服务器。
② 浏览器缓存:我们常说“被浏览器缓存了,需要重刷一下页面”,指的是浏览器会将已请求过的资源文件在本地保存一份副本,当再次请求时若存在缓存文件,则不再执行下述步骤,直接返回缓存文件,这时候请求的返回状态码是304。
![40892da2baad38e50c436e69e18656bb.png](https://img-blog.csdnimg.cn/img_convert/40892da2baad38e50c436e69e18656bb.png)
3. 准备 IP 地址和端口
为TCP/IP协议请求准备IP地址(DNS解析-查找缓存阶段)与该进程端口号。
4.等待 TCP 队列
将请求事件插入至TCP队列,等待TCP队列轮训执行。浏览器同一时间最多可建立 6 个 TCP 连接,队列长度<=6时,即可建立连接。
5. 建立 TCP 连接
TCP连接进入准备阶段。与目标服务器三次握手,为后续数据传输做好准备。
6. 发送 HTTP 请求
HTTP请求包含三部分:请求行(构建请求阶段)、请求头、请求体。
![52eea06a008c246026db61c7790c7d48.png](https://img-blog.csdnimg.cn/img_convert/52eea06a008c246026db61c7790c7d48.png)
7.返回请求
服务器端接收到客户端的请求,将作出处理并返回相应数据,包含响应行、响应头、响应体。
![4c867a2c69d34c2db5692d9dad691c76.png](https://img-blog.csdnimg.cn/img_convert/4c867a2c69d34c2db5692d9dad691c76.png)
浏览器会根据响应数据作出不同的反应,例如不同的Content-Encoding(编码格式)对应使用不同的解码方式;Conent-type(数据类型)若为文件类型返回服务器文件,若为json返回XHR;状态码为200代表请求成功,404表示路径不存在等。
7.断开连接
若非长连接,TCP将断开与服务端的连接。持久连接可复用信道(keep-alive/webSocker),减少请求握手、挥手过程。
以上就是HTTP连接全过程,你可以根据下图查看、分析整个连接周期
![34c9e22a9d9b1692f03bfd3b1f4c2505.png](https://img-blog.csdnimg.cn/img_convert/34c9e22a9d9b1692f03bfd3b1f4c2505.png)