Http 请求头信息解析

作为前端开发人员(自己给自己定义的) 免不了每次的F12进行调试,这次我们说说 浏览器是如何请求你制作的一个个页面,一个个css文件。

大概分为几个部分

  • DNS查询

  • TCP中三次握手建立连接

  • 根据请求发送数据

  • 断开连接

DNS查询

DNS全称为(Domain Name System,域名系统),百度百科的解释是:因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析)。

文字太多不想记的话可以这样理解,DNS就是 域名和IP的映射,而他们的关系为多对多的,也就是1个域名可以对应N个IP(负载均衡之类的),一个IP可以对应N个不同的域名。而在域名解析时需要用户指定A记录或者CNAME记录等等。

先清空自己电脑上面的DNS缓存,打开一个浏览器,这里我输入度娘的网址,使用Wireshark抓包获取到如下信息:

3

在过滤输入框中输入 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

terminal-dns

TCP中三次握手建立连接

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

4

分析上图,可以看到在DNS查询后就开始了TCP握手报文的请求,连续三个请求就是这里说的tcp中的三次握手建立连接

  1. 第一个,由客户端发起,发送本机的一些基本信息,并设置SYN,表示这个包是握手信号包

  2. 由服务器返回给客户端,告诉客户端服务器收到信息

  3. 客户端收到服务器的返回后会发送ACK的包响应,告诉服务器我收到了,马上我就要开始发送请求了。

每次在一个新的Http请求之前,客户端都会和服务器进行握手,所以在分析抓包的时候会看到很多类似设置了Flags的包。

现在浏览器已经知道了向谁请求数据

请求发送数据

1

从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响应给客户端 如下图

3

可能有同学要问,为什么都是乱码。其实你错拉,这里只是使用了Gzip编码,细心的可以看见在返回的头部里面有这样的一个字段

Content-Encoding:gzip#

断开连接

在上面请求头中,有一个字段需要说明下:Connection:keep-alive,这个意思是让服务器和客户端保持一段时间连接,如果该字段为closed那么下一次客户端发起请求就需要再次TCP握手,而为keep-alive就不需要,客户端可以直接发起请求。

4

上图可以看见,在页面请求完毕后(这里看黑色背景部分)客户端首先发起一个Keep-Alive的ACK包,并且重复发送了五次,到了最后,服务器等得不耐烦了,发现这么久了都不来问我要东西,所以服务器就主动发送了一个关闭连接的FIN,里面设置了Flags的Fin属性,客户端迫于无奈只好放手 回复服务器我不要了。

至此,一个完整的HTTP请求就结束了,知道浏览器下一次请求。

文章中用到的数据包点击这里下载:百度网盘

作者:Soul

出处:https://www.cnblogs.com/sooooooul/p/17450388.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   CK..Soul  阅读(62)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示