[网络原理]http协议理论基础以及wireshark抓包分析(二)

前言:本文将简单介绍一下http协议.同时也借助抓包工具wireshark来对HTTP数据包的结构进行分析

HTTP 报文结构解析

HTTP协议是基于TCP数据报,做出的数据处理,处理后的数据结构在HTTP数据包中的结构也是不得不分析的一个重点

HTTP协议是一个文本协议(HTTP/1.1),文本的组织结构可以分为以下四种

(一) 请求包 (Request)

  1. 起始行 (Start Line): 包含方法(GET/POST)、URL、版本号。
  2. 头部 (Headers): 键值对形式,说明元数据(Host, User-Agent, Cookie)。
  3. 空行: 区分头部和正文的界限(非常重要,Wireshark 中能看到 \r\n)。
  4. 正文 (Body): 提交的数据。

下面是一个抓到的post请求包:

1. 起始行 (Start Line)

这一行定义了请求的基本动作和目标。

  • POST /mmtls/00003095 HTTP/1.1\r\n

    • POST: 请求方法,表示向服务器提交数据。

    • /mmtls/00003095: 请求的具体路径(URI)。从路径看,这是在进行 MMTLS 协议握手或数据传输。

    • HTTP/1.1: 使用的 HTTP 版本协议。

    • \r\n: 回车换行符,代表该行结束。


2. 请求头 (Request Headers)

