☰
重邮计算机网络实验报告:Wireshark抓包与Socket编程实战指南
2026/10/8 20:29:15 网站建设 项目流程

简介:这份重邮计算机网络实验报告面向高校计算机网络课程学习者,尤其适合正在完成实验课作业或备考网络方向的学生参考。报告完整覆盖四个实验模块:网络命令与使用、网络服务器建立与使用、网络协议分析、网络设备与VLAN配置,每个实验均包含实验目的、要求、主要步骤、结果与总结,可直接对照实验日志模板梳理操作流程与排错思路。资源包共1个PDF文件,大小约8.77MB,内容以图文步骤和命令记录为主,便于打印或电子查阅。目前已有198人学习下载,说明其在同类实验报告中具有一定参考价值。读者可借此掌握ipconfig、ping、arp、ftp等常用命令,理解IIS与Serv-U服务器配置、Ethereal抓包分析Ping与FTP协议过程,以及交换机VLAN划分与跨交换机通信的配置方法,适合作为实验预习、报告撰写和期末复习的辅助材料。

1. 重邮计算机网络实验报告:从抓包到协议栈,一份能复现的实验笔记该长什么样

如果你正在搜「重邮计算机网络实验报告」,大概率不是想抄一份 PDF,而是想搞清楚:这门课的实验到底在做什么、Wireshark 抓到的那些包怎么读、Socket 编程那几行代码为什么跑不通、以及一份能拿得出手的实验报告应该包含哪些硬核内容。我当年做这套实验时,最大的感受是——实验指导书告诉你「做什么」,但很少告诉你「为什么这么做」和「做不出来时看哪里」。重邮的计算机网络实验通常围绕协议分析、Socket 编程、网络配置与抓包验证展开,和湖科大教书匠那套课程、自顶向下教材的章节能对上号。这篇笔记不贴某一份具体报告,而是把这类实验的通用做法、参数设置、排错路径拆开讲,让你自己能写出一份经得起老师追问的报告。

2. 实验环境搭建:Wireshark 抓包前的四个必调项

2.1 为什么抓包前要先确认网卡和过滤规则

很多人第一次打开 Wireshark 就懵了——几百个包刷屏,根本找不到自己要的 HTTP 或 TCP 握手。问题不在 Wireshark,在于你没选对网卡、没设过滤。重邮实验里常见的场景是:本机访问一个 Web 服务器,要求你抓 HTTP 请求和响应。如果你选的是 VMware 虚拟网卡或者 Loopback,可能一个包都抓不到,因为流量根本没走那块网卡。

常见做法是先用ipconfig(Windows)或ip a(Linux)确认当前活跃网卡的 IP,然后在 Wireshark 的网卡列表里找对应 IP 的那一项。选错网卡是最高频的翻车点,没有之一。

# Windows 下查看活跃网卡和 IP ipconfig | findstr /i "IPv4" # Linux 下查看 ip a show | grep -E "inet |^[0-9]+:"

逻辑说明:ipconfig输出里找到你实际用来上网的那块网卡(通常是有默认网关的那个),记下 IP。Wireshark 网卡列表里会显示每块网卡的 IP,选匹配的那块。参数上没什么可调的,关键是别选「任何」以外的虚拟网卡。

2.2 显示过滤器 vs 捕获过滤器:别在错误的地方写规则

Wireshark 有两套过滤器,新手最容易搞混。捕获过滤器(Capture Filter)在抓包前设置,语法是 BPF;显示过滤器(Display Filter)在抓包后筛选,语法是 Wireshark 自己的。实验报告里如果写错了位置,老师一眼就能看出来。

过滤器类型设置位置语法示例适用场景
捕获过滤器抓包前,网卡配置页tcp port 80流量大,只想抓特定端口
显示过滤器抓包后,顶部过滤栏http.request.method == "GET"已抓完,筛选分析

我一般会先不加捕获过滤器,抓全量,然后用显示过滤器慢慢筛。因为捕获过滤器一旦设错,包就永久丢了,没有后悔药。显示过滤器写错了顶多重新输入。

# 显示过滤器常用写法 tcp.port == 80 # 抓 80 端口 TCP http # 只看 HTTP ip.addr == 192.168.1.100 # 只看某 IP tcp.flags.syn == 1 && tcp.flags.ack == 0 # 只看 SYN 包

