简介这份资源是哈工大计算机网络课程实验1至6的完整报告与配套源码合集面向正在修读计算机网络实验课的高校学生以及希望系统练习协议实现与网络分析的开发者。内容覆盖HTTP代理服务器设计与实现、HTTP分组收发与转发、可靠数据传输GBN协议、Wireshark协议分析以及简单网络组建与配置等典型实验基本对应课程从应用层到传输层的核心知识点。压缩包共22个文件约4.67MB以docx实验报告、cpp与js源码、json配置、md说明文档为主另含pkt拓扑文件报告与代码相互对应便于对照理解实现思路。目前已有562人学习下载。读者可借助这些材料快速搭建实验环境、复盘协议实现细节、参考报告结构与排错思路适合作为课程作业参考与期末复习的辅助资料。1. 哈工大计算机网络实验1-6从抓包到 socket 编程一套能跑通的复盘路径很多人拿到“哈工大计算机网络实验1-6实验报告及源码”这类资源第一反应是找一份能直接交差的报告。但真正做过这套实验的人都知道实验1到实验6是一条完整的链路从 Wireshark 抓包观察协议行为到用 socket 写客户端和服务端再到分析 TCP 拥塞控制和路由转发。如果你只抄报告不看代码答辩时老师问一句“这个三次握手的序列号为什么从 0 开始”就会当场翻车。这套实验的价值不在于报告本身而在于它逼你把课本上“计算机网络”四个字拆成可观测的字节流。适合正在上这门课、准备考研复试机试、或者想补网络编程基础的从业者。下面按我实际带人复现的顺序把六个实验串成一条可执行的路径。2. 实验1-2抓包观察与协议分析先把黑匣子打开2.1 为什么先做 Wireshark 而不是直接写代码哈工大这套实验的前两个通常落在数据链路层和网络层。实验1常见的是用 Wireshark 抓取本机流量观察 Ethernet 帧、ARP 请求应答、IP 分片实验2会深入到 ICMP 和路由跟踪。很多人觉得抓包就是点一下开始然后看列表但真正要写进报告的是“为什么这个 ARP 请求是广播而应答是单播”。我一般会让学生先抓一次 ping 网关的流量把每一层的封装关系画出来再对照课本的帧格式逐字段标注。这里有个反直觉的点抓包实验的难点不在抓而在过滤。默认抓下来的包几百上千条你不会看就淹没了。常用过滤表达式必须背下来几个# 只看 ARP 流量 arp # 只看 ICMP 且排除本机发出的 icmp and not src host 192.168.1.100 # 只看 TCP 三次握手的前两个包 tcp.flags.syn 1 and tcp.flags.ack 0逻辑说明Wireshark 的过滤语法分捕获过滤和显示过滤上面是显示过滤。arp直接筛协议类型icmp and not src host用来排除自己发出的请求只看别人的应答tcp.flags.syn 1 and tcp.flags.ack 0精确匹配 SYN 包这是观察三次握手第一步的关键。参数上host后面跟 IPsrc和dst区分方向组合用and、or、not。2.2 实验报告里必须写清楚的三个字段抓包实验的报告如果只贴截图分数不会高。我建议每个协议分析都落到三个字段帧类型、关键标志位、地址字段。以 ARP 为例帧类型是 0x0806操作码 1 表示请求、2 表示应答发送方 MAC 和 IP 必须和接收方对应。实验2如果涉及 IP 分片要记录 identification、flags 中的 MF 位、fragment offset。这些字段在 Wireshark 的 Packet Details 面板里都能展开看到。提示抓包时把网卡设为混杂模式不一定能抓到别人的流量交换式以太网下你只能看到广播和发往本机的单播。报告里不要写“抓到了整个局域网的通话”那是 hub 时代的事。2.3 用 tcpdump 做命令行复现有些环境没有图形界面或者你需要在服务器上快速验证。tcpdump 是必须会的替代方案# 抓取 eth0 上 10 个 ICMP 包不解析域名 tcpdump -i eth0 -c 10 -n icmp # 抓取 80 端口的 TCP 包并写入文件之后用 Wireshark 打开 tcpdump -i eth0 -w http.pcap tcp port 80逻辑说明-i指定网卡-c限制数量-n禁止反向域名解析加快速度-w写入 pcap 文件供后续分析。参数上port 80可以换成portrange 1-1024-s 0抓完整包默认只抓前 96 字节分析应用层时要改。3. 实验3-4Socket 编程从 echo 到并发服务端3.1 最小可运行 TCP 客户端与服务端实验3和实验4通常要求学生用 C 或 Python 实现 TCP/UDP 的通信。哈工大实验指导书里常见的是 C 语言 socket API但如果你只是想快速验证逻辑Python 的 socket 模块更直观。下面是一个能跑通的 TCP echo 服务端# tcp_server.py import socket HOST 127.0.0.1 PORT 8888 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(flistening on {HOST}:{PORT}) while True: conn, addr s.accept() with conn: print(fconnected by {addr}) while True: data conn.recv(1024) if not data: break conn.sendall(data) # echo back逻辑说明socket.AF_INET表示 IPv4SOCK_STREAM表示 TCP。SO_REUSEADDR让服务端重启时不必等待 TIME_WAIT 状态结束这是调试时必加的选项。listen(5)的参数是等待队列长度不是最大连接数。recv(1024)每次最多读 1024 字节返回空字节表示对端关闭。sendall会确保所有数据发送完毕比send更省心。对应的客户端# tcp_client.py import socket with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.connect((127.0.0.1, 8888)) s.sendall(bhello hgd) data s.recv(1024) print(received:, data.decode())参数说明connect的参数是服务端地址元组。发送的数据必须是 bytes 类型所以字符串前加b或调用.encode()。接收后解码用.decode()默认 UTF-8。3.2 UDP 版本和 TCP 的关键差异实验4如果要求 UDP代码结构类似但不需要 listen 和 accept# udp_server.py import socket with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s: s.bind((127.0.0.1, 9999)) while True: data, addr s.recvfrom(1024) print(ffrom {addr}: {data.decode()}) s.sendto(data, addr)逻辑说明SOCK_DGRAM表示 UDP。recvfrom返回数据和发送方地址sendto需要指定目标地址。UDP 没有连接概念所以不需要 accept但每次收发都要带地址。参数上recvfrom(1024)的缓冲区大小要大于最大报文否则多余部分会被丢弃。3.3 并发服务端的三种写法与选型实验4往往要求服务端能同时处理多个客户端。常见做法有三种多进程、多线程、I/O 多路复用。我一般会让学生先写多线程版本因为最容易理解import socket import threading def handle(conn, addr): with conn: while True: data conn.recv(1024) if not data: break conn.sendall(data) with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.bind((0.0.0.0, 8888)) s.listen(50) while True: conn, addr s.accept() t threading.Thread(targethandle, args(conn, addr)) t.start()逻辑说明每个连接开一个线程主线程继续 accept。0.0.0.0表示监听所有网卡。listen(50)加大等待队列。参数上线程数受系统限制连接数上千时应该改用select或epoll。如果实验报告要求对比可以测一下 100 个并发连接下多线程和 select 的 CPU 占用。注意多线程版本里不要在主线程里处理连接否则 accept 会被阻塞。另外Python 的 GIL 会让多线程在 CPU 密集场景下退化但 echo 服务是 I/O 密集影响不大。4. 实验5-6TCP 拥塞控制与路由转发把协议行为量化4.1 用 Wireshark 观察拥塞窗口变化实验5通常涉及 TCP 的流量控制和拥塞控制。课本上讲慢启动、拥塞避免、快重传、快恢复但你不抓一次包就不知道实际序列号怎么跳。我一般会让学生用iperf或nc传一个大文件同时抓包然后在 Wireshark 里看tcp.analysis.ack_rtt和tcp.window_size。关键过滤表达式# 只看某个 TCP 流的窗口大小变化 tcp.stream eq 0 and tcp.window_size # 看重传包 tcp.analysis.retransmission逻辑说明tcp.stream eq 0锁定第一条流tcp.window_size显示窗口字段。重传包用tcp.analysis.retransmission过滤Wireshark 会自动标记。参数上窗口大小会受接收方缓冲区影响不要直接当成拥塞窗口拥塞窗口是发送方维护的抓包只能间接推断。4.2 路由转发的实验怎么做实验6常见的是静态路由配置或 RIP 协议模拟。如果是在 Linux 上做用ip route命令# 添加一条静态路由 sudo ip route add 192.168.2.0/24 via 192.168.1.1 dev eth0 # 查看路由表 ip route show # 删除路由 sudo ip route del 192.168.2.0/24逻辑说明add添加路由via指定下一跳dev指定出口网卡。show查看当前表。参数上/24是子网掩码长度192.168.1.1必须是直连可达的地址。如果实验要求用 Quagga 或 FRR 跑 RIP配置会更复杂但核心是network语句宣告网段。4.3 实验报告的数据记录模板实验5和6的报告需要量化数据。我建议用表格记录实验观测指标工具记录方式实验5拥塞窗口、RTT、重传次数Wireshark截图 序列号列表实验6路由表条目、跳数、收敛时间ip route / traceroute命令输出粘贴提示实验6如果涉及动态路由收敛时间要从第一次拓扑变化到路由表稳定的时间差用date命令打时间戳。5. 避坑与排查六个实验里最容易翻车的五个地方5.1 抓包抓不到任何包现象Wireshark 开始后列表空白或者只有零星几个包。原因选错了网卡或者没有触发流量。解决先确认默认路由走的是哪个网卡ip route show default看dev后面的名字。然后主动 ping 一下网关或访问一个网页。如果还是空的检查是否有权限Linux 下需要 root 或加入 wireshark 组。5.2 Socket 绑定失败 Address already in use现象服务端启动时报OSError: [Errno 98] Address already in use。原因上一次运行的服务端还在 TIME_WAIT 状态端口没释放。解决加SO_REUSEADDR选项如 3.1 节代码所示。如果还不行换一个端口或者等 60 秒。不要用SO_REUSEPORT那个是给多进程负载均衡用的语义不同。5.3 客户端连不上服务端现象Connection refused或超时。原因服务端没启动、防火墙拦截、或者地址写错。解决先在服务端本机用127.0.0.1测试排除代码问题。然后检查ss -tlnp看端口是否在监听。如果服务端在另一台机器检查防火墙规则临时关闭用sudo ufw disable测试完记得开回来。5.4 实验报告里的序列号对不上现象Wireshark 里看到的序列号和课本例子不一样。原因相对序列号 vs 绝对序列号。Wireshark 默认显示相对序列号从 0 开始。解决在 TCP 协议首选项里关闭Relative sequence numbers就能看到真实的 32 位序列号。报告里要注明用的是哪种否则老师会认为你抄错了。5.5 路由配置后不通现象加了静态路由但 ping 不通目标网段。原因下一跳不可达或者目标网段没有回程路由。解决先ping下一跳地址确认直连可达。然后在目标机器上traceroute回来看包在哪一跳丢了。如果是实验环境检查两台机器的网卡是否在同一子网子网掩码是否一致。6. 进阶把六个实验串成一个可演示的 mini 项目如果你已经跑通了六个实验我建议不要停在报告层面而是把它们串成一个能演示的小项目。具体做法用实验3的 TCP 服务端作为后端实验1的抓包脚本作为监控实验5的拥塞分析作为性能报告实验6的路由配置作为多机部署的基础。这样你在答辩或面试时可以打开一个终端展示服务端另一个终端跑客户端同时 Wireshark 在抓包最后用ip route展示网络拓扑。一个具体的验证方法是写一个自动化脚本依次启动服务端、运行客户端、抓包、分析重传#!/bin/bash # run_all.sh python3 tcp_server.py SERVER_PID$! sleep 1 sudo tcpdump -i lo -w exp5.pcap tcp port 8888 TCPDUMP_PID$! python3 tcp_client.py sleep 1 kill $TCPDUMP_PID kill $SERVER_PID echo pcap saved, open with wireshark逻辑说明让服务端和 tcpdump 后台运行$!拿到进程号最后 kill 掉。-i lo抓本地回环因为客户端和服务端都在本机。参数上sleep 1给进程启动留时间实际环境可以改成轮询端口。我自己的习惯是每个实验单独建一个目录里面放源码、pcap 文件、报告草稿。报告里的每个结论都要能对应到一个命令输出或一个包编号。这样即使老师随机抽问你也能快速定位。这套实验做下来最大的收获不是那几分而是你以后遇到任何网络问题第一反应是抓包而不是重启。希望帮到你。本文还有配套的精品资源点击获取