简介这份资源是计算机网络原理课程的Wireshark实验报告面向正在学习HTTP协议、需要完成抓包分析作业的高校学生与网络初学者。报告以访问百度为例完整呈现了从清除浏览器缓存、捕获三次握手到解析请求与响应报文的全过程并逐项拆解请求行、请求头部、空行与请求正文以及状态行、响应头部、响应体等结构同时归纳了Host、User-Agent、Connection、Content-Type、Content-Length等常用首部字段的含义与作用。资源包内含1个docx文档压缩后约223KB体积轻便便于直接查阅与二次整理。目前已有9262人学习下载说明其在同类实验报告中具有较高的参考价值。读者可借此快速理解HTTP请求/响应模型、状态码分类及TCP/IP分层抓包思路为网络调试、性能优化与安全分析打下基础也适合作为实验报告撰写的模板与排错参考。1. 从一次 302 说起Wireshark 抓 HTTP 到底在抓什么很多人第一次用 Wireshark 抓 HTTP打开浏览器访问百度抓完一看响应码是 302不是课本上写的 200 OK于是开始怀疑自己是不是抓错了端口、选错了网卡。其实这不是抓包翻车而是浏览器缓存和 HSTS 在起作用——你访问的www.baidu.com被本地缓存或强制跳转接管了真正的 HTTP 请求根本没发出去或者发出去的是跳转指令。这份实验报告资源解决的正是这个问题它用 Wireshark 对 WLAN 端口抓包完整走一遍访问网站的过程把 HTTP 请求报文和响应报文的每一层结构拆开给你看从 Frame 物理层一路看到 Hypertext Transfer Protocol 应用层。适合正在做计算机网络原理实验的学生也适合想搞懂 HTTP 协议真实报文长什么样的网络测试从业者。关键词就三个Wireshark、HTTP 协议、网络协议分析但要把它们串起来得先过缓存这一关。2. 抓包前的环境准备WLAN 端口选择与缓存清理2.1 为什么必须选 WLAN 而不是以太网Wireshark 安装完之后接口列表里会列出所有网卡。如果你用的是笔记本连 Wi-Fi要抓的是无线网卡对应的接口通常名字里带 WLAN 或 Wi-Fi。选错接口的后果是抓到的包全是本地回环或者干脆一片空白。常见做法是打开 Wireshark 后先看接口列表的实时流量波形哪个有波动就选哪个。如果用的是有线连接那就选以太网接口但实验报告里明确要求对 WLAN 端口抓包所以无线网卡是首选。选好接口后不要急着点开始先做两件事一是关闭其他占用网络的程序比如正在同步的网盘、后台更新的软件否则抓到的包会混入大量无关流量二是确认 Wireshark 的捕获过滤器留空先抓全量后面再用显示过滤器筛 HTTP。捕获过滤器写tcp port 80虽然能减少噪音但会漏掉三次握手的前两个包对分析完整流程不利。2.2 清缓存这一步省不得实验报告里有一句血泪经验第一步应当是清除浏览器缓存否则看不到完整的三次握手响应报文的状态码也会是 302 而不是 200 OK。原因在于浏览器访问过的资源会存在本地缓存里再次访问时直接读缓存根本不发 HTTP 请求即使发了服务器也可能返回 302 重定向到 HTTPS 或者别的地址。清缓存的操作因浏览器而异Chrome 里是CtrlShiftDelete勾选缓存的图片和文件时间范围选全部。更彻底的做法是开一个无痕窗口无痕模式默认不读本地缓存但注意无痕模式仍然可能受 HSTS 影响。提示如果清了缓存还是 302检查一下地址栏是不是自动跳到了 HTTPS。HTTP 实验要访问的是http://开头的地址不是https://。2.3 启动抓包并触发 HTTP 请求环境准备好之后操作顺序很关键# 第一步在 Wireshark 里选中 WLAN 接口点击开始捕获 # 第二步切换到浏览器输入 http://www.baidu.com 并回车 # 第三步页面加载完成后回到 Wireshark 点击停止捕获 # 第四步在显示过滤器栏输入 http回车筛选这四步看起来简单但顺序错了就白抓。必须先开捕获再访问网站否则请求已经发完了你才开始抓什么都看不到。停止捕获的时机也要注意等页面完全加载完再停不然响应体可能还没传完。筛选用的显示过滤器http是 Wireshark 内置的协议过滤器输入后只会显示 HTTP 协议的包TCP 握手包和 TLS 包会被隐藏。如果想看完整的 TCP 三次握手把过滤器清空找到第一个 SYN 包右键选择 Follow TCP Stream就能看到这条 TCP 连接上的所有数据。3. 逐层拆解 HTTP 报文从 Frame 到 Hypertext Transfer Protocol3.1 双击第 258 号分组看到了什么实验报告里双击的是分组号 258 的那条记录弹出的窗口按协议层次展开从上到下依次是层次协议含义物理层Frame数据帧概况包含帧编号、捕获时间、帧长度数据链路层Ethernet II以太网帧头部包含源 MAC 和目的 MAC网络层Internet Protocol Version 4IP 包头包含源 IP 和目的 IP传输层Transmission Control ProtocolTCP 段头包含源端口、目的端口、序列号应用层Hypertext Transfer ProtocolHTTP 报文内容这个层次结构不是 Wireshark 随便排的它严格对应 TCP/IP 四层模型。Frame 是 Wireshark 自己加的用来描述这个包的物理属性Ethernet II 是链路层封装IP 层负责寻址和路由TCP 层负责可靠传输HTTP 层才是应用真正关心的内容。每一层都包裹着上一层的数据这就是封装。理解了这个结构再看 HTTP 报文就不会觉得它是一团乱码了。3.2 请求报文的三段式结构HTTP 请求报文的固定格式分三部分请求行、请求头部、空行可选部分请求正文。实验报告里给出的请求报文实例是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 /cgi-bin/httpconn HTTP/1.1是请求行三个字段用空格分隔——请求方法 POST、请求 URI/cgi-bin/httpconn、协议版本 HTTP/1.1。接下来的每一行都是关键字: 值对这是请求头部。Host告诉服务器要访问哪台主机User-Agent携带浏览器和操作系统信息Connection: Keep-Alive表示使用持久连接Content-Length: 228说明请求正文有 228 字节。最后那个空行\r\n是分隔符空行之后就是请求正文。GET 请求没有正文所以空行之后直接结束POST 请求的正文就是提交的数据。3.3 响应报文的四段式结构响应报文比请求报文多一段格式是状态行、响应头部、空行、响应体。实验报告里的响应报文实例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 字节]状态行HTTP/1.1 200 OK同样三个字段协议版本、状态码、状态码描述。状态码是三位数字200 到 299 表示成功300 到 399 表示重定向400 到 499 表示客户端出错500 到 599 表示服务端出错。实验报告里特别提到HTTP/1.1 引入了 100 到 199 的信息性状态码。响应头部里的Content-Type告诉浏览器返回的数据是什么类型Content-Length告诉浏览器数据有多大。空行之后是响应体通常是一段 HTML、图片或其他资源。3.4 用 Python 解析原始报文如果想脱离 Wireshark 自己解析 HTTP 报文可以用 Python 的 socket 模块手动构造和解析。下面这段代码演示了如何发送一个 GET 请求并打印响应import socket # 构造 HTTP 请求报文 request_line GET / HTTP/1.1\r\n headers Host: www.baidu.com\r\nConnection: close\r\n\r\n request request_line headers # 建立 TCP 连接并发送请求 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.connect((www.baidu.com, 80)) s.sendall(request.encode()) # 接收响应数据 response b while True: chunk s.recv(4096) if not chunk: break response chunk # 分离响应头和响应体 header_part, _, body_part response.partition(b\r\n\r\n) print( 响应头 ) print(header_part.decode(errorsignore)) print( 响应体长度 ) print(len(body_part))这段代码的逻辑是先拼出请求行和请求头注意Connection: close告诉服务器发完就关连接这样recv才能读到 EOF 退出循环。partition(b\r\n\r\n)用空行把响应头和响应体切开前半部分是状态行加响应头后半部分是响应体。参数方面端口 80 是 HTTP 默认端口如果访问 HTTPS 要改成 443 并加 SSL 包装。这段代码跑出来的结果可以和 Wireshark 抓到的包对照验证你对报文结构的理解是否正确。4. 请求头与响应头哪些字段真正影响行为4.1 常用请求头的实际作用实验报告列了一长串请求头但真正影响服务器行为的没几个。Host是 HTTP/1.1 里唯一 mandatory 的请求头没有它服务器不知道你要访问哪个虚拟主机。User-Agent决定服务器返回桌面版还是移动版页面用浏览器开发者工具改成手机 UA 就能看到不同结果。Accept-Encoding告诉服务器支持哪种压缩格式服务器如果返回Content-Encoding: gzipWireshark 里看到的响应体是压缩后的二进制需要导出后解压才能读。Cookie是身份凭证服务器靠它识别用户会话抓包时能看到明文 Cookie 说明没用 HTTPS这也是为什么登录操作必须走 HTTPS。Connection头控制连接是否复用Keep-Alive表示请求完不关连接后续请求复用同一条 TCP 连接减少握手开销。Cache-Control: no-cache不是不缓存而是每次使用缓存前必须向服务器验证。Pragma头在实验报告里提到一般仅用于开发模式这个说法是准确的它和Cache-Control功能重叠现代浏览器优先认后者。4.2 常用响应头的排查价值响应头里对调试最有用的几个Content-Type决定浏览器怎么渲染响应体如果服务器返回text/html但浏览器下载了文件说明 MIME 类型配错了。Content-Length和实际收到的字节数对不上说明传输被截断。Location配合 302 状态码使用告诉你重定向到了哪个地址实验里遇到 302 时看这个头就知道跳去哪了。Set-Cookie是服务器给浏览器种 Cookie抓包时能看到 Cookie 的 name、value、domain、path、过期时间。Last-Modified和If-Modified-Since配合实现缓存验证浏览器第二次请求同一资源时带上If-Modified-Since服务器比对后如果没变化就返回 304不传响应体省带宽。4.3 用显示过滤器精准定位报文Wireshark 的显示过滤器是分析 HTTP 的核心技能。常用的几个# 只看 HTTP 请求 http.request # 只看 HTTP 响应 http.response # 按请求方法筛选 http.request.method POST # 按状态码筛选 http.response.code 200 # 按主机名筛选 http.host www.baidu.com # 按 URI 筛选 http.request.uri contains cgi-bin # 组合条件只看百度的 GET 请求 http.host www.baidu.com http.request.method GET这些过滤器的参数含义很直白http.request.method对应请求行里的方法字段http.response.code对应状态行里的状态码http.host对应 Host 请求头。组合用表示与||表示或。实际排查时先抓全量再用过滤器缩小范围比一开始就设捕获过滤器灵活得多。如果过滤器写错了Wireshark 的过滤栏会变红鼠标悬停能看到错误提示。5. 避坑与排查五个让实验翻车的细节5.1 抓不到包或包列表为空现象点了开始捕获浏览器也访问了网站但 Wireshark 里一条记录都没有。原因通常是选错了网卡接口或者捕获过滤器写得太严把包全滤掉了。解决停止捕获重新选接口看接口列表里哪个有流量波形检查捕获过滤器是否为空不确定就清空重来。5.2 响应码是 302 不是 200现象清缓存后访问百度响应码仍然是 302。原因有两个一是浏览器地址栏自动把http://跳成了https://二是 HSTS 策略强制跳转。解决手动输入完整的http://www.baidu.com不要只输www.baidu.com如果还不行换一个明确支持 HTTP 的网站比如http://example.com或者学校的内网地址。5.3 看不到三次握手现象筛选http后只看到 HTTP 请求和响应看不到 SYN、SYN-ACK、ACK。原因显示过滤器http把 TCP 包过滤掉了。解决清空过滤器找到第一个 HTTP 请求包右键选择 Follow TCP StreamWireshark 会自动关联这条 TCP 连接上的所有包包括握手和挥手。5.4 响应体是乱码现象展开 HTTP 响应报文响应体显示为乱码或二进制。原因服务器返回了压缩内容Content-Encoding是gzip或deflateWireshark 默认不解压。解决在 Wireshark 偏好设置里找到 Protocols → HTTP勾选 Uncompress entity bodies重启捕获后响应体会自动解压。或者导出原始数据用gzip -d手动解压。5.5 时间戳不是北京时间现象Wireshark 的 Time 列显示的是 UTC 时间和本地时间差 8 小时。原因Wireshark 默认用 UTC 显示时间戳。解决View → Time Display Format → Time of Day然后在 Preferences → Appearance → Columns 里确认时间列格式。这个不影响协议分析但写实验报告时时间对不上会很尴尬。6. 进阶技巧用 tshark 批量提取 HTTP 字段Wireshark 图形界面适合交互式分析但如果要批量处理抓包文件、提取特定字段做统计命令行工具tshark更高效。它随 Wireshark 一起安装在终端里直接调用。下面这条命令从抓包文件里提取所有 HTTP 请求的方法、主机和 URItshark -r capture.pcap -Y http.request \ -T fields \ -e http.request.method \ -e http.host \ -e http.request.uri \ -E separator,参数逐个解释-r capture.pcap指定读取的抓包文件-Y http.request是显示过滤器只处理 HTTP 请求-T fields表示输出为字段模式-e后面跟字段名每个-e提取一列-E separator,指定列分隔符为逗号方便导入表格。跑出来的结果类似GET,www.baidu.com,/ GET,www.baidu.com,/favicon.ico POST,220.194.118.239,/cgi-bin/httpconn如果要统计每个状态码出现的次数把过滤器改成http.response提取http.response.code再用sort | uniq -c管道处理tshark -r capture.pcap -Y http.response \ -T fields -e http.response.code | sort | uniq -c | sort -rn这条命令的输出会按出现次数从高到低排列状态码一眼就能看出这次抓包里有多少 200、多少 302、多少 404。做实验报告时这种统计比逐个包翻看效率高得多。我一般会在图形界面里定位到关键包然后用 tshark 批量导出字段做汇总两边对照既不会漏细节也能快速出结论。还有一个实用技巧是导出特定 TCP 流的原始数据。在 Wireshark 里选中一个 HTTP 包Follow TCP Stream 之后左下角有个 Save as 按钮能把这条流的所有数据存成二进制文件。如果响应体是图片或压缩包存下来直接就能用。命令行等价操作是tshark -r capture.pcap -Y tcp.stream eq 0 \ -T fields -e data.data | tr -d \n | xxd -r -p stream0.bin这里tcp.stream eq 0指定第一条 TCP 流-e data.data提取数据字段tr -d \n去掉换行xxd -r -p把十六进制转回二进制。这条命令的坑在于如果流里有多个数据段data.data会分多行输出必须先拼在一起再转换否则得到的文件是碎的。从那以后我每次导出 TCP 流都强制走一遍xxd -r -p验证文件头确认不是半截数据才敢用。希望帮到你。本文还有配套的精品资源点击获取