逻辑说明:tcp.flags.syn == 1 && tcp.flags.ack == 0是筛选 TCP 三次握手的第一个 SYN 包,这个写法在实验报告里分析握手过程时非常实用。参数上注意==和eq等价,但&&不能写成and(显示过滤器里and也可以,但&&更通用)。

2.3 时间戳格式和着色规则:让报告截图更专业

实验报告要截图,截图里时间戳如果是默认的「秒 since 1970」,老师看着费劲。改成「Time of Day」或者「Seconds Since Beginning of Capture」更直观。着色规则也建议调一下,把 TCP 重传、HTTP 错误标红,截图时重点一目了然。

操作路径:View → Time Display Format → Time of Day。着色规则在 View → Coloring Rules 里,可以基于tcp.analysis.retransmission加一条红色规则。

提示:截图前按 Ctrl+Shift+R 重新解析一下,避免缓存导致显示异常。

2.4 实验报告里必须体现的抓包证据链

一份能被认可的抓包分析,至少要包含:抓包时间、网卡、过滤器设置、关键包的展开截图(不是折叠的)、以及你对每个字段的解读。我见过太多报告只贴一张折叠的包列表,然后写「可以看到 TCP 握手成功」——这种报告拿不到高分。正确做法是展开 TCP 头部,标出 SYN、ACK、Seq、Ack 的具体值,然后解释为什么 Seq 和 Ack 是这样变化的。

3. Socket 编程实验:从 TCP 客户端到并发服务器的代码骨架

3.1 TCP 客户端的最小可运行代码与参数含义

重邮的 Socket 实验通常要求写一个 TCP 客户端和服务端,实现简单通信。下面是最小可运行版本,Python 写,因为库封装少,能看清每个系统调用的含义。

import socket # 创建 TCP socket client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 连接服务端,注意这里用的是元组 client.connect(('127.0.0.1', 8888)) # 发送数据,必须 encode 成 bytes client.sendall('Hello from client'.encode('utf-8')) # 接收响应,1024 是缓冲区大小 data = client.recv(1024) print('收到:', data.decode('utf-8')) client.close()

逻辑说明:AF_INET表示 IPv4,SOCK_STREAM表示 TCP。connect的参数是(host, port)元组。sendall会确保所有数据都发出去,比send更省心。recv(1024)的 1024 是单次最多接收的字节数,不是总长度——如果服务端发来 5000 字节,你可能要循环 recv。参数上,端口选 1024 以上避免权限问题,IP 用127.0.0.1本机测试最稳。

3.2 服务端 bind/listen/accept 的阻塞点在哪

服务端代码比客户端多几步,核心是bind、listen、accept。新手最常卡在accept上——程序跑起来没反应,其实是在等连接,这是正常的阻塞行为。

import socket server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 设置端口复用,避免重启时报 Address already in use server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) server.bind(('0.0.0.0', 8888)) # 0.0.0.0 表示监听所有网卡 server.listen(5) # 5 是等待队列长度 print('等待连接...') conn, addr = server.accept() # 阻塞在这里,直到有客户端连入 print('来自', addr) data = conn.recv(1024) print('收到:', data.decode('utf-8')) conn.sendall('Hello from server'.encode('utf-8')) conn.close() server.close()

逻辑说明:SO_REUSEADDR这个参数强烈建议加上,否则你每次重启服务端都要等几十秒端口释放,血泪经验。bind的0.0.0.0表示监听所有网卡,如果只写127.0.0.1则只有本机能连。listen(5)的 5 是半连接队列长度,不是最大连接数,别理解错。accept返回一个新的 socket 对象conn和客户端地址addr,后续通信都用conn,不是server。

3.3 多线程并发服务器:为什么你的服务端只能接一个客户端

上面的服务端处理完一个连接就退出了,实验里通常要求支持多个客户端同时连。加个threading就行。

import socket import threading def handle(conn, addr): try: data = conn.recv(1024) print(f'{addr} 说: {data.decode()}') conn.sendall(f'已收到 {len(data)} 字节'.encode()) finally: conn.close() server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) server.bind(('0.0.0.0', 8888)) server.listen(5) while True: conn, addr = server.accept() t = threading.Thread(target=handle, args=(conn, addr)) t.start()

