这是我“HTTP协议深度专研”的第一篇,作为一名还在成长中的小辈,我会努力将复杂知识清晰拆解。如果有不准确的地方,万分期待各位前辈在评论区指正!💪
如果这篇笔记对你有帮助,请务必点赞、收藏支持一下,这是对我最大的鼓励!
HTTP请求全过程解析
想要打通任督二脉,这个是一个非常核心的网络问题,待会我们会详细分解一次完整的HTTP请求全过程,重点说明TCP/IP协议栈的协作。
总览:TCP/IP协议栈的四层模型
| 层次 | 协议举例 | 职责 | 数据单元 | 类型比较 |
| 应用层 | HTTP,DNS,TLS,FTP | 处理业务逻辑,为软件应用提供具体的网络服务 | 报文 | 写信的内容(你好,请把简历发给我) |
| 传输层 | TCP,UDP | 管理两个应用程序之间的直接通信,确保数据可靠、有序地送达 | 段 | 信封包装方式(运费险/无运费险的区别,确保送到) |
| 网络层 | IP,ICMP | 进行全局的寻址和路由,将数据包从一个网络发送到另一个网络 | 包 | 邮寄地址系统(根据邮政编码和地址决定如何运转) |
| 网络接口层 | Ethernet,WiFi | 在本地物理网络上进行数据的直接传输 | 帧 | 邮递员送信(在一条具体的街道上,根据门牌号送货) |
接下来我们用五个阶段来完整的描述一次完整的HTTPS请求响应全过程

阶段一:DNS解析- “查询对方地址”

正常情况下浏览器并不知道http://www.example.com/ 在哪里,它需要先找到其对应的IP地址。
1.浏览器缓存:浏览器首先检查自己的缓存中是否有这个域名IP。
2.操作系统缓存:如果浏览器没有,会查询操作系统的hosts文件和DNS缓存。
3.路由器缓存:请求会发送到本地路由器,检查其缓存
3.ISP DNS 服务器:如果以上都没有,计算机会向配置的ISP(互联网服务提供商)的DNS服务器发起查询。这是一个UDP协议的应用层请求。
应用层:生成DNS查询保温,内容:请问www.example.com的IP是什么?
传输层:因为DNS查询要求快,对不可靠性要求不高,所以实用UDP协议。封装 上UDP头(含源端口、目标端口)。
网络层:封装上IP头,源IP是本机的IP,目的IP是DNS服务器的IP。
网络接口层:通过ARP协议获取网关路由器的MAC地址,封装上以太网帧头,发送出去。
5.递归/迭代查询:ISP的DNS服务器会代表你的计算机,从根域名服务器、.com顶级域名服务器,一直查询到example.com的权威域名服务器,最终获得IP地址,并逐级返回给你的浏览器。
各层协作重点:DNS解析本身是一个独立的、先行的应用层过程,它使用UDP作为传输层协议来快速完成查询,为后续的HTTP连接准备好目标IP地址。
阶段二:TCP三次握手-“建立可靠的连接通道”

浏览器拿到IP地址后,需要建立一条可靠的传输通道。

1.SYN(同步):
应用层:此时暂无HTTP数据。
传输层:浏览器(客户端)生成一个TCP段,将SYN标志设为1,并随机选择一个初始序列 号seq= x 。然后发送给服务器。
网络层:封装IP头(源IP、目标IP)。
网络接口层:封装帧头,发送。
目的:客户端对服务器说:“你好,我想和你建立连接,我的初始序列号是x,如果同意连接请确认(x+1)”
2.SYN-ACK(同步-确认)
服务器收到SYN包后,如果同意连接,会回复一个TCP段。
传输层:将SYN和ACK标志位都都设置为1,确认好ack=x+1,同时自己也随机生成一个序列号seq=y。注意:区别ACK(确认包)和ack(确认号)
目的:服务器对客户端说:“我收到了你的请求,我同意连接(所以x+1),我的初始序列号是y(如果客户端收到确认并建立连接就y+1)”
3.ACK(确认):
客户端收到SYN-ACK包后,会再发送一个确认包。
传输层:将ACK标志位设置为1,确认号ack=y+1,序列号seq=x+1。
目的:客户端对服务器说:“好的,我收到你的确认了,现在建立连接(y+1)”
此时,TCP双向连接正式建立,双方可以开始传输数据。
各层协作的重点:TCP握手完全是传输层的行为。应用层的HTTP数据还未开始发送。网络层负责每个TCP握手包路由到正确的目标机器。
阶段三:TLS握手-“建立安全的通信密室”(仅HTTPS)

