HTTP(HyperText Transfer Protocol,超文本传输协议)是用于传输超文本信息的协议,它是互联网上应用最为广泛的一种网络协议。了解完整的 HTTP 请求过程有助于我们更深层次的去分析问题(尤其是网络安全问题),同时也更能清楚为什么现在网站很少再用 HTTP 了,而改为使用更为安全的 HTTPS 协议。
上图中描述了客户端访问百度网站时,HTTP 的完整交互过程,接下来会对图中涉及的内容进行详细展开。
1. HTTP请求过程介绍
HTTP 连接本质就是使用 TCP 协议建立起的可靠连接进行请求发送与请求响应。HTTP 请求过程大致可以分为五个步骤(见上图),每个步骤细节如下:
- 1. DNS 解析:当客户端(如浏览器)尝试访问一个网站时,它首先会尝试从本地缓存中查找域名对应的 IP 地址。如果本地缓存中没有找到,客户端会发送 DNS 查询请求到本地的 DNS 服务器。
- 2. 建立 TCP 连接:客户端(如浏览器)向服务器发起连接请求,通常使用TCP/IP协议建立一个到服务器的 TCP 连接。这个过程称为三次握手(Three-way handshake),确保连接的可靠性。
- 3. 客户端发送请求:客户端向服务器发送 HTTP 请求消息。
- 4. 服务端响应请求:服务器接收到请求后,会检查请求头和请求体,然后根据请求方法(如 GET、POST)和资源路径来决定如何响应。
- 5. 释放 TCP 连接:请求完成后,客户端和服务器可以关闭连接。
2. Wireshark抓包分析
2.1. Wireshark抓包步骤
Wireshark 是一款最流行和强大的开源数据包抓包与分析工具,可以截取各种网络数据包,并可以查看网络数据包详细信息。接下来我们就用这款工具来抓取百度网站的 HTTP 请求数据包。
1)打开 Wireshark,开启抓包,然后打开 cmd 窗口,执行命令 curl www.baidu.com 访问百度。
2)在 cmd 中执行命令 ping www.baidu.com 获取百度的 IP 地址。
3)为避免其他无用的数据包影响分析,可在显示过滤器(display filter)输入过滤条件 ip.addr== 36.155.132.3,过滤与百度发生交互的数据包。
说明:ip.addr== 36.155.132.3 表示只显示 TCP 协议且源主机 IP 或者目的主机 IP 为 36.155.132.3 的数据包。
2.2. Wireshark数据包分析
接下来主要按四个过程进行介绍,针对过程 1(三次握手建立连接)和过程 4(四次挥手断开连接),在博主的前期文章中《结合Wireshark抓包实战,图文详解 TCP 三次握手及四次挥手原理》已经详细图解,这次主要针对过程 2 和过程 3 进行详解。
- 过程 1:"三次握手" 建立 TCP 连接;
- 过程 2:客户端发送 HTTP 请求;
- 过程 3:服务器发送 HTTP 响应;
- 过程 4:"四次挥手" 断开 TCP 连接。
1)前三个包完成了 "三次握手",建立了 TCP 连接。
2)第一个 HTTP 协议包(序号 356)执行了 HTTP 请求。
客户端向服务器发送HTTP请求消息。请求消息通常包括以下部分:
- 请求行:包含请求方法(如GET、POST)、请求的资源路径、HTTP版本。
- 请求头:包含客户端信息、请求参数等,例如User-Agent、Accept、Cookie等。
- 请求体:对于某些请求方法(如POST),可能包含额外的数据,用于向服务器发送信息。
点开请求行,看里面的三个字段,下图所示:
- Request Method:请求方法,这里的请求方法是 GET;
- Request URI:请求的 URI,没指定默认是/,因为我们只请求了域名 www.baidu.com,并没指定要获取的资源,所以是默认的 /;
- Request Version:请求的版本,因为用的是 HTTP 协议,所以这里显示 HTTP 协议的版本。
再看下面的几个请求头:
Host:目标主机;
User-Agent:用户代理,也就是浏览器的类型。由于我们没用浏览器,所以这里显示的是命令curl,版本为8.4.0;
Accept:浏览器可接受的MIME(Multipurpose Internet Mail Extensions)类型。
浏览器通常使用 MIME 类型(而不是文件扩展名)来确定如何处理URL,因此 We b服务器在响应头中添加正确的 MIME 类型非常重要。如果配置不正确,浏览器可能会无法解析文件内容,网站将无法正常工作,并且下载的文件也会被错误处理。
3)第二个HTTP协议包(序号360)执行了HTTP响应。
服务器接收到请求后,会检查请求头和请求体,然后根据请求方法(如GET、POST)和资源路径来决定如何响应。服务器生成的响应消息,包括状态行、响应体。
- 状态行:包含版本和响应状态码、状态信息;
- 响应头:包含响应的服务器的资源信息,一行一个响应头;
- 响应空行:用来间隔/区分响应头和响应体;
- 响应体:服务器响应的内容,通常是一个HTML页面的代码或者给客户端的数据,上图中可以看到本次响应的内容是一个文件数据(File Data)。
点开状态行,可以看到里面有三个字段:
- Response Version:响应版本,因为使用的是HTTP协议,所以这里显示了HTTP的版本;
- Status Code:响应状态码,这里的 200 表示请求成功;
- Response Phrase:响应状态码的提示信息。
最后看下几个响应头:
响应头
Accept-Ranges: 告知客户端资源是否支持范围请求。当前取值 bytes 表明资源支持范围请求,可以使用Range头进行请求。
Cache-Control: 控制缓存行为,包括是否缓存、缓存的有效期、缓存策略等。
Connection: 服务器是否需要保持连接。
keep-alive 表示服务器希望在发送响应后不立即关闭连接,而是保持连接状态以供后续请求复用。这种设置可以提高服务器的响应效率,减少 TCP 连接的建立和断开的开销,特别是在处理大量并发请求的场景下。
Content-Length: 响应内容的字节数,本例是 2381 字节。
Content-Type: 响应内容的类型和编码方式,text/html。
Date: 指示响应消息生成的时间。
Etag: 资源的实体标签(Entity Tag),用于缓存控制和验证。
Last-Modified: 资源的最后修改时间
Pragma: 历史遗留的 HTTP 头,它最初用于缓存控制,但现在已不推荐使用。取值 no-cache 表明不使用缓存。
Server: 服务器的名称或版本。
Set-Cookie: 用于设置客户端的 Cookie
4)最后四个包,通过"四次挥手"断开了TCP连接。
请求完成后,客户端和服务器可以关闭连接。通常情况下,HTTP 1.0使用的是短连接,请求完成后关闭连接。HTTP 1.1默认使用长连接,多个请求可以复用同一个连接,直到连接超时或被关闭。
当打开响应体,细心的读者会发现它的内容是明文的,对于机密通信来说HTTP通信很容易产生信息泄露。另外,以上介绍的整个交互过程中并不验证通信方的身份,第三方可以冒充他人身份参与通信。博主后续会发图文详解,带你搞清楚HTTPS协议的工作机制。
响应内容明文传输
标签:HTTP,请求,TCP,响应,实验,连接,抓包,客户端 From: https://blog.csdn.net/weixin_74531333/article/details/144964292