Http 请求头信息解析
作为前端开发人员(自己给自己定义的) 免不了每次的F12进行调试,这次我们说说 浏览器是如何请求你制作的一个个页面,一个个css文件。
大概分为几个部分
-
DNS查询
-
TCP中三次握手建立连接
-
根据请求发送数据
-
断开连接
DNS查询
DNS全称为(Domain Name System,域名系统),百度百科的解释是:因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析)。
文字太多不想记的话可以这样理解,DNS就是 域名和IP的映射,而他们的关系为多对多的,也就是1个域名可以对应N个IP(负载均衡之类的),一个IP可以对应N个不同的域名。而在域名解析时需要用户指定A记录或者CNAME记录等等。
先清空自己电脑上面的DNS缓存,打开一个浏览器,这里我输入度娘的网址,使用Wireshark抓包获取到如下信息:

在过滤输入框中输入 DNS || http后部分信息如上图
可以看见在进行HTTP GET 请求之前 进行了DNS query ,在最后的返回信息中获取到了 baidu 对应的ip地址,180.97.33.108/180.97.33.107
也就是说明 www.baidu.com 对应的IP 地址为 180.97.33.108 或者 180.97.33.107 或者还有更多。
简单的测试方法是:在浏览器里面直接输入IP地址访问 看看是不是百度,还可以使用ping命令ping百度的域名看看对应响应的IP地址。
在命令终端里面使用nslookup命令也可以查询对应的DNS

TCP中三次握手建立连接
本地客户端找到自己需要访问的IP地址后,就要进行握手连接,这个是必要的,在握手连接里面服务器和客户端会协商一些必要的参数例如:window size

分析上图,可以看到在DNS查询后就开始了TCP握手报文的请求,连续三个请求就是这里说的tcp中的三次握手建立连接
-
第一个,由客户端发起,发送本机的一些基本信息,并设置SYN,表示这个包是握手信号包
-
由服务器返回给客户端,告诉客户端服务器收到信息
-
客户端收到服务器的返回后会发送ACK的包响应,告诉服务器我收到了,马上我就要开始发送请求了。
每次在一个新的Http请求之前,客户端都会和服务器进行握手,所以在分析抓包的时候会看到很多类似设置了Flags的包。
现在浏览器已经知道了向谁请求数据
请求发送数据

从Wireshark工具中可以看到,浏览器向主机名为www.baidu.com的地址发送了一个GET请求,并且使用了HTTP 1.1的协议。
Hypertext Transfer Protocol 就是超文本传输协议,图中可以看见请求的头部信息
主要有:
Request Method:请求方法 GET#
Request URI: 请求的URI地址 (URI和URL可以理解为:URI是URL的子集,剩下的自己百度吧)/#
Request Version: 请求的协议版本 HTTP/1.1 (当前已经有了HTTP2.0协议)#
Host: 主机名#
User-Agent:用户代理,是用户使用的浏览器的类型,版本和一些系统基本信息#
Accept:浏览器接受的媒体类型#
Accept-Language:浏览器接受的语言#
Accept-Encoding:浏览器接受的编码种类#
Connection:本次请求完毕后的连接方法#
服务器接收到请求后会发送Response响应给客户端 如下图

可能有同学要问,为什么都是乱码。其实你错拉,这里只是使用了Gzip编码,细心的可以看见在返回的头部里面有这样的一个字段
Content-Encoding:gzip#
断开连接
在上面请求头中,有一个字段需要说明下:Connection:keep-alive,这个意思是让服务器和客户端保持一段时间连接,如果该字段为closed那么下一次客户端发起请求就需要再次TCP握手,而为keep-alive就不需要,客户端可以直接发起请求。

上图可以看见,在页面请求完毕后(这里看黑色背景部分)客户端首先发起一个Keep-Alive的ACK包,并且重复发送了五次,到了最后,服务器等得不耐烦了,发现这么久了都不来问我要东西,所以服务器就主动发送了一个关闭连接的FIN,里面设置了Flags的Fin属性,客户端迫于无奈只好放手 回复服务器我不要了。
至此,一个完整的HTTP请求就结束了,知道浏览器下一次请求。
文章中用到的数据包点击这里下载:百度网盘
作者:Soul
出处:https://www.cnblogs.com/sooooooul/p/17450388.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?