因为我们是HTTPS,在发送HTTP请求之前,需要在已建立的TCP连接上再建立一个加密层。
1.ClientHello:客户端向服务器发送信息,包括支持的TLS版本、支持的加密套件列表、一个客户端随机数。
2.ServerHello:服务器回应选定的TLS版本、加密套件、一个服务器随机数,并发送其数字证书(包含公钥)。
3.验证证书与生成预主密钥:客户端验证证书的合法性(是否可信、是否过期、域名是否匹配等)。验证通过后,生成一个预主密钥,用服务器证书的公钥加密后发送服务器。
4.生成会话密钥:服务器用自己的私钥解密得到预主密钥。随后客户端讷河服务器分别使用客户端随机数、服务器随机数和预主密钥,独立计算出相同的主密钥,进而生成对称加密的会话密钥。
5.握手结束:双方交换加密后的“finished”消息,验证握手过程是否被篡改。验证通过后。TLS安全通道建立完成。

各层协作重点:TLS握手发生再应用层。它使用下面已经建立好的TCP连接来传输握手数据。可以理解为在TCP建立的“可靠电话线”上,双方用明文商量好后面要用一种彼此懂的暗语(对称密钥)来通话。
阶段四:HTTP报文传输-“真正的请求与回应”

安全通道建立后。浏览器终于可以发送真正的HTTP请求了。
1.发送HTTP请求:
应用层:浏览器构造一个HTTP GET请求报,例如:
GET /HTTP/1.1
Host:www.example.com
User-Agent:Mozilla/5.0.....
. . .
表示层/会话层(在TCP/IP模型中并入应用层):TLS协议将HTTP报文加密。
传输层:将加密后的数据分成一个或多个TCP段,每个段都有序列号和确认号,确保顺序和可靠性。
网络层:为每个TCP段封装IP头,形成IP包。
网络接口层:封装帧头,通过物理网络发送。
2.服务器处理并返回THHP响应:
服务器收到数据包,沿协议栈向上解封装:网络接口层->网络层->传输层(TCP重组数据)->应用层(TLS解密)
服务器应用(如Nginx,Apache)处理请求,找到对应的资源。
服务器沿协议栈向下封装HTTP回应报文,如:HTTP/1.1 200 OK后跟着HTML内容,过程与客户端发送请求完全对称。

各层协作重点:这是各层职责最清晰的体现,应用层生成纯文本的HTTP报文,TLS对其进行加密。传输层的TCP负责将大数据才分成段,并保证他们可靠、有序地到达对端。网络层的ip负责在全球网络中为这些数据包寻路。网络接口层负责在每一段数据流量上“送货上门”的传输。
阶段五:关闭连接-“礼貌地道别”
数据传输完毕后,连接需要被关闭。对于HTTP/1.1,默认是持久连接,但页面加载完成后通常会关闭。

1.FIN(结束):主动关闭方(可能是客户端或服务端)发送一个TCP段,将FIN标志设为M.
2.ACK(确认):被动关闭放收到FIN后,发送一个ACK进行确认。
3.FIN(结束):被动关闭方处理完所有数据后,也发送一个FIN段。
4.ACK(确认):主动关闭放发送最终的ACK确认。
这就是TCP四次挥手,之后双方释放连接资源。
总结
整个过程就像一次国际化的安全快递:
1.查地址(DNS解析):先打电话(UDP)问客服“exmple公司”的全球总部地址(IP)。
2.建立物流通道(TCP握手):和对方仓库建立一条可靠的、有订单跟踪(序列号)的物流路线。
3.建立安全运输队(TLS握手):双方商量号,以后货物都放在特制的防拆解保险箱(对称加密)里运输,并交换了保险箱钥匙。
4.发送和接受货物(HTTP传输):把真正的货物(HTTP请求)放进保险箱。通过物流线路发送,对方收到后,用钥匙打开,处理货物,并回信(HTTP响应)同样放进保险箱寄回。
5.关闭通道(连接关闭):货物送达,双方确认无误后,关闭物流通道。
感谢阅读到此的各位同志,哪里讲得不对或是不清晰的在评论区指正!本文是 『深入HTTP』系列 的开篇,接下来我会详解HTTP缓存、HTTPS深度优化等话题,关注我,不错过后续更新!✨
369

被折叠的 条评论
为什么被折叠?



