
简介这是一份面向计算机网络课程学习者与实验备考学生的Wireshark HTTP协议分析实验报告围绕抓包工具的实际使用与协议报文解析展开适合正在完成课程实验、准备网络原理考核或希望夯实应用层协议基础的读者。压缩包内共1个docx文档约223KB内容以实验步骤、报文截图与逐字段分析为主结构紧凑便于直接参考。报告完整呈现了访问百度时的抓包过程涵盖清除浏览器缓存以观察完整三次握手、请求报文与响应报文的固定格式、请求行与状态行组成、常用请求头与响应头含义以及POST请求与200 OK响应的逐字段解读并对比302重定向等状态码差异。目前已有9262人学习下载可作为实验报告撰写模板与HTTP协议复习笔记使用。1. 从一次「网页明明能开报告却写不出来」说起Wireshark 抓包做 HTTP 协议分析几乎是每门计算机网络课都绕不开的实验。标题里这几个词——Wireshark、HTTP 协议、协议分析、实验报告——看着简单真动手时翻车的人一大片抓到的包全是 TCP 重传和乱序HTTP 请求一条都看不见或者抓是抓到了但报告里除了贴几张截图讲不出请求行、状态码、首部字段到底说明了什么。这个实验真正要练的不是「会点开始按钮」而是能从一串原始字节里读出 HTTP 的报文结构、请求响应流程和连接行为并且把结论写成别人能复现的分析。这篇笔记面向三类人第一次做这个实验、需要一份能照着跑通的步骤做过但报告写得虚、想补上参数和判据的以及想把这套抓包分析方法迁移到排查真实接口问题的。我会按「环境准备 → 抓包 → 报文逐层拆解 → 连接与缓存行为 → 排错」的顺序讲每个环节给出可抄的命令、过滤表达式和判据。工具版本以你本机安装的为准Wireshark 官网下载安装即可不绑定具体版本号。抓包分析这件事玄学不多坑基本都在过滤器和时间戳上下面逐个说清。2. 环境准备与抓包前的三个关键设置2.1 选对网卡别在错误的接口上守株待兔Wireshark 安装完成后第一件事是选接口。很多人打开软件直接点最上面那个接口就开始抓结果一个 HTTP 包都没有——因为流量根本没走那块网卡。判断方法很简单先看本机默认路由走哪个网卡再抓那个。Windows 上用ipconfigLinux/macOS 上用ip route或ifconfig找到有默认网关的那块。有线网卡通常叫eth0、en0、以太网无线叫wlan0、Wi-Fi。如果你用的是虚拟机做实验注意抓包位置抓宿主机物理网卡看到的是虚拟网卡桥接后的流量抓虚拟机内部网卡看到的才是虚拟机自己的流量两者视角不同报告里要写清楚。提示抓本机访问本机比如本地起的 Web 服务的流量物理网卡上往往抓不到因为流量走的是 loopback。Windows 上需要装 Npcap 时勾选回环支持Linux 直接抓lo接口。2.2 抓包过滤器与显示过滤器别混用这是新手最容易翻车的地方。Wireshark 有两套语法完全不同的过滤器类型位置语法示例作用时机抓包过滤器 BPF捕获选项里tcp port 80抓之前决定哪些包被记录显示过滤器顶部过滤栏http抓之后决定哪些包被显示抓包过滤器用的是 BPF 语法写错了直接抓不到东西显示过滤器写错了只是过滤栏变红。做 HTTP 实验我一般抓包时用tcp port 80先把范围缩小避免抓到一堆无关流量把缓冲区冲爆抓完再用显示过滤器精挑。# 抓包过滤器BPF 语法填在 Capture Options 的输入框 tcp port 80 # 如果要同时抓 HTTPS 的握手可以放宽到 tcp port 80 or tcp port 443逻辑说明tcp port 80表示只记录 TCP 且源或目的端口为 80 的报文。HTTP 明文默认走 80所以这一条足够覆盖绝大多数实验场景。参数上port可以换成host 目标IP来锁定某台服务器多个条件用and、or连接。注意 BPF 里没有http这个关键字那是显示过滤器的东西写进抓包过滤器会报语法错误。2.3 时间戳改成可读格式报告才讲得清时序默认时间列是「距第一个包的秒数」做时序分析时反而不直观。建议改成绝对时间菜单 View → Time Display Format → Time of Day或 Date and Time of Day。这样报告里写「14:32:07 发出请求14:32:07.083 收到响应」比写「第 0.083 秒」清楚得多。另外打开 View → Name Resolution把「Resolve Network Addresses」关掉。开着的话 Wireshark 会尝试反查 DNS抓包时可能引入额外流量还会让 IP 显示成域名干扰你判断真实的目标地址。做协议分析要的是原始 IP不是解析后的名字。注意如果你在报告里需要展示北京时间Wireshark 默认按系统时区显示确认系统时区正确即可不需要额外装插件。网上有些教程让你改注册表或装扩展多数场景没必要。3. 抓一次完整的 HTTP 请求响应从过滤到定位3.1 用显示过滤器把 HTTP 报文捞出来抓完一段流量后过滤栏输入http回车。Wireshark 会把所有被识别为 HTTP 的报文列出来。如果一条都没有先别急着怀疑人生按这个顺序排查第一确认你访问的是 http:// 而不是 https://。现在大量网站默认跳 HTTPS浏览器地址栏有小锁头就说明是加密流量Wireshark 只能看到 TLS 握手看不到 HTTP 内容。做实验要找一个明确支持明文的站点或者自己在本机起一个简单的 HTTP 服务。第二确认端口。有些服务跑在 8080、8000 等非标准端口http过滤器默认只认 80 等标准端口。这种情况用tcp.port 8080先看原始 TCP再右键报文选 Decode As → HTTP 强制解码。第三确认抓包过滤器没把包滤掉。回到 2.2 检查。3.2 用本机服务做一次可控实验依赖外部网站做实验有个问题你控制不了服务器行为也复现不了。更稳的做法是在本机起一个 HTTP 服务用 curl 发请求全程可控。# 用 Python 起一个最简单的 HTTP 服务监听 8000 端口 python3 -m http.server 8000 # 另开一个终端发一次请求 curl -v http://127.0.0.1:8000/逻辑说明python3 -m http.server 8000会在当前目录起一个静态文件服务任何 GET 请求都会返回目录列表或文件内容。curl -v的-v打开详细模式终端里会打印出请求行、请求头和响应头和 Wireshark 里抓到的内容一一对应方便对照。参数说明端口 8000 可以换成任意未占用端口但换了之后 Wireshark 的显示过滤器也要跟着改用tcp.port 8000。如果抓 loopback 抓不到参考 2.1 的提示确认回环支持已开启。3.3 在报文详情里逐层读结构选中一条 HTTP 请求报文下方详情面板会按协议栈分层展开。做 HTTP 分析重点看三层Frame / Ethernet物理帧信息看帧长度、源 MAC、目的 MAC。报告里如果要写「该请求帧共 XX 字节」数据从这里取。IP看源 IP、目的 IP、TTL。TTL 能粗略反映经过了多少跳实验里一般不用深究但写报告时提一句体现你看了。TCP看源端口、目的端口、序号、确认号、标志位。HTTP 建立在 TCP 之上理解请求响应必须先看懂 TCP 这一层。标志位里PSH, ACK表示这是携带数据的报文SYN是连接建立FIN是连接关闭。HTTP这才是主角。展开后能看到请求方法、URL、协议版本、各个首部字段。Wireshark 会把首部字段名和值分列显示鼠标悬停还能看到字段含义的简要说明。提示右键任意报文 → Follow → TCP Stream能把整条 TCP 连接上的所有数据拼成一个可读的会话窗口请求和响应交替显示做报告截图时比单条报文更直观。但注意这个窗口里显示的是重组后的应用层数据看不到 TCP 首部两者要配合看。3.4 请求行、状态行、首部字段的判读要点一条典型的 HTTP 请求长这样GET /index.html HTTP/1.1 Host: 127.0.0.1:8000 User-Agent: curl/8.4.0 Accept: */*请求行三段方法GET、请求目标/index.html、协议版本HTTP/1.1。方法里 GET 和 POST 是实验最常考的GET 把参数放 URLPOST 放请求体。协议版本决定连接行为1.1 默认长连接1.0 默认短连接这一点在分析连接复用时会用到。响应长这样HTTP/1.1 200 OK Server: SimpleHTTP/0.6 Python/3.11 Date: ... Content-type: text/html Content-Length: 1234状态行三段协议版本、状态码、原因短语。状态码要能说出类别1xx 信息、2xx 成功、3xx 重定向、4xx 客户端错误、5xx 服务端错误。实验里常见的是 200、304、404。304 是协商缓存命中这个在下一章展开。首部字段里Host是 HTTP/1.1 强制要求的用于虚拟主机区分Content-Length和Content-Type描述响应体Connection: keep-alive或close直接决定连接是否复用。报告里挑三到五个字段解释清楚比把所有字段抄一遍有价值。4. 连接行为与缓存把「看得见的包」讲成「说得清的原理」4.1 用 TCP 流看长连接与短连接的区别HTTP/1.1 默认长连接一次 TCP 握手后可以发多个请求。验证方法在浏览器里打开一个含多张图片的页面抓包后用http过滤观察是不是只有一对 SYN/ACK 握手后面跟着多条 HTTP 请求复用同一个 TCP 连接。对比实验用curl --http1.0强制 HTTP/1.0 发两次请求会看到两次独立的 TCP 三次握手。这个对比写进报告比单纯描述「HTTP/1.1 支持长连接」有说服力得多。# 强制 HTTP/1.0观察短连接行为 curl --http1.0 -v http://127.0.0.1:8000/ /dev/null curl --http1.0 -v http://127.0.0.1:8000/ /dev/null逻辑说明两次独立调用 curl每次都会新建 TCP 连接。抓包时用tcp.port 8000过滤数一数 SYN 报文出现了几次就能直观看到短连接的开销。参数--http1.0是关键不加的话 curl 默认用 1.1会复用连接实验现象就不明显了。4.2 304 状态码与协商缓存怎么抓304 Not Modified 是 HTTP 缓存机制的核心现象也是实验报告里容易出彩的点。复现步骤第一次请求资源服务器返回 200 并带上Last-Modified或ETag。第二次请求同一资源浏览器或 curl带上If-Modified-Since或If-None-Match服务器判断资源没变返回 304 且不带响应体。# 第一次请求记录响应头里的 ETag 或 Last-Modified curl -v http://127.0.0.1:8000/ 21 | grep -i -E etag|last-modified # 第二次带上条件请求头 curl -v -H If-Modified-Since: 上一步的时间 http://127.0.0.1:8000/逻辑说明-H手动注入条件请求头模拟浏览器的缓存协商行为。服务器如果支持会返回 304。注意 Python 自带的 http.server 对条件请求支持有限可能一直返回 200这时候换一个支持缓存的服务器比如 nginx或者用真实网站做对比实验。参数说明If-Modified-Since的值必须是合法的 HTTP 日期格式直接从第一次响应的Last-Modified复制即可。If-None-Match对应ETag优先级更高。报告里把两次请求的报文并排贴出来标出差异字段就是一份合格的分析。4.3 用统计功能给报告加一张有信息量的图Wireshark 的 Statistics 菜单里有几个做报告很好用的功能Statistics → HTTP → Requests会按请求方法、主机、URI 汇总直接给出请求分布表。Statistics → Conversations按 TCP 会话列出每条连接的包数、字节数、持续时间用来证明长连接复用了多少数据非常直观。Statistics → Flow Graph能生成时序图展示请求响应的时间关系。这些图比随手截的报文列表更能体现你理解了流量结构。报告里放一张 Conversations 表配一句「本次实验共 X 条 TCP 连接其中 Y 条承载了多个 HTTP 请求验证了 HTTP/1.1 的长连接特性」比空谈原理强。注意Flow Graph 生成的是基于当前过滤结果的图生成前先确认过滤栏里的条件是你想要的否则图里会混入无关流量。5. 避坑与排查五个高频翻车现场5.1 抓不到 HTTP只有 TCP 和 TLS现象过滤栏输入http一条不显示但tcp能看到大量报文且端口是 443。原因访问的是 HTTPS 站点HTTP 内容被 TLS 加密Wireshark 无法解密应用层。解决换用明文 HTTP 站点或本机起 HTTP 服务。如果实验必须分析 HTTPS那属于 TLS 分析范畴需要配置密钥日志超出本实验范围报告里说明清楚即可不要硬套 HTTP 分析结论。5.2 报文乱序、重传一大堆HTTP 请求被淹没现象抓到的包里大量TCP Retransmission、TCP Out-of-Order找一条完整 HTTP 请求很费劲。原因抓包位置不对比如抓了镜像口但镜像配置有问题或者网络本身拥塞或者抓的是无线网卡且信号差。解决优先抓本机回环或本机与网关之间的流量减少中间环节。用显示过滤器http直接跳过 TCP 层噪声。如果重传确实很多报告里可以作为一个观察点写进去但不要把它当成 HTTP 分析的主体。5.3 显示过滤器写对了却提示语法错误现象过滤栏输入http and ip.addr 192.168.1.1变红。原因多半是空格或运算符问题。Wireshark 显示过滤器里和eq等价但and两边要有空格ip.addr是合法字段写成ipaddr就错。解决用过滤栏右侧的「Expression」按钮可视化构造避免手写拼错。常见合法写法http.request.method GET、http.response.code 304、tcp.port 8000。5.4 时间列显示成奇怪的大数字现象时间列不是秒数也不是可读时间而是一串很大的值。原因时间显示格式被设成了「Seconds Since Epoch」或类似格式。解决View → Time Display Format 里改回 Time of Day 或 Seconds Since Beginning of Capture。做时序对比用后者写绝对时间用前者。5.5 报告里只有截图没有分析现象报告交上去被批「只是截图堆砌」。原因没有把报文里的字段和 HTTP 协议规范对应起来。解决每贴一张截图配一段文字说明「这条报文的请求方法是 X协议版本是 Y首部字段 Z 的作用是……它体现了 HTTP 的某某特性」。截图是证据分析才是结论。判据要具体到字段值不要写「可以看到请求正常」这种废话。6. 把实验做深从单次抓包到可复用的分析方法做完基本流程后如果想把这个实验做出区分度我一般会加两件事。第一件是构造异常场景做对比。正常请求谁都会抓但 404、500、重定向 301/302 这些状态码背后的报文差异才是真正考验理解的地方。用本机服务故意请求一个不存在的路径抓 404 响应对比 200 响应的首部字段差异——404 通常没有Content-Length对应的实体内容或者实体是错误页面。再手动构造一个 302 跳转观察Location首部如何指示浏览器发起第二次请求。这些对比写进报告深度立刻不一样。第二件是把过滤表达式整理成一张自己的速查表。下面这几个是我做 HTTP 分析时用得最多的目的显示过滤器只看 HTTP 请求http.request只看 GET 请求http.request.method GET只看某个状态码http.response.code 304看某个 Host 的流量http.host contains example看含特定首部的报文http.header contains If-Modified-Since按 TCP 端口锁定tcp.port 8000这张表建议自己敲一遍比背下来管用。过滤器的价值在于快速缩小范围范围越小你越容易注意到异常字段。最后一个习惯每次抓包前先想清楚「我要验证什么」带着问题抓而不是抓完一堆再想分析什么。我早期做实验就是先抓一大坨然后对着几千条报文发呆最后只能挑几条顺眼的截图交差。后来改成先写下一句假设比如「HTTP/1.1 会复用 TCP 连接」再去抓包验证效率完全不一样。抓包分析的本质是验证假设不是收集数据。希望帮到你。本文还有配套的精品资源点击获取