西北工业大学软件学院计算机网络实验报告:Wireshark抓包与Socket编程实战指南
发布时间:2026/10/8 3:09:16 锦皓数字建站

简介这份资源是西北工业大学软件学院计算机网络课程的实验报告面向正在学习计算机网络、需要完成HTTP协议相关实验的本科生与自学者。报告围绕Wireshark抓包分析展开覆盖HTTP基础GET/响应交互、条件GET与缓存机制、长文档检索以及含嵌入对象的HTML文档四个实验逐一记录了请求方法、HTTP版本、可接受语言、IP地址、状态码、内容字节数等关键字段的观察结果并涉及分块传输、持续连接与CDN等概念。资源包内含1个doc文档压缩包约6.62MB结构完整、条理清晰可直接作为实验参考与复习材料。已有1647人学习下载。读者可借此掌握HTTP请求与响应的构建方式、状态码含义、缓存策略及数据包分析技巧对网络编程、网站开发与网络安全分析均有实际帮助。1. 西北工业大学软件学院计算机网络实验报告从抓包到 socket 编程一套能跑通的实验链路很多同学拿到西北工业大学软件学院计算机网络实验报告这个任务时第一反应是去搜现成模板结果发现每个人的实验环境、抓包工具版本、甚至老师要求的截图格式都不一样抄来的报告根本对不上。这门实验课的核心其实就三件事用抓包工具看清协议真实长什么样、用 socket 把协议栈的某一层亲手实现一遍、把观察到的现象和协议字段对应起来写成能自洽的报告。它适合已经学过计算机网络理论课、但一动手就不知道从哪敲命令的软件学院学生也适合想补网络编程实操的开发者。我带过几届软院的实验辅导最常见的翻车点不是代码写不出来而是环境没配对、抓包位置选错、报告里协议字段解释和实际抓到的包对不上。下面按真实实验流程拆开讲每一步都给可复现的命令和参数。2. 实验环境搭建Wireshark 抓包位置和过滤规则怎么定2.1 为什么抓包位置决定了你能不能看到完整的 TCP 三次握手Wireshark 默认抓的是本机网卡进出的流量但如果你抓的是 loopback 回环接口看到的 TCP 握手和真实物理网卡上的行为有差异——回环接口的 MTU 通常是 65536不会触发分片而真实以太网 MTU 是 1500。软院实验里常做的 HTTP 请求分析如果服务端在本机你抓 loopback 能看到完整请求响应如果服务端在实验室另一台机器就必须抓物理网卡否则只能看到自己发出的 SYN看不到对方的 SYN-ACK。选网卡的原则很简单客户端和服务端在同一台机器抓Adapter for loopback traffic capture跨机器抓你实际通信用的那块网卡。Windows 下用ipconfig确认网卡名Linux 下用ip addr。Wireshark 的捕获接口列表里有流量的那个接口后面会有实时波形没流量的就是选错了。2.2 安装与最小验证命令# Ubuntu/Debian 安装 Wireshark 和命令行抓包工具 tshark sudo apt update sudo apt install wireshark tshark -y # 安装时会出现是否允许非 root 用户抓包的提示选 Yes # 把当前用户加入 wireshark 组避免每次 sudo sudo usermod -aG wireshark $USER # 重新登录后生效 # 验证列出所有可抓包接口 tshark -D # 抓 10 个包看看能不能跑通 sudo tshark -i eth0 -c 10tshark -D列出接口编号-i后面跟接口名或编号-c 10表示抓满 10 个包就停。如果提示权限不足说明用户组没生效重新登录一次。这一步跑通说明抓包环境没问题后面 Wireshark 图形界面也能正常用。2.3 实验常用过滤表达式Wireshark 的显示过滤器和捕获过滤器是两回事。捕获过滤器在抓包前生效语法是 BPF显示过滤器在抓完后筛选语法是 Wireshark 自己的。软院实验报告里经常要求只分析 HTTP 流量用显示过滤器就够了别去动捕获过滤器否则抓漏了还得重来。实验场景显示过滤器写法说明只看 HTTPhttp包含请求和响应只看某台主机ip.addr 192.168.1.100双向都过滤只看 TCP 握手tcp.flags.syn 1SYN 包排除 ARP 干扰!arp去掉广播噪声看 DNS 查询dns.qry.name contains npu按域名过滤提示过滤器写错不会报错只会显示空列表。如果抓了半天一个包没有先清空过滤器看有没有流量再逐步加条件。3. 协议分析实验用抓包数据把 TCP 和 HTTP 讲清楚3.1 TCP 三次握手抓包与字段解读启动 Wireshark 选中网卡开始抓包然后在浏览器访问一个 HTTP 网站注意是 http 不是 httpshttps 的握手内容加密看不到。访问完成后停止抓包在过滤器输入tcp.flags.syn 1 or tcp.flags.ack 1找到前三个包。第一个包是客户端发服务端的 SYN关键字段Sequence Number 是客户端随机初始序列号比如 0Flags 里 SYN 置 1。第二个包是服务端回的 SYN-ACKSequence Number 是服务端自己的初始序列号Acknowledgment Number 是客户端序列号加 1Flags 里 SYN 和 ACK 都置 1。第三个包是客户端回的 ACKAcknowledgment Number 是服务端序列号加 1。报告里要写清楚为什么是三次而不是两次因为 TCP 是全双工双方都要确认对方的初始序列号两次只能确认一个方向。这个点在实验报告里是高频考点光写三次握手建立连接拿不到分要结合抓到的具体序列号说明。3.2 HTTP 请求响应报文分析在同一个抓包文件里过滤http找到 GET 请求和 200 OK 响应。展开 Hypertext Transfer Protocol 层能看到请求行、请求头、响应行、响应头。# 典型请求报文结构从 Wireshark 复制出来的字段 GET /index.html HTTP/1.1\r\n Host: example.com\r\n User-Agent: Mozilla/5.0 ...\r\n Accept: text/html\r\n \r\n # 典型响应报文结构 HTTP/1.1 200 OK\r\n Content-Type: text/html; charsetUTF-8\r\n Content-Length: 1256\r\n \r\n报告里要对应写请求行的方法、URL、版本号分别是什么Host 头为什么在 HTTP/1.1 里必须存在支持虚拟主机Content-Length 和实际抓到的 TCP 载荷长度是否一致。如果响应体被分到多个 TCP 段里还要说明 TCP 分段和 HTTP 消息边界的关系——HTTP/1.1 靠 Content-Length 或 chunked 编码定边界不是靠 TCP 段边界。3.3 用 tshark 导出字段做统计图形界面适合看单个包批量统计用 tshark 更高效。软院实验有时要求统计一段时间内各协议占比用下面命令直接出结果。# 抓 60 秒流量保存到文件 sudo tshark -i eth0 -a duration:60 -w capture.pcap # 统计协议分层数量 tshark -r capture.pcap -q -z io,phs # 导出所有 HTTP 请求的 host 和 URI tshark -r capture.pcap -Y http.request -T fields -e http.host -e http.request.uri # 统计 TCP 重传次数 tshark -r capture.pcap -Y tcp.analysis.retransmission | wc -l-r读文件-Y是显示过滤器-T fields -e指定导出字段。-z io,phs输出协议分层统计直接可以贴进报告。重传统计能说明网络质量如果重传率高报告里可以分析是不是链路拥塞或丢包。4. Socket 编程实验从 TCP echo 到简易 HTTP 服务器4.1 TCP echo 客户端服务端最小实现软院 socket 实验一般从 echo 开始客户端发什么服务端回什么。Python 的 socket 模块足够用重点是理解 bind、listen、accept、connect 的调用顺序和阻塞行为。# tcp_echo_server.py import socket HOST 0.0.0.0 # 监听所有网卡实验环境用这个 PORT 9000 # 端口号避开 0-1023 系统端口 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 避免 TIME_WAIT 导致端口占用 s.bind((HOST, PORT)) s.listen(5) # 半连接队列长度实验用 5 够 print(flistening on {PORT}) conn, addr s.accept() # 阻塞直到有客户端连接 with conn: print(fconnected by {addr}) while True: data conn.recv(1024) # 每次最多收 1024 字节 if not data: break # 客户端关闭连接 conn.sendall(data) # 原样发回# tcp_echo_client.py import socket HOST 127.0.0.1 # 服务端 IP跨机器改成实际地址 PORT 9000 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.connect((HOST, PORT)) s.sendall(bhello npu) # 发送字节串不是字符串 data s.recv(1024) print(received:, data.decode())服务端先跑再跑客户端。SO_REUSEADDR这行很关键不加的话服务端重启会报Address already in use因为 TCP 连接关闭后进入 TIME_WAIT 状态端口还被占着。sendall和send的区别是sendall会循环发送直到全部发完实验里数据量小用哪个都行但养成用sendall的习惯。4.2 用 Wireshark 验证 socket 通信过程服务端和客户端跑起来的同时用 Wireshark 抓 loopback 接口过滤tcp.port 9000。你能看到完整的 SYN、SYN-ACK、ACK、数据传输、FIN、ACK 流程。把抓到的序列号和代码里的sendall数据长度对应起来报告里就能写应用层调用 sendall 发送 8 字节TCP 层序列号增加 8。如果客户端recv返回空字节串说明服务端关闭了连接。如果客户端一直阻塞在recv说明服务端没发数据或者发了但没 flush。Python socket 没有缓冲问题sendall直接进内核缓冲区所以阻塞通常是逻辑问题不是缓冲问题。4.3 简易 HTTP 服务器把 socket 和协议分析串起来这个实验把前面抓包看到的 HTTP 报文用代码构造出来理解会更透。# simple_http_server.py import socket HOST 0.0.0.0 PORT 8080 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.bind((HOST, PORT)) s.listen(5) print(fhttp server on {PORT}) while True: conn, addr s.accept() with conn: request conn.recv(4096) # HTTP 请求一般不超过 4096 print(request.decode(errorsignore)) body bh1NPU Software School/h1 response ( bHTTP/1.1 200 OK\r\n bContent-Type: text/html; charsetUTF-8\r\n bContent-Length: str(len(body)).encode() b\r\n bConnection: close\r\n b\r\n body ) conn.sendall(response)浏览器访问http://127.0.0.1:8080同时 Wireshark 抓包你能看到自己构造的响应报文和浏览器解析过程。Connection: close表示响应完就关连接简化实现不用处理 keep-alive。Content-Length必须和 body 实际长度一致否则浏览器会一直等或者截断。5. 实验报告避坑从抓包到写作的 5 个高频翻车点5.1 抓包文件里全是 ARP 和广播找不到目标流量现象打开抓包文件前几百个包全是 ARP 请求和 STP 广播目标 TCP 流量被淹没。原因抓包时没设捕获过滤器局域网广播噪声全进来了。解决抓包前在 Wireshark 捕获选项里设tcp port 80 or tcp port 9000或者抓完后用显示过滤器tcp先筛掉非 TCP 流量。报告里截图前一定先过滤否则老师看到一堆 ARP 会扣分。5.2 序列号是相对值不是绝对值报告里写错现象Wireshark 默认显示相对序列号第一个 SYN 的 Sequence Number 显示 0但报告里写初始序列号是 0不准确。原因Wireshark 为了可读性把原始序列号减去了初始值。解决在 TCP 协议首选项里关掉Relative sequence numbers就能看到真实随机初始序列号。报告里写相对序列号从 0 开始或者绝对序列号是某个随机值都行但要说明用的是哪种。5.3 socket 服务端 bind 失败Address already in use现象服务端跑一次后 CtrlC 停掉再跑报OSError: [Errno 98] Address already in use。原因TCP 连接关闭后主动关闭方进入 TIME_WAIT默认持续 2MSLLinux 上约 60 秒端口没释放。解决加SO_REUSEADDR或者等一分钟再跑。实验报告里如果要求分析 TIME_WAIT可以故意不加这个选项抓包看 FIN 之后的等待过程。5.4 客户端 recv 阻塞不返回现象客户端sendall之后recv一直卡住程序不往下走。原因服务端没发数据或者服务端发了但客户端过滤条件不对。解决先确认服务端sendall执行了再确认客户端recv的 socket 是同一个连接。如果服务端用conn.sendall但客户端用s.recv检查是不是 accept 返回的 conn 和客户端 s 对应。跨机器实验还要检查防火墙有没有拦。5.5 报告里协议字段解释和抓包截图对不上现象报告写ACK 号为 1但截图里 ACK 号是 12450。原因截图用的是绝对序列号文字描述用的是相对序列号两者混用。解决统一口径要么全用相对序列号Wireshark 默认要么全用绝对序列号关掉相对显示。截图和文字必须一致这是实验报告最基本的自洽要求。6. 进阶技巧用 Python 脚本自动解析 pcap 生成报告数据手动从 Wireshark 里抄字段效率低还容易错用pyshark或scapy直接读 pcap 文件把统计结果输出成表格报告数据部分就能自动化。# analyze_pcap.py from scapy.all import rdpcap, TCP, IP packets rdpcap(capture.pcap) syn_count 0 fin_count 0 retrans {} http_hosts [] for pkt in packets: if IP in pkt and TCP in pkt: tcp pkt[TCP] # 统计 SYN 和 FIN if tcp.flags 0x02: syn_count 1 if tcp.flags 0x01: fin_count 1 # 简易重传检测相同 seq 出现多次 key (pkt[IP].src, pkt[IP].dst, tcp.seq) retrans[key] retrans.get(key, 0) 1 # 提取 HTTP Host假设端口 80 if tcp.dport 80 and pkt[IP].payload: payload bytes(pkt[IP].payload) if payload.startswith(bGET): for line in payload.split(b\r\n): if line.lower().startswith(bhost:): http_hosts.append(line.decode()) print(fSYN packets: {syn_count}) print(fFIN packets: {fin_count}) print(fPossible retransmissions: {sum(1 for v in retrans.values() if v 1)}) print(fHTTP hosts: {set(http_hosts)})rdpcap一次性读入所有包tcp.flags 0x02判断 SYN 位0x01判断 FIN 位。重传检测用相同四元组加序列号出现多次来近似真实重传判断还要看时间间隔和 ACK 号但实验报告用这个近似够了。pkt[IP].payload拿到 TCP 载荷判断是不是 HTTP 请求。这个脚本跑出来的数字直接填进报告表格比手抄准确得多。我自己的习惯是每次做网络实验先跑一遍自动解析脚本把 SYN/FIN/重传/HTTP Host 四个数字记下来再打开 Wireshark 对着看几个关键包确认脚本没漏。这样报告里的数据部分基本不会出错剩下的精力放在协议分析和结论上。希望帮到你。本文还有配套的精品资源点击获取
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。