逻辑说明:主线程只负责accept,每个连接丢给一个子线程处理。handle里用try/finally确保连接一定关闭。参数上,线程数没有硬限制,但实验环境里几十个并发就够了。注意print在多线程下可能交错,实验报告里不用纠结这个。

3.4 用 Wireshark 验证 Socket 通信的完整流程

代码跑通只是第一步,实验报告要求你用抓包验证。启动 Wireshark 抓 Loopback(如果本机通信)或对应网卡,然后运行客户端。你应该能看到:三次握手(SYN、SYN-ACK、ACK)、数据传输(PSH-ACK)、四次挥手(FIN-ACK)。把每个阶段的包展开,对照代码里的connect、sendall、close解释。

注意:本机通信走 Loopback 网卡,Wireshark 里显示为「Adapter for loopback traffic capture」,不是以太网网卡。

4. 协议分析实验:HTTP、TCP、IP 三层怎么串起来看

4.1 HTTP 请求响应的字段逐行解读

HTTP 实验通常要求你访问一个网页,抓包并分析请求行、请求头、响应行、响应头。以访问一个简单页面为例,显示过滤器写http,找到 GET 请求,展开 Hypertext Transfer Protocol。

关键字段:Request Method(GET/POST)、Host(目标域名)、User-Agent(客户端标识)、Accept(可接受类型)。响应里看Status Code(200/404/304)、Content-Type、Content-Length。实验报告里要解释 304 和 200 的区别——304 是缓存命中,没有响应体,这个点很多报告漏掉。

# 只看某个域名的 HTTP 请求 http.host == "example.com" && http.request # 只看响应状态码非 200 的 http.response.code != 200

逻辑说明:http.host匹配 Host 头,http.request是布尔字段表示这是请求。组合起来能快速定位。参数上注意!=在显示过滤器里是合法的。

4.2 TCP 三次握手与四次挥手的时序图怎么画

实验报告里画时序图是加分项。不用 Visio,用 Wireshark 自带的 Flow Graph 就行:Statistics → Flow Graph → 选 TCP Flows。它会自动生成客户端和服务端的箭头图,你截图后标注 Seq/Ack 变化即可。

三次握手的关键:客户端发 SYN(Seq=0),服务端回 SYN-ACK(Seq=0, Ack=1),客户端再发 ACK(Seq=1, Ack=1)。注意这里的 Seq 是相对值,Wireshark 默认显示相对序号,可以在 TCP 协议偏好里关掉。

四次挥手:主动关闭方发 FIN,对方回 ACK,对方也发 FIN,主动方回 ACK。为什么是四次不是三次?因为 TCP 是全双工,两个方向要各自关闭。这个点在实验报告里必须写清楚,是高频考点。

4.3 IP 分片与 TTL:用 ping 命令构造实验条件

IP 层实验常涉及分片和 TTL。用ping加-l(Windows)或-s(Linux)指定数据包大小,超过 MTU 就会分片。

# Windows:发送 3000 字节的 ping,强制分片 ping -l 3000 192.168.1.1 # Linux:发送 3000 字节,禁止分片(-M do) ping -s 3000 -M do 192.168.1.1

逻辑说明:-l 3000在 Windows 下指定载荷大小,加上 IP 头和 ICMP 头会超过 1500 MTU,触发分片。Wireshark 里过滤icmp能看到多个分片包,每个包的Flags字段有More fragments标记,最后一个分片该标记为 0。参数上,-M do是 Linux 下禁止分片,用来探测路径 MTU,如果包太大且禁止分片,会收到 ICMP 不可达。

4.4 用过滤表达式把三层协议关联起来

实验报告的高阶要求是展示你理解协议栈的封装关系。在 Wireshark 里选中一个 HTTP 包,展开 Frame → Ethernet → IP → TCP → HTTP,逐层截图。然后写一段话解释:HTTP 报文作为 TCP 载荷,TCP 段作为 IP 载荷,IP 包作为以太帧载荷。

# 找一个同时包含 HTTP 和 TCP 的包 http && tcp # 查看某个 TCP 流的所有包 tcp.stream == 0

