尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Wireshark HTTP协议分析实验:从抓包到报文拆解与避坑指南

Wireshark HTTP协议分析实验:从抓包到报文拆解与避坑指南 简介这份资源是计算机网络原理课程的Wireshark实验报告面向正在学习HTTP协议、需要完成抓包分析作业的高校学生与网络初学者。报告以访问百度为例完整呈现了从清除浏览器缓存、捕获三次握手到解析请求与响应报文的全过程并逐项拆解请求行、请求头部、空行与请求正文以及状态行、响应头部、响应体等结构同时归纳了Host、User-Agent、Connection、Content-Type、Content-Length等常用头部字段的含义与作用。资源包内共1个docx文档约223KB内容涵盖实验目的、协议基础、报文格式说明与逐帧分析记录可直接作为实验报告模板或复习提纲使用。目前已有9262人学习下载适合需要快速理解HTTP通信流程、掌握Wireshark过滤与报文解读技巧的读者参考借鉴。1. 从一次抓不到三次握手说起Wireshark HTTP 协议分析实验到底在练什么很多人第一次做 Wireshark 抓包实验打开百度抓了一堆包结果翻半天找不到完整的三次握手响应状态码还显示 302 而不是 200 OK最后只能照着别人的实验报告抄一遍交差。问题不在 Wireshark而在动手之前少做了一步——清浏览器缓存。这个实验的核心不是会点开一个包看字段而是让你亲眼看到 HTTP 请求报文和响应报文在 TCP 之上是怎么被封装、怎么被解析的以及请求头、响应头里那些 key-value 到底在协商什么。它适合正在学计算机网络原理、需要交实验报告的学生也适合刚入行、想搞明白浏览器敲个回车背后发生了什么的测试和运维从业者。下面我按自己复现这套实验的流程把抓包环境、过滤表达式、报文逐字段拆解和几个血泪坑一次讲透。2. 抓包前的环境准备WLAN 端口选择、缓存清理与过滤器设置2.1 为什么必须选 WLAN 端口而不是以太网Wireshark 安装后会列出机器上所有可抓包的接口常见的有以太网、WLAN、本地回环Loopback、蓝牙网络连接等。实验要求明确写的是对自己电脑的 WLAN 端口进行抓包原因很直接现在大多数笔记本上网走的是无线网卡如果你选了以太网接口抓到的包数量是 0界面一片空白新手很容易以为软件坏了。判断该选哪个接口有个笨办法但很管用看接口后面的实时流量小曲线哪个在跳动就选哪个。或者先随便选一个打开浏览器刷新一个页面如果 Wireshark 里包在涨说明选对了。选接口时还要注意混杂模式Promiscuous Mode。默认情况下网卡只接收发给自己的帧混杂模式会接收同一网段内所有帧。做本机 HTTP 分析其实不需要开混杂模式因为请求和响应都是本机收发的普通模式就能抓到。开了反而会混入大量无关广播包增加筛选负担。提示如果接口列表里 WLAN 显示为无或者抓不到任何包先确认无线网卡驱动正常、Wireshark 以管理员身份运行Windows 下还需要安装 Npcap 抓包驱动。2.2 清缓存这一步决定了你能不能看到 200 OK这是整个实验里最容易被忽略、后果最严重的一步。浏览器为了加速会把访问过的页面资源缓存在本地。当你第二次访问同一个网址浏览器直接读本地缓存根本不会向服务器发新的 HTTP 请求或者只发一个带 If-Modified-Since 的条件请求服务器回一个 304 Not Modified。更麻烦的是访问百度这类站点。百度首页会做重定向第一次请求往往返回 302把浏览器引导到另一个地址。如果你没清缓存抓到的第一个响应就是 302而不是实验报告里期望的 200 OK三次握手也可能因为连接复用而看不到完整过程。清理方法Chrome 里按 CtrlShiftDelete时间范围选时间不限勾选缓存的图片和文件清除。或者更彻底一点直接用无痕窗口CtrlShiftN做实验无痕模式不读本地缓存每次都是全新请求。清完缓存后先在 Wireshark 里点开始抓包再回到浏览器地址栏输入 www.baidu.com 回车。顺序不能反反了就会漏掉最开始的三次握手。2.3 过滤器怎么写才能只留下 HTTP 流量不做过滤的话一个网页加载会抓出成百上千个包DNS、TCP、TLS、QUIC 全混在一起根本没法分析。Wireshark 的过滤器分两种用途完全不同新手经常搞混过滤器类型写法作用时机典型用途捕获过滤器tcp port 80抓包前设置减少抓到的包总量显示过滤器http抓包后筛选从已抓的包里挑出目标捕获过滤器在开始抓包前填在接口上方的输入框语法是 BPF 语法。显示过滤器在抓包过程中随时可以改语法是 Wireshark 自己的。做这个实验我一般捕获时留空全抓抓完再用显示过滤器http筛出 HTTP 报文。因为如果捕获时就限死tcp port 80三次握手的 SYN、SYN-ACK、ACK 虽然也是 80 端口但 HTTPS 流量走 443 就全丢了而百度现在默认跳 HTTPS你可能一个 HTTP 包都抓不到。这里有个现实问题百度主站现在基本全站 HTTPS直接抓 www.baidu.com 很可能只看到 TLS 握手看不到明文 HTTP。想抓到明文 HTTP 请求报文和响应报文有两个办法一是访问明确支持 HTTP 的站点二是用http显示过滤器碰运气看有没有 80 端口的明文流量。实验报告里给出的例子是访问220.194.118.239/cgi-bin/httpconn这种 IP 直连的 HTTP 地址就是为了绕开 HTTPS。# 显示过滤器常用写法直接粘到 Wireshark 过滤栏 http # 所有 HTTP 报文 http.request.method GET # 只看 GET 请求 http.request.method POST # 只看 POST 请求 http.response.code 200 # 只看 200 响应 tcp.flags.syn 1 # 只看 SYN 包定位三次握手 ip.addr 220.194.118.239 # 只看和某 IP 通信的包逻辑说明http是最粗的筛子先把应用层是 HTTP 的包留下http.request.method和http.response.code是 HTTP 协议解析器提供的字段能精确到方法和状态码tcp.flags.syn 1抓的是 TCP 层标志位用来快速定位连接建立。参数上是精确匹配contains是包含匹配多个条件用与、||或连接。注意显示过滤器区分大小写HTTP和http结果不一样协议名一律小写。3. 逐层拆解一个 HTTP 包从 Frame 到 Hypertext Transfer Protocol3.1 双击一个包之后五层协议栈是怎么排布的在 Wireshark 里双击任意一个 HTTP 包中间那块Packet Details面板会按协议栈从下到上分层展开。实验报告里抓的是分组号 258 的包展开后依次是Frame物理层数据帧概况记录这个包被抓到的时间、长度、接口等元信息不是真实网络传输的字段是 Wireshark 自己加的。Ethernet II数据链路层以太网帧头包含源 MAC、目的 MAC 和类型字段。Internet Protocol Version 4网络层 IP 包头包含源 IP、目的 IP、TTL、协议号等。Transmission Control Protocol传输层 TCP 段头包含源端口、目的端口、序列号、确认号、标志位。Hypertext Transfer Protocol应用层 HTTP 内容这才是我们要分析的重点。这个分层顺序本身就是一份活的协议栈教材。每一层只关心自己的头部上层数据对下层来说就是一段载荷payload。以太网帧的类型字段告诉系统里面装的是 IP 包IP 包的协议号告诉系统里面装的是 TCP 段TCP 的端口号告诉系统里面装的是 HTTP。3.2 HTTP 请求报文的四段结构与逐字段含义HTTP 请求报文固定由四部分组成请求行、请求头部、空行、请求正文。实验报告里给出的 POST 请求实例逐行拆开看POST /cgi-bin/httpconn HTTP/1.1\r\n - 请求行 Host: 220.194.118.239\r\n - 请求头开始 Accept: */*\r\n User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)\r\n Connection: Keep-Alive\r\n Cache-Control: no-cache\r\n Accept-Encoding: gzip, deflate\r\n Content-Type: application/octet-stream\r\n Content-Length: 228\r\n \r\n - 空行请求头结束 - 请求正文228 字节请求行三个部分用空格分隔请求方法POST、请求 URI/cgi-bin/httpconn、协议版本HTTP/1.1。请求方法除了 GET、POST还有 PUT、DELETE、HEAD、OPTIONS 等GET 用于获取资源POST 用于提交数据。请求头是若干关键字值对每行一个冒号后面通常有一个空格。几个关键字段Host告诉服务器要访问哪台主机。一个 IP 上可能托管多个网站靠 Host 区分这是 HTTP/1.1 强制要求的头。User-Agent客户端身份包含浏览器、内核、操作系统版本。服务器据此返回适配的页面。Connection: Keep-Alive请求保持持久连接一次 TCP 连接上跑多个 HTTP 请求省去反复握手。Content-Type和Content-Length描述请求正文的类型和长度POST 请求才有意义。空行是请求头和请求正文的分界绝对不能省。服务器解析时读到空行就知道头部结束了后面全是正文。GET 请求没有正文空行后面直接结束。3.3 HTTP 响应报文的四段结构与状态码分类响应报文同样是四段状态行、响应头部、空行、响应体。实验报告里的响应实例HTTP/1.1 200 OK\r\n - 状态行 Server: httpsf2\r\n - 响应头开始 Connection: Keep-alive\r\n Content-Type: text/octet\r\n Content-Length: 143\r\n \r\n - 空行 - 响应体143 字节 HTML状态行三部分协议版本HTTP/1.1、状态码200、状态码描述OK。状态码是三位数字按首位分类状态码范围含义常见例子100~199信息性状态码100 Continue200~299成功200 OK300~399重定向301 永久移动、302 临时移动、304 未修改400~499客户端错误404 未找到、403 禁止访问500~599服务端错误500 内部错误、502 网关错误响应头里Content-Type告诉浏览器响应体是什么类型text/html就按网页渲染image/png就当图片处理。Content-Length给出响应体字节数浏览器据此知道读到哪里算读完。Server暴露服务器软件类型Set-Cookie用来给客户端种 Cookie。Wireshark 在 HTTP 层还会额外显示一些方括号包起来的信息比如[Time since request: 0.010697000 seconds]表示从请求到响应耗时约 10.7 毫秒[Request in frame: 258]表示这个响应对应的请求在第 258 帧。这些不是报文真实内容是 Wireshark 的关联分析用来快速跳转配对做性能排查时很有用。3.4 用 Follow TCP Stream 还原一次完整会话逐个包看字段适合分析格式但要看一次请求响应的完整对话用 Follow TCP Stream 更高效。在任意 HTTP 包上右键选 Follow → TCP StreamWireshark 会把这条 TCP 连接上的所有数据按方向拼起来客户端发的用红色显示服务器回的用蓝色显示。# Follow TCP Stream 窗口里典型输出简化 GET / HTTP/1.1 Host: www.example.com User-Agent: Mozilla/5.0 ... Accept: text/html HTTP/1.1 200 OK Content-Type: text/html Content-Length: 1256 html.../html逻辑说明这个视图把 TCP 载荷按序拼接去掉了 TCP 头直接呈现应用层数据等于帮你把 HTTP 会话还原成原始文本。参数上窗口底部可以切换方向Entire conversation / 只看某个方向导出时选 Raw 保存原始字节选 ASCII 保存可读文本。提示Follow TCP Stream 依赖 TCP 流重组如果抓包时丢了中间包重组出来的内容会不完整遇到乱码先检查是不是漏包了。4. 请求头与响应头速查哪些字段真正影响你的调试结论4.1 常用请求头从 Host 到 Cookie 的实战意义实验报告列了一长串请求头但真正在调试中天天打交道的就那么几个。我把它们按影响什么重新归类请求头作用调试时的意义Host指定目标主机虚拟主机环境下Host 错了就访问到别的站点User-Agent客户端身份接口测试常改它模拟不同浏览器或爬虫Accept能接受的数据类型返回格式不对时先看这里Accept-Encoding支持的压缩格式响应乱码可能是压缩没解对Cookie携带会话数据登录态、鉴权全靠它Referer来源页面防盗链、来源统计Connection连接管理Keep-Alive 复用连接close 用完就断If-Modified-Since缓存时间配合 304 做协商缓存Host是最容易被忽视又最关键的。用 IP 直连访问时如果 Host 头填的是 IP服务器可能返回默认站点而不是你想要的那个。做接口调试时经常需要手动构造 Host 头来访问同一 IP 上的不同服务。Cookie决定了你的请求是不是已登录状态。抓包分析登录流程时重点看登录请求的响应里Set-Cookie种了什么后续请求的Cookie又带了什么这一来一回就是会话保持的完整链路。4.2 常用响应头Content-Type 与缓存控制响应头里对调试影响最大的是Content-Type和缓存相关字段Content-Type决定浏览器怎么处理响应体。text/html渲染成网页application/json交给 JS 解析application/octet-stream当二进制下载。类型错了页面就显示异常。Content-Length响应体字节数和实际长度对不上会导致截断或挂起。Content-Encoding响应体压缩格式常见 gzip、deflate、br。抓包看到乱码先查这里。Last-Modified和ETag缓存校验用配合请求里的If-Modified-Since和If-None-Match决定返回 200 还是 304。Location配合 3xx 状态码使用告诉浏览器跳转到哪个新地址。302 响应必看这个头。Set-Cookie服务器给客户端种 Cookie登录成功后一般在这里下发会话 ID。Content-Encoding是新手抓包看到乱码的头号原因。响应体被 gzip 压缩过Wireshark 默认不会自动解压你看到的就是一堆二进制。在 Wireshark 偏好设置里可以开启 HTTP 解压或者直接看Content-Encoding字段确认压缩方式。4.3 用 tshark 命令行批量提取头部字段图形界面适合看单个包要批量统计就得靠 tshark它是 Wireshark 的命令行版本装 Wireshark 时自带。# 提取所有 HTTP 请求的方法、Host 和 URI tshark -r capture.pcap -Y http.request \ -T fields -e http.request.method -e http.host -e http.request.uri # 统计各状态码出现次数 tshark -r capture.pcap -Y http.response \ -T fields -e http.response.code | sort | uniq -c # 导出所有请求的 User-Agent tshark -r capture.pcap -Y http.request \ -T fields -e http.user_agent | sort -u逻辑说明-r指定读取的 pcap 文件-Y是显示过滤器和图形界面语法一致-T fields表示按字段输出-e指定要提取的字段名。字段名可以在 Wireshark 图形界面里点中某个字段看状态栏显示的缩写比如http.host、http.request.uri。参数上-Y和图形界面的过滤栏完全等价-T fields配合-e是批量提取的标准组合输出可以直接管道给sort、uniq、awk做统计。做接口回归或者流量审计时这套命令比手点快得多。注意tshark 提取字段时如果某个包没有该字段会输出空行统计前记得过滤掉空行否则计数会偏。5. 避坑与排查五个让实验报告翻车的常见问题5.1 抓不到三次握手现象打开 Wireshark 抓包访问网站过滤tcp.flags.syn 1一个包都没有或者只有零星几个。原因最常见的是没清缓存浏览器复用了已有连接没有新建 TCP 连接自然没有握手其次是抓包接口选错选到了没流量的以太网口还有一种情况是访问的站点走 HTTP/3QUIC底层是 UDP 不是 TCPSYN 包当然抓不到。解决先清缓存或用无痕窗口确认抓包接口的流量曲线在跳访问明确走 TCP 的 HTTP 站点。如果目标站点支持 QUIC在浏览器里禁用 QUIC 或者换个只走 TCP 的地址。5.2 状态码是 302 不是 200现象响应报文状态行显示HTTP/1.1 302 Found实验报告要求分析 200 OK对不上。原因访问的 URL 做了重定向服务器让你去另一个地址。百度这类站点首页经常 302 跳到带参数的地址或者 HTTPS 地址。解决顺着Location响应头里的地址再访问一次或者直接在浏览器里访问重定向后的最终地址。也可以接受 302 作为分析对象重点讲清楚Location头的作用这本身就是个很好的分析点。5.3 响应体显示乱码现象展开 HTTP 层响应体是一堆看不懂的二进制字符。原因响应被 gzip 或 br 压缩了Wireshark 默认不自动解压。看响应头里的Content-Encoding字段能确认。解决在 Wireshark 的 Edit → Preferences → Protocols → HTTP 里把解压相关选项打开或者用 Follow TCP Stream 时选 Raw 导出再用外部工具解压。分析文本内容时优先找没有压缩的响应。5.4 只看到 HTTPS 看不到明文 HTTP现象过滤http一个包都没有全是 TLS 或者 TCP。原因现在绝大多数网站默认 HTTPSHTTP 流量走 443 端口且被 TLS 加密Wireshark 看不到明文。解决找明确支持 HTTP 的测试地址或者用实验报告里那种 IP 直连的 HTTP 接口。如果一定要分析 HTTPS需要配置 SSLKEYLOGFILE 环境变量导出会话密钥让 Wireshark 解密但这超出本实验范围。5.5 包太多找不到目标请求现象抓了一大堆包翻半天找不到自己要分析的那条 HTTP 请求。原因没做过滤DNS、TCP、其他应用的流量全混在一起。解决用显示过滤器逐步缩小范围。先http筛出 HTTP 报文再http.request.method GET或按 Host 过滤。如果知道目标 IP直接ip.addr x.x.x.x http。定位到目标包后右键 Follow TCP Stream 看完整会话。6. 进阶技巧用 IO Graph 和着色规则把 HTTP 分析做成一页纸前面讲的都是单包分析真正让实验报告出彩的是把整段抓包数据可视化。Wireshark 自带的 IO Graph 和着色规则能把一次访问的流量特征压缩成一张图比堆字段截图有说服力得多。先说 IO Graph。在 Statistics → I/O Graph 打开默认画的是所有包的时间-数量曲线。做 HTTP 分析时我一般加两条线一条过滤http.request看请求密度一条过滤http.response看响应密度。两条线之间的水平间距就是请求响应延迟间距突然拉大的地方就是性能瓶颈。Y 轴单位可以切成 Bytes看的是吞吐量而不是包数分析大文件下载时更有意义。# IO Graph 里可以填的过滤表达式 http.request # 请求曲线 http.response # 响应曲线 http.response.code 400 # 错误响应曲线一眼看出哪里出错 tcp.analysis.retransmission # 重传曲线判断网络质量逻辑说明IO Graph 的每条曲线本质是一个显示过滤器加一个统计函数横轴是时间纵轴是包数或字节数。参数上Interval 控制采样间隔默认 1 秒抓包时间短可以调到 100 毫秒看细节Y Axis 选 Packets 还是 Bytes 取决于你要看频率还是看流量。再说着色规则。Wireshark 默认给不同协议上了不同颜色但 HTTP 分析可以自定义规则让关键包跳出来。View → Coloring Rules 里加一条过滤http.response.code 400背景设成红色这样所有错误响应在包列表里一眼可见。再加一条http.request.method POST设成黄色提交类请求就不会被淹没在 GET 里。最后是导出。实验报告不需要贴几十张截图用 File → Export Specified Packets 把过滤后的包单独存成一个 pcap附在报告里别人用 Wireshark 打开就能复现你的分析过程。再配一张 IO Graph 截图和一张 Follow TCP Stream 的文本一页纸就能把一次 HTTP 会话讲清楚。我自己的习惯是每次做完抓包分析先存原始 pcap再存一份过滤后的 pcap最后把关键字段用 tshark 导成文本贴进报告。这样即使别人没有 Wireshark看文本也能理解报文结构。从那以后我每次做协议分析实验都强制走一遍清缓存 → 选对接口 → 抓包 → 过滤 → 导出这五步再也没出现过抓不到握手或者状态码对不上的情况。希望帮到你。本文还有配套的精品资源点击获取
返回列表