简介:西北工业大学软件学院计算机网络实验报告,聚焦HTTP协议深度探索,面向网络工程、计算机及相关专业学生,也可供自学者巩固Wireshark抓包分析技能。报告完整覆盖四个核心实验:基础GET/响应交互(含HTTP版本、可接受语言、状态码200、内容大小等)、条件GET响应(IF-MODIFIED-SINCE头与304状态码)、长文档检索(分块传输与多个TCP段)以及HTML文档嵌入对象分析(多GET请求与CDN交互)。每个实验均给出操作步骤、Wireshark截图、关键字段解析与结果说明,便于对照复现。资源包共1个doc文件,约6.62MB,结构紧凑,既有理论要点又有实操细节。已有1631人学习下载,对于课程实验、期末复习或想深入理解HTTP协议与网络数据包分析的读者,是实用性较强的参考资料。 西北工业大学软件学院的计算机网络实验,应该是很多同学大学四年里第一次认真对待Wireshark和路由器配置的时刻。说实话,我当年做这门实验课的时候也踩了不少坑,比如抓包抓不到三次握手、配路由把整个拓扑搞到不通、Socket编程一运行就报错。等到后来帮学弟学妹调了无数次实验,才发现大部分问题其实都集中在几个共同的节点上。
这篇内容我把计算机网络实验从环境搭建、协议抓包分析、子网划分与路由配置,到Socket编程和实验报告撰写,按实际操作顺序重新理了一遍。适合正在做计算机网络实验的同学参考,也适合准备考研复试、想快速把网络实验核心知识串起来的人。讲的都是实际能落地的操作,不是教科书式罗列。
1. 实验环境搭建与工具选型
1.1 需要准备哪些软件
我们学院计算机网络实验涉及到的工具相对固定,主要是三类:抓包分析类、拓扑模拟类和代码编写类。
- Wireshark:抓包分析HTTP、TCP、UDP等协议报文,实验报告里的大多数截图都靠它。
- Cisco Packet Tracer 或华为eNSP:做路由器、交换机配置实验。软院课程里两种都会用到,Cisco的模拟器更常见,eNSP更贴近国内设备。
- VS Code或IDEA:跑Socket网络编程实验,语言不限,Java、Python、C++都行,我们当时大二的主语言是Java,也有人用Python。
建议在实验开始前就把这几个工具装好并验证能运行。Packet Tracer和eNSP对系统环境要求不高,但Windows下安装eNSP需要WinPcap或NPcap支持,装完以后第一次启动如果提示抓包失败,就是这两个依赖没装好。Wireshark安装时也会自动装NPcap,所以安装顺序最好是先装Wireshark,再装eNSP。
1.2 软件安装常见问题
我在帮同学处理安装问题的时候,碰到最多的是下面几个:
- eNSP启动时提示“未安装Wireshark”或“未安装VirtualBox”,即使你明明装了Wireshark。原因是eNSP只识别默认安装路径,如果你的Wireshark安装在非C盘默认目录,它就可能检测不到。解决方案:重新安装Wireshark到默认路径,或者手动配置eNSP的工具路径。
- Packet Tracer运行时的界面卡顿。这个一般是老版本兼容性问题,建议直接使用较新版本。
- Wireshark无法开始捕获,提示“您没有权限”。Windows下需要以管理员身份运行Wireshark,Linux下需要把当前用户加入wireshark组并重新登录。
这些看起来都是小事,但在实验课上会很浪费时间。我通常建议在实验前一天的晚上就把环境全部验证一遍,确认能正常抓包、能正常启动模拟器,第二天到了机房直接开始干活。
2. 三次握手与Wireshark抓包分析
2.1 抓包快速上手
协议分析实验是计算机网络实验的重头戏,最常见的任务就是用Wireshark捕获TCP三次握手过程,分析SYN、SYN-ACK、ACK三个报文段的标志位和序号变化。
快速上手步骤其实不复杂:
- 打开Wireshark,选择当前联网的网卡,开始捕获。
- 在浏览器地址栏访问一个HTTP网站。
- 停止捕获,在过滤栏输入
tcp.flags.syn==1,筛选出所有SYN报文。
这里有一个很多人没注意到的点:Wireshark默认抓取的是当前网卡的流量,但如果你访问的网站是HTTPS,那么内容区域会有TLS加密,你只能看到握手过程,看不到HTTP明文内容。实验报告如果需要HTTP报文分析,建议访问一个HTTP站点,或者用Wireshark打开预先保存的抓包文件。
还有一个重点,三次握手的筛选不要只过滤tcp.flags.syn==1,因为SYN报文有两次(第一次握手和第二次握手都带SYN标志,只是第二次还带ACK)。要区分客户端和服务端,可以加上ip.addr==你的本机IP,这样就能快速定位本机发起的连接。
2.2 TCP序号和确认号的查看
抓包拿到三次握手报文后,重点看TCP头部里的Sequence Number和Acknowledgment Number。我们当时实验报告里要求标注三次握手各自的序号关系。
- 第一次握手,客户端发送SYN,假设序号是x,此时确认号为0(无效),标志位SYN置1。
- 第二次握手,服务端回复SYN-ACK,序号为y,确认号为x+1。
- 第三次握手,客户端发送ACK,序号为x+1,确认号为y+1。
这里初学者容易犯迷糊的地方在于,为什么确认号要加1。因为SYN报文会占用一个序号,即使它不携带任何数据,所以接收方在确认的时候要在收到的序号基础上加1。这个细节在期末复习时也经常考,理解之后比死记硬背管用得多。
提示:Wireshark显示的是相对序号(Relative Sequence Number)还是绝对序号,可以在“视图->首选项->Protocols->TCP”里切换。实验报告建议开启相对序号,数字更小,更直观。
抓包实验除了三次握手,还有一个很常见的任务是用过滤找到TCP挥手过程的FIN报文,分析四次挥手。挥手比握手多了一次报文,是因为TCP是全双工通信,两端必须各自关闭自己的发送通道。这个原理不难,但分析FIN-ACK和最后的TIME_WAIT状态时,如果对状态转换不熟就会卡住。
3. 子网划分与路由配置实操
3.1 子网划分的思路
子网划分实验看似是纯算术题,但在模拟器里一配就容易出问题。原因在于很多人只算IP范围,没有把网络地址、广播地址、可用主机数和路由条目对应起来。
举个例子,一个常见的任务是把192.168.1.0/24划分成4个子网,每个子网至少能容纳50台主机。计算思路是这样的:需要至少6位主机位(2的6次方减2等于62,满足50台),所以掩码是/26,即255.255.255.192,可以划出4个子网,分别是192.168.1.0/26、192.168.1.64/26、192.168.1.128/26、192.168.1.192/26。
我在模拟器里演示的时候,同学们最容易犯的错是直接把主机IP填成广播地址,或者把网关填成了网络地址。这里有个简单的方法,把子网划分和VLAN设计、IP地址规划放在一起理解:
- 网络地址:主机位全0,不能分配给设备。
- 广播地址:主机位全1,不能分配给设备。
- 可用地址:网络地址+1到广播地址-1。
如果你是用Cisco Packet Tracer做这个实验,建议把每个子网的第一个可用地址分配给路由器接口,作为网关;把后面的地址分配给终端设备。这样整个拓扑会清晰很多,路由配置也不容易混乱。
3.2 静态路由与RIP配置
路由配置实验一般从静态路由开始,再到动态路由RIP。静态路由的核心命令就一条:
ip route 目标网络地址 子网掩码 下一跳地址例如从Router0配置到192.168.2.0/24网络的静态路由,下一跳是Router1的接口地址192.168.1.2:
Router0(config)# ip route 192.168.2.0 255.255.255.0 192.168.1.2这里需要特别注意,下一跳地址必须是直连链路上对端设备的接口IP,不能填自己这边的接口IP,也不能填非直连网络的地址。很多同学在这里容易晕,其实只需要记住:路由器转发数据包时,只知道把包交给下一跳,但下一跳必须在自己的直连网络内。
RIP配置相对简单,因为它只需要声明哪些直连网络参与RIP进程,路由器会自动学习路由:
Router0(config)# router rip Router0(config-router)# version 2 Router0(config-router)# network 192.168.1.0 Router0(config-router)# network 192.168.0.0 Router0(config-router)# no auto-summary尤其要注意no auto-summary这一句,如果不关闭自动汇总,RIPv2在处理不连续子网时会自动把路由汇总成主类网络,导致路由学习和转发出错。这是实验中非常经典的一个坑。
3.3 常见配置错误
模拟器配置实验中的常见错误,我整理了一张排查清单:
| 现象 | 可能原因 | 排查命令 |
|---|---|---|
| ping不通对端 | 静态路由缺失或下一跳错误 | show ip route |
| 直连网络ping通,跨网段不通 | 缺少回程路由 | show ip route + ping |
| 动态路由学不到 | RIP版本不一致或网络声明缺失 | show ip rip database / show running-config |
| VLAN间无法通信 | Trunk未配置或子接口封装错误 | show interfaces trunk / show vlan |
排查时有个习惯特别重要:先看路由表,再ping,不要盲目尝试。路由表show ip route一看就知道路由有没有生效,省去大部分猜测。
注意:模拟器里ping默认发5个ICMP报文,如果显示
U.U.U,表示目标不可达,通常是路由问题;如果是.....,表示请求超时,可能是链路或接口问题,两者含义不同。
4. Socket编程:从半懂不懂到能应付验收
4.1 TCP编程框架
Socket编程实验通常是做一个简单的TCP聊天程序或文件传输程序,目的是理解传输层的可靠连接机制。实验验收时老师一般会看两端是否能正常通信,然后问几个关于三次握手和缓冲区的问题。
以Java为例,一个最简单的TCP服务端长这样:
ServerSocket server = new ServerSocket(8080); Socket socket = server.accept(); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); String line = in.readLine(); System.out.println("收到客户端消息: " + line); socket.close(); server.close();客户端长这样:
Socket socket = new Socket("127.0.0.1", 8080); PrintWriter out = new PrintWriter(socket.getOutputStream(), true); out.println("hello, server"); socket.close();代码本身不难,但验收时经常出的问题有几个:服务端没有先启动、端口被占用、防火墙拦截、中文乱码、输入输出流没有flush。
我这里重点说一下flush。PrintWriter构造函数第二个参数传true表示自动刷新缓冲区,如果你用的是new PrintWriter(out),那么写完数据后必须手动flush(),否则数据会停留在发送缓冲区,服务端一直收不到。这是实际编码里最常见的bug,比逻辑错误更隐蔽。
4.2 UDP编程差异
如果实验要求同时实现UDP通信,需要注意UDP和TCP在使用上的三个差异:
- UDP需要先创建
DatagramSocket,每次发送都需要同时指定目的IP和端口。 - UDP没有连接,服务端和客户端是平等关系,都可以先发数据。
- UDP发送的是
DatagramPacket,必须手动构造字节数组、长度、地址、端口。
UDP发送端的核心代码:
DatagramSocket socket = new DatagramSocket(); byte[] data = "hello".getBytes(); InetAddress addr = InetAddress.getByName("127.0.0.1"); DatagramPacket packet = new DatagramPacket(data, data.length, addr, 9090); socket.send(packet); socket.close();接收端:
DatagramSocket socket = new DatagramSocket(9090); byte[] buffer = new byte[1024]; DatagramPacket packet = new DatagramPacket(buffer, buffer.length); socket.receive(packet); String msg = new String(packet.getData(), 0, packet.getLength()); System.out.println(msg); socket.close();UDP实验里大家问得最多的问题是:为什么接收端只能收到一次数据?其实UDP本身是无状态的,如果你希望持续接收,就要把receive()放进一个while循环里,并且服务端不能关闭socket。
4.3 验收时的常见提问
我们当时Socket编程验收,老师经常现场改几个点来考察理解深度:
- 如果把服务端的accept()注释掉,客户端能连上吗?答案是连不上,客户端会抛出ConnectException。
- 如果客户端不发送数据,直接关闭socket,服务端的readLine()会返回什么?答案是返回null,因为连接关闭后读取流到达末尾。
- 如果同时服务多个客户端,单线程的accept()可以吗?答案是只能逐个处理,一个客户端不释放连接,后面的客户端就会一直阻塞。
这些问题其实都是对Socket底层机制的理解,跟实验报告写得是否华丽没关系。能把这些问题回答清楚,比在报告里堆几十页截图要实在得多。
5. 实验报告撰写的经验
5.1 报告结构
实验报告是我们学院网络课程考核的重要环节。我看了不少同学的报告,发现普遍存在的问题是:截图多、分析少,配置命令贴了一整页,但是没有任何对数据包或配置结果的解读。
一份合格的计算机网络实验报告,建议按这个结构走:
- 实验目的:简要说明本次实验验证的网络原理。
- 实验环境:操作系统、工具版本、网络拓扑描述。
- 实验步骤:按操作顺序描述,每步插入关键截图和关键配置。
- 结果分析:这是得分关键,对截图中的关键字节、关键字段进行解释。
- 问题与解决:记录实验中遇到的问题和排查过程。
- 实验结论:总结对协议或机制的深入理解。
我特别想强调“结果分析”这一块。比如抓包截图里TCP报文段的源端口和目的端口分别是什么,SYN标志位为什么要置1,确认号为什么比序号大1;路由配置截图里路由表出现了哪几条条目,这些条目是从直连、静态还是动态学到的。把这些写清楚,老师一眼就能看出你是不是真的做过实验,而不是复制粘贴。
5.2 截图与数据分析技巧
截图看似简单,实际有讲究。我们学院实验报告要求尽量用中文标注,所以截图之后最好用画图工具或截图软件在关键字段上画圈、画箭头。这里分享几个提升报告质量的小技巧:
- 抓包截图要保证能看到TCP头部展开区域,不要只截一个包列表,因为标志位、序号、确认号都在展开区域里。
- 路由配置截图不要只用
show running-config,最好再配一张show ip route的结果,两者结合才能证明配置已生效。 - 截图里的IP地址、端口、MAC地址要用文字在旁边标注出来,避免老师在几十个相似截图里找关键信息。
- 对于动态路由实验,建议写清楚收敛时间或路由条目的变化过程,比如RIP默认30秒发送一次路由更新,收敛过程中路由表会发生短暂变化,这是很好的分析素材。
提示:实验报告排版不要出现大段代码贴图,尤其是模拟器命令行输出。用代码块或者表格整理关键配置,看起来更清爽,也更好写分析。
另外,报告的“问题与解决”部分一定不要空着。哪怕你全程没遇到问题,也建议写一两个自己主动排查的细节,比如“关闭防火墙后UDP通信正常”或者“修改MTU后大数据包不再分片失败”。这类内容恰恰能反映你对网络协议的理解深度,也是老师判定“独立完成”的重要依据。
6. 实验过程中的几点体会
最后聊几点我自己的体会。计算机网络实验和纯理论课最大的区别在于,你必须同时建立“宏观拓扑”和“微观报文”两套视角。配路由时脑子里面是整个网络的路径视图,抓包时又要在报文字节层面看标志位、看序号,大部分同学在两者之间切换时容易懵,这很正常。我的建议是每做一个实验,先用一个整体Top图把数据流路径画出来,再针对路径上的关键节点做抓包确认,这样既不会在配置里迷失,也不会在看报文时忘了这条流是从哪到哪。
再说说时间安排。实验报告尽量在实验当天趁热写,尤其是抓包分析和路由表分析的部分,隔一天再看截图,可能已经想不起来当时为什么这么配了。如果遇到实验课上没调通的情况,一定要在报告里记录当时的报错信息、排查命令和最终的解决办法,这是最真实也最宝贵的实验数据。
还有一个小技巧,期末复习计算机网络的时候,把实验报告里的抓包截图和配置命令当复习资料是很有用的。三次握手、四次挥手、RIP路由更新、TCP重传机制这些高频考点,都能在实验记录里找到对应的实证,理解起来比单纯看课本快得多。希望大家实验顺利。
本文还有配套的精品资源,点击获取