简介这份资源是西北工业大学软件学院计算机网络课程的实验报告面向正在学习计算机网络、需要完成HTTP协议实验的高校学生与自学者。报告围绕Wireshark抓包分析展开覆盖HTTP基础GET/响应交互、条件GET与缓存机制、长文档检索以及含嵌入对象的HTML文档四个实验逐一记录请求方法、HTTP版本、可接受语言、IP地址、状态码、内容字节数等关键字段的观察结果并给出对IF-MODIFIED-SINCE、304状态码与分块传输等知识点的分析。资源包内含1个doc文档大小约6.62MB结构完整、条理清晰可直接作为实验参考与复习材料。目前已有1647人学习下载适合用来对照实验步骤、理解HTTP请求响应构建过程、掌握缓存策略与数据包分析技巧对网络编程、网站开发及网络安全分析等方向均有帮助。1. 西北工业大学软件学院计算机网络实验报告从抓包到 socket 编程一套能跑通的实验链路西工大软件学院的计算机网络实验通常不是让你背 OSI 七层模型而是直接把你按在 Wireshark 的过滤框前面让你亲眼看见三次握手到底发了哪三个包。很多同学第一次做实验报告时卡的不是原理而是「抓不到包」「代码跑不通」「报告写成了名词解释」。这篇笔记按软件学院常见的实验链路来拆从环境准备、抓包分析、协议字段验证到 socket 编程实现一个最小 C/S 通信再到报告里该放什么截图、参数怎么记录。适合正在做计算机网络实验、准备验收、或者想把实验报告写成能复现的技术文档的人。核心词就一个计算机网络实验报告但报告背后真正要交付的是「你能证明自己看懂了这个协议」。2. 实验环境与抓包工具Wireshark 怎么配才不白抓2.1 为什么软件学院的实验偏爱 Wireshark 本机回环西工大软件学院的计算机网络实验一般围绕「协议观察 编程验证」两条线。协议观察部分最常用的工具就是 Wireshark因为它能直接把链路层到应用层的字段摊开给你看。软件学院的学生通常已经有编程基础所以实验不会停在「看图说话」而是要求你结合 socket 编程去复现协议行为。选 Wireshark 而不是 tcpdump原因很实际实验报告需要截图需要展开 TCP 报文段里的 Sequence Number、Acknowledgment Number、Flags 这些字段。tcpdump 输出是文本流写报告时还得自己画表效率低。Wireshark 的图形界面可以直接把「三次握手」的三个包标出来截图放进报告里验收老师一眼就能看到你抓的是哪个阶段。另一个常见做法是用本机回环加本地 socket 程序来产生流量。这样不依赖外网实验室网络波动也不影响。你写一个简单的 TCP 客户端和服务端跑在本机 127.0.0.1 上Wireshark 选回环接口就能抓到完整的握手和挥手过程。这个链路可控、可重复写实验报告时数据也稳定。2.2 抓包前的三个必调参数很多人打开 Wireshark 就直接点开始结果抓了一堆无关流量过滤半天找不到自己的包。下面这三个设置建议在抓包前就调好。第一个是捕获过滤器。在开始抓包之前在捕获选项里填host 127.0.0.1 and tcp port 9000这样只抓本机 9000 端口的 TCP 流量。端口号和你后面 socket 程序里用的一致。捕获过滤器在驱动层生效能直接减少抓到的包数量避免抓了几万个包再慢慢筛。第二个是显示过滤器。抓到包之后在过滤框里用tcp.port 9000或者tcp.flags.syn 1来定位握手包。显示过滤器不影响已经抓到的数据只是视图过滤适合写报告时快速定位。第三个是时间显示格式。Wireshark 默认显示相对时间写报告时建议改成「Seconds Since Beginning of Capture」这样三次握手的时间间隔能直接读出来。在视图菜单里改或者直接在列设置里调整。# 本机启动一个最简单的 TCP 服务端用于产生可抓包的流量 # 端口选 9000避免和常用服务冲突 python3 -c import socket s socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.bind((127.0.0.1, 9000)) s.listen(1) print(listening on 9000) conn, addr s.accept() print(connected by, addr) data conn.recv(1024) print(received:, data) conn.sendall(back from server) conn.close() 这段代码的作用是起一个单连接的服务端监听 9000 端口收到数据后回一句固定内容就关闭。参数说明SO_REUSEADDR是为了避免端口被 TIME_WAIT 状态占住导致重启失败listen(1)表示只排一个连接实验够用recv(1024)读一次就够因为客户端只发一小段。跑起来之后Wireshark 选回环接口用上面的捕获过滤器再跑客户端连接就能抓到完整的 SYN、SYN-ACK、ACK 以及后面的数据包和 FIN 挥手。提示如果回环接口抓不到包先确认 Wireshark 是否安装了 Npcap 或 libpcapWindows 下回环抓包依赖 Npcap 的回环支持选项。2.3 实验报告里抓包截图该截哪几帧写计算机网络实验报告时截图不是越多越好而是要截到「能证明协议行为」的关键帧。以 TCP 三次握手为例至少截三帧第一帧是客户端发 SYNFlags 里 SYN 置 1Sequence Number 是客户端初始序号第二帧是服务端回 SYN-ACKFlags 里 SYN 和 ACK 都置 1Acknowledgment Number 是客户端序号加一第三帧是客户端回 ACKFlags 里只有 ACK 置 1。截图时把 Wireshark 的协议树展开到 TCP 层让 Sequence Number、Acknowledgment Number、Flags 这几个字段可见。报告里不要只贴图要在图下面用一句话说明「这一帧的 Seq 是多少Ack 是多少对应握手的哪一步」。这样验收时老师能直接看到你读懂了字段而不是随便截了几张图。3. 协议字段验证把 TCP 和 HTTP 的报文拆开看3.1 TCP 三次握手与四次挥手序号和标志位怎么对TCP 实验的核心是验证「序号机制」和「标志位」。很多实验报告写「三次握手建立连接」但没写清楚序号怎么变。实际抓包时你要关注的是客户端初始序号 ISN_c服务端初始序号 ISN_s。第一次握手客户端发 SYNSeqISN_c。第二次握手服务端回 SYN-ACKSeqISN_sAckISN_c1。第三次握手客户端回 ACKSeqISN_c1AckISN_s1。四次挥手同理但要注意 FIN 和 ACK 是分开的。主动关闭方发 FINSequAckv被动关闭方回 ACKSeqvAcku1被动关闭方再发 FINSeqwAcku1主动关闭方回 ACKSequ1Ackw1。抓包时如果看到 FIN 和 ACK 合并在一个包里说明是延迟确认或者捎带确认报告里可以注明「本机抓包中 FIN 与 ACK 未合并符合标准四次挥手」。写报告时建议做一个表格把每一帧的序号、确认号、标志位列出来。表格比截图更清晰也方便老师核对。帧号方向FlagsSeqAck说明1C→SSYN10000客户端请求连接2S→CSYN,ACK50001001服务端同意并确认3C→SACK10015001客户端确认4C→SPSH,ACK10015001发送数据5S→CPSH,ACK50011001len服务端回数据这个表里的序号是示意值实际抓包时以 Wireshark 显示的相对序号为准。Wireshark 默认显示相对序号方便阅读报告里可以注明「序号为相对值」。3.2 HTTP 请求响应用过滤器定位 GET 和 200 OK如果实验涉及应用层常见做法是抓一个 HTTP 请求。用显示过滤器http.request.method GET定位请求包展开 HTTP 层能看到请求行、Host、User-Agent、Accept 等字段。响应包用http.response.code 200定位展开能看到状态行、Content-Type、Content-Length。写报告时重点说明「请求行里的方法、URL、版本」和「响应行里的状态码、原因短语」。如果实验要求对比 HTTP/1.1 和 HTTP/1.0 的区别可以看 Connection 字段是 keep-alive 还是 close。这些字段在 Wireshark 里都是直接可见的不需要额外工具。# 用 Python 发一个 HTTP GET 请求方便在 Wireshark 里抓 HTTP 包 import http.client conn http.client.HTTPConnection(example.com, 80, timeout5) conn.request(GET, /, headers{Host: example.com, User-Agent: lab-test}) resp conn.getresponse() print(resp.status, resp.reason) print(resp.read(200)) conn.close()这段代码用标准库发 HTTP 请求不依赖第三方包。参数说明HTTPConnection指定主机和端口request方法里传方法和路径headers 里手动指定 Host 和 User-Agent方便在 Wireshark 里过滤。跑之前先在 Wireshark 里设好tcp.port 80的捕获过滤器跑完就能看到完整的 TCP 握手加 HTTP 请求响应。注意如果目标站点强制 HTTPS80 端口会返回 301 或 403实验里可以换一个支持 HTTP 的测试站点或者直接用本机起一个 HTTP 服务。注意实验报告里不要贴真实的外部 IP 和域名用示例域名或者本机地址代替避免不必要的隐私暴露。3.3 用 ping 和 tracert 验证 ICMP 与路由网络层实验通常要求用 ping 和 tracert 观察 ICMP 报文。ping 发的是 ICMP Echo Request收的是 ICMP Echo Reply。Wireshark 过滤器用icmp就能抓到。报告里要写清楚 Type 和 CodeEcho Request 的 Type8Code0Echo Reply 的 Type0Code0。tracert 利用的是 ICMP 超时报文。每一跳 TTL 递减到 0 时路由器回 ICMP Time ExceededType11Code0。抓包时用icmp.type 11过滤能看到每一跳的源 IP。报告里可以画一个简单的路径表列出每一跳的 IP 和延迟。注意实验室网络可能屏蔽 ICMP如果 tracert 全是星号先确认是不是防火墙拦了报告里注明「实验环境限制 ICMP改用 TCP tracert 或直接分析已有抓包」。4. Socket 编程实验用 Python 写一个最小 C/S 并抓包验证4.1 服务端和客户端的最小实现软件学院的计算机网络实验通常要求写一个 socket 程序验证 TCP 或 UDP 通信。下面用 Python 写一个最小的 TCP 服务端和客户端代码短、依赖少、容易抓包。# tcp_server.py import socket HOST 127.0.0.1 PORT 9000 server socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) server.bind((HOST, PORT)) server.listen(1) print(f[server] listening on {HOST}:{PORT}) conn, addr server.accept() print(f[server] connection from {addr}) while True: data conn.recv(1024) if not data: break print(f[server] received: {data.decode()}) conn.sendall(becho: data) conn.close() server.close()# tcp_client.py import socket HOST 127.0.0.1 PORT 9000 client socket.socket(socket.AF_INET, socket.SOCK_STREAM) client.connect((HOST, PORT)) print(f[client] connected to {HOST}:{PORT}) for msg in [bhello, bnetwork lab]: client.sendall(msg) resp client.recv(1024) print(f[client] response: {resp.decode()}) client.close()服务端逻辑创建 TCP socket绑定本机 9000 端口监听接受连接循环收数据并回显。客户端逻辑创建 socket连接服务端发两条消息各收一次响应关闭。参数说明AF_INET表示 IPv4SOCK_STREAM表示 TCPSO_REUSEADDR避免重启时端口占用recv(1024)每次最多读 1024 字节实验数据短够用。跑的时候先起服务端再起客户端。Wireshark 选回环接口捕获过滤器用tcp port 9000。抓到的包应该包含三次握手、两条数据请求和响应、四次挥手。报告里把抓包结果和代码对应起来说明「客户端 connect 对应 SYN服务端 accept 对应 SYN-ACKsendall 对应 PSH-ACK 数据包」。4.2 UDP 版本和 TCP 版本的差异验证如果实验要求对比 TCP 和 UDP可以把上面的代码改成 UDP 版本。UDP 不需要 listen 和 accept直接 sendto 和 recvfrom。# udp_server.py import socket server socket.socket(socket.AF_INET, socket.SOCK_DGRAM) server.bind((127.0.0.1, 9001)) print([udp server] listening on 9001) while True: data, addr server.recvfrom(1024) print(f[udp server] from {addr}: {data.decode()}) server.sendto(budp echo: data, addr)# udp_client.py import socket client socket.socket(socket.AF_INET, socket.SOCK_DGRAM) client.sendto(bhello udp, (127.0.0.1, 9001)) data, addr client.recvfrom(1024) print(f[udp client] response: {data.decode()}) client.close()UDP 抓包时看不到握手和挥手只有数据包。报告里要说明「UDP 无连接因此没有 SYN 和 FIN抓包只看到数据报」。这个对比是实验报告里很容易拿分的地方因为直接体现了你对「面向连接」和「无连接」的理解。4.3 抓包结果和代码的对应关系写实验报告时建议做一个对应表把代码里的调用和抓包里的帧对应起来。比如代码调用抓包表现协议层socket()无包应用层创建套接字connect()SYNTCP 三次握手第一步accept()SYN-ACKTCP 三次握手第二步sendall()PSH,ACKTCP 数据传输recv()ACKTCP 确认close()FIN,ACKTCP 四次挥手这个表能让老师看到你不是「代码跑通就完事」而是真的把代码行为和协议行为对上了。实验报告的价值就在这里证明你能把抽象协议和具体实现连起来。5. 实验报告避坑从格式到验收的 5 个常见翻车点5.1 现象抓包抓不到自己的流量全是无关包原因没有设捕获过滤器或者选错了网卡。实验室机器通常有多张网卡Wireshark 默认可能选了以太网而不是回环。解决抓包前在接口列表里确认选的是回环Loopback或者你实际走流量的网卡捕获过滤器填host 127.0.0.1 and tcp port 9000端口和代码一致。5.2 现象socket 程序报 Address already in use原因上一次运行的服务端没有正常关闭端口处于 TIME_WAIT 状态。解决在 bind 之前加setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)或者换一个端口。实验报告里可以把这个坑写进去说明「端口复用选项的作用」反而是加分项。5.3 现象报告里截图模糊字段看不清原因截图时没有展开协议树或者分辨率太低。解决Wireshark 窗口最大化展开到 TCP 或 HTTP 层用系统截图工具截取关键区域不要截整个屏幕。报告里每张图下面写一句「本帧关键字段SeqxxxAckxxxFlagsxxx」方便老师核对。5.4 现象HTTP 实验抓到 301 或 403没有 200 OK原因目标站点强制 HTTPS或者拒绝了实验用的 User-Agent。解决换一个支持 HTTP 的测试站点或者在本机起一个简单的 HTTP 服务。用 Python 的http.server模块就能起python3 -m http.server 8080然后抓tcp port 8080一定能看到 200 OK。5.5 现象实验报告写成名词解释没有自己的数据原因直接抄教材或网上的协议说明没有结合自己抓到的包。解决报告里每个协议点都要配自己的抓包截图或代码输出。比如写「三次握手」时不要只写「SYN、SYN-ACK、ACK」要写「本机抓包中第一帧 Seq0第二帧 Ack1第三帧 Ack1与理论一致」。有数据、有截图、有对应关系报告才站得住。6. 进阶技巧用 tshark 批量提取字段并自动生成报告表格如果你不想一帧一帧手动抄序号可以用 tshark 命令行批量导出字段。tshark 是 Wireshark 的命令行版本安装 Wireshark 时自带。下面这条命令把抓包文件里的 TCP 序号、确认号、标志位导成 CSV直接贴进报告表格。# 从 capture.pcap 中提取 TCP 关键字段输出 CSV tshark -r capture.pcap -Y tcp.port 9000 \ -T fields \ -e frame.number \ -e ip.src \ -e ip.dst \ -e tcp.flags.str \ -e tcp.seq \ -e tcp.ack \ -e tcp.len \ -E headery -E separator, tcp_fields.csv参数说明-r指定抓包文件-Y是显示过滤器只保留 9000 端口的 TCP 包-T fields表示按字段输出-e指定要导出的字段这里选了帧号、源 IP、目的 IP、标志位、序号、确认号、数据长度-E headery表示输出表头-E separator,表示用逗号分隔。导出的 CSV 可以直接用 Excel 打开稍微调整就能放进实验报告。这个技巧的好处是数据准确不用手动抄格式统一报告看起来专业可复现换一个抓包文件改一下过滤器就能重用。我一般会在实验报告里附上这条命令说明「表格数据由 tshark 自动提取」老师看到会觉得你不仅会抓包还会用工具链提高效率。另一个进阶用法是用 tshark 的统计功能直接算握手延迟。比如# 统计 TCP 握手各阶段的时间差 tshark -r capture.pcap -Y tcp.flags.syn 1 or tcp.flags.ack 1 \ -T fields -e frame.number -e frame.time_relative -e tcp.flags.str输出里能看到每一帧的相对时间手动算一下 SYN 到 SYN-ACK 的时间差就是网络往返延迟。报告里写「本机回环握手延迟约 0.1ms」比只写「握手很快」有说服力。最后说一个我自己的习惯每次做完实验先把抓包文件、代码、tshark 导出结果放在同一个文件夹里命名用「实验名_日期」。写报告时直接从这个文件夹取数据不靠记忆。验收前再跑一遍代码确认能复现。这样即使老师临时让你现场演示你也能直接打开环境跑起来。计算机网络实验报告不是写完就扔的作业它是你第一次用证据证明自己理解协议的机会。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?