(免费无需vip)HTTP协议深度专研/第一部分:基础与本质 /1.0HTTP请求全过程详解


这是我“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深度优化等话题,关注我,不错过后续更新!✨


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值