这部分提供了关于客户端环境及请求正文的元数据。

  • Accept: */*\r\n: 告知服务器客户端可以接收任何格式的响应数据。

  • Cache-Control: no-cache\r\n: 强制要求不使用缓存,直接从服务器获取最新数据。

  • Connection: Keep-Alive\r\n: 请求服务器保持 TCP 连接开启,以便后续复用,减少握手开销。

  • Content-Length: 475\r\n : 告知服务器,接下来的"正文"部分长度为 475 字节

  • Content-Type: application/octet-stream\r\n : 表示正文是二进制流数据(通常用于加密内容或文件传输)。

  • Host: 240e:97c:2f:3046::21\r\n: 目标服务器的 IPv6 地址。

  • Upgrade: mmtls\r\n : 这是一个关键头,表示客户端希望将连接协议升级/切换为微信特有的 mmtls 加密协议。

  • User-Agent: MicroMessenger Client\r\n : 客户端标识,说明发送方是微信客户端

  • X-Online-Host: 240e:97c:2f:3046::21\r\n: 一个自定义的扩展头,通常用于代理服务器或 CDN 识别真实的目标主机。


3. 空行 (Empty Line)

  • \r\n

    • 在最后一个请求头(X-Online-Host)之后,有一个完全空白的行。这是 HTTP 协议标准规定的,用于分隔请求头和正文

4. 正文 (Body / Payload)

  • Data (475 bytes)

    • 这部分对应截图最下方的 Data 栏。

    • 由于 Content-Typeapplication/octet-stream,且涉及到 mmtls 协议,这些数据(十六进制显示的 1a 22 50 18...)是经过加密的二进制数据,无法直接通过肉眼读出具体明文内容。


(二) 响应包 (Response)

响应包是对于客户端发来的数据做出的一个处理,格式上与请求包有略微不同

但是总体也是可以分为四个部分

  1. 起始行: 包含版本号、状态码(200, 404, 500)、状态描述。
  2. 头部: 包含 Server, Content-Type, Set-Cookie 等。
  3. 空行: /r/n
  4. 正文: 返回的 HTML、JSON 或图片数据。

下面是一个使用wireshark的HTTP数据包的抓包结果

1. 起始行 (Status Line / Start Line)

图中第一行:HTTP/1.1 200 OK\r\n

  • 版本号: HTTP/1.1

  • 状态码: 200(代表请求成功)。

  • 状态描述: OK

  • 意义: 告诉客户端,服务器已经成功收到了请求并处理完毕。


2. 响应头部 (Response Headers)

Content-LengthCache-Control 的这几行都是头部信息:

  • Content-Length: 22长度字段.告诉浏览器:接下来的正文只有 22 个字节

  • Content-Type: text/plain媒体类型声明。告诉浏览器:这是纯文本,直接显示就行,不需要渲染成网页。

  • Date : 服务器发送响应的时间。不仅是展示,也用于客户端判断缓存是否过期。

  • Connection: close : 连接管理。告诉客户端:这个请求发完我就断开 TCP 连接了,别等了(非持久连接)。

  • Cache-Control :缓存策略。允许客户端把这个测试结果存 30 秒,在这期间不需要重新向服务器发请求。


3. 空行 (Empty Line)

图中那一行孤零零的 \r\n

  • 这就是理论中提到的第三部分。它在响应头部(Headers)和响应正文(Body)之间划清了界限。

  • 在底层传输中,它是两个连续的换行符。没有它,客户端就不知道头部在哪里结束,正文从哪里开始。


4. 响应正文 (Response Body / Entity Body)

对应图中最后两行展开的内容:

  • File Data: 22 bytes:Wireshark 提示这里有 22 字节的数据。

  • Line-based text data : 具体的内容是 Microsoft Connect Test


不过要注意到抓包数据中有显示的使用[ ]包裹的数据,要注意这并不是响应数据包内包含的数据,而是工具的辅助分析的数据,我们在点击对应的行时,不会在右边的字节视图中显示对应的字节序列

http数据包中的数据都是明文传输的,这样也就会带来数据泄露的风险,会被他人窃取.https协议就由此而生.


(三)总结与对比

下面是一个HTTP协议的请求包和响应包的总结与对比:

特性 请求包 (Request) 响应包 (Response)
发送方 客户端 (如浏览器、手机 App) 服务器 (如 Web Server)
接收方 服务器 客户端
第一行 (起始行) 请求行 (Request Line) 示例: GET /index.html HTTP/1.1 状态行 (Status Line) 示例: HTTP/1.1 200 OK
核心组成部分 方法 (Method)、路径 (URI)、版本号 版本号、状态码 (Status Code)、状态描述
常见关键头部 Host, User-Agent, Accept, Cookie Server, Content-Type, Set-Cookie
正文内容 (Body) 通常出现在 POST/PUT 中,包含提交的表单数据或上传的文件 包含服务器返回的数据,如 HTML 源码、JSON 数据、图片等
成功标志 使用正确的 Method (如 GET) 访问有效资源 状态码为 2xx (如 200 OK)
失败标志 4xx (请求错误,如 404) 5xx (服务器错误,如 500)

有关HTTP协议的相关介绍就到这里了,如有纰漏还请指出

相关推荐
Strange_Head4 分钟前
《Linux系统网络协议》用 C 语言写一个最小 HTTP Server 与 Client——网络篇
网络·网络协议·http
KhalilRuan13 分钟前
什么是KCP?QUIC?Websocket?
网络·websocket·网络协议
Arva .1 小时前
RabbitMQ
网络·分布式·rabbitmq
kim_puppy1 小时前
TCP的三次握手,四次挥手
java·网络·tcp
不会写DN1 小时前
让 gRPC 服务同时支持 HTTP/JSON 的gRPC-Gateway
http·json·gateway
Rsun045511 小时前
ConfigurableListableBeanFactory跟ApplicationContext作用
网络·网络协议·rpc
弹简特2 小时前
【JavaSE-网络部分06】TCP 纯高性能优化机制:延迟应答・捎带应答【传输层】
网络·tcp/ip·性能优化·捎带应答·延迟应答
MOYIXIAOWEIWEI2 小时前
VMware-centos7更改静态ip
网络·网络协议·tcp/ip
不会写DN2 小时前
使用 sync.Once 解决 Go 并发场景下的重复下线广播问题
开发语言·网络·golang
南湖北漠3 小时前
记录生活中的一件小事(佚名整理)
网络·人工智能·计算机网络·其他·安全·生活