逻辑说明:tcp.stream == 0是跟踪某一条 TCP 连接的所有包,编号从 0 开始。这个过滤器在分析完整会话时非常有用,比手动找包高效得多。

5. 实验报告避坑:五个让老师皱眉的常见问题

5.1 截图没有时间戳和过滤器信息

现象:报告里贴的 Wireshark 截图只有包列表,看不出抓包时间和过滤条件。原因:截图时没调整列显示,或者截了折叠状态的包。解决:截图前确保时间列可见,过滤栏在截图范围内,关键包展开到字段级别。我一般会截两张——一张全景带过滤器,一张展开细节。

5.2 Socket 代码端口被占用报 Address already in use

现象:服务端第二次运行时报OSError: [Errno 98] Address already in use。原因:上一次的连接处于 TIME_WAIT 状态,端口没释放。解决:加setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1),这一行能省你几十秒等待。如果还不行,换个端口,或者等 30 秒。

5.3 抓包抓不到本机通信的流量

现象:客户端和服务端都在本机跑,Wireshark 选以太网网卡抓不到任何包。原因:本机通信走 Loopback,不走物理网卡。解决:Wireshark 里选「Adapter for loopback traffic capture」,Windows 下如果没有这个选项,需要装 Npcap 时勾选 Loopback 支持。Linux 下直接抓lo网卡。

5.4 HTTP 实验里 304 响应被误判为错误

现象:报告里写「服务器返回 304,说明请求失败」。原因:不理解 304 是缓存协商成功,不是错误。解决:304 表示客户端缓存还有效,服务端告诉客户端直接用缓存,没有响应体。实验报告里应该解释这是 HTTP 缓存机制的正常行为,不是 bug。

5.5 时序图 Seq/Ack 标注错误

现象:报告里画的时序图 Seq 和 Ack 对不上,或者把相对序号当绝对序号。原因:Wireshark 默认显示相对序号,第一次握手 Seq=0,但实际绝对序号是随机的。解决:要么在 TCP 偏好里关掉相对序号显示绝对序号,要么在报告里注明「以下均为相对序号」。我一般选后者,因为绝对序号太长,画图不好看。

6. 进阶技巧:用 tcpdump 和 Python 脚本自动化验证实验结论

实验报告写到后面,手动抓包分析效率太低。我后来养成的习惯是:用 tcpdump 在后台抓包,用 Python 脚本解析 pcap 文件,自动统计握手次数、重传率、HTTP 状态码分布。这样报告里的数据是脚本跑出来的,不是肉眼数的,可信度高一个档次。

from scapy.all import rdpcap, TCP, IP packets = rdpcap('capture.pcap') syn_count = 0 retrans_count = 0 for pkt in packets: if TCP in pkt: flags = pkt[TCP].flags if flags == 'S': # SYN 包 syn_count += 1 if pkt[TCP].seq in seen_seq: retrans_count += 1 seen_seq.add(pkt[TCP].seq) print(f'SYN 包数量: {syn_count}') print(f'疑似重传: {retrans_count}')

逻辑说明:rdpcap读取 pcap 文件,TCP in pkt判断是否 TCP 包。flags == 'S'匹配纯 SYN 包。重传检测用 Seq 重复来判断,简单但有效。参数上,Scapy 需要单独安装(pip install scapy),读取大文件时内存占用较高,实验级别的 pcap 通常几 MB,没问题。

用 tcpdump 抓包的典型命令:

# 抓 80 端口,写文件,限制 1000 个包 tcpdump -i any -w capture.pcap port 80 -c 1000 # 读取并显示 HTTP 请求 tcpdump -r capture.pcap -A 'tcp port 80 and tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420'

逻辑说明:-i any监听所有网卡,-w写文件,-c限制包数。第二条命令里的tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420是匹配 TCP 载荷前 4 字节为GET(0x47455420 是 GET 加空格的十六进制),这个表达式在实验报告里写出来很显功底。

最后说个我自己的习惯:每次实验报告提交前,我会把 Wireshark 的 pcap 文件、Python 分析脚本、截图一起打包,报告里只放结论和关键截图。这样老师如果质疑数据,我能立刻拿出原始文件复现。这个习惯让我在后来做 devops 相关工作时也受益——任何结论都要有可复现的证据链。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询