☰
华科计院网络实验报告:从VLAN划分到SOCKET编程的完整链路
2026/10/9 3:58:24 网站建设 项目流程

简介:这份华中科技大学计算机学院《计算机网络》实验报告,面向正在学习网络课程、需要完成组网与路由配置实验的高校学生及自学者。内容围绕IP协议、网络层与数据链路层协议、子网划分、RIP与OSPF路由协议、路由器及二/三层交换机配置、VLAN划分和访问控制列表等核心知识点展开,结合Boson Netsim仿真软件,完整呈现了从拓扑搭建、IP地址规划到路由协议配置与连通性测试的全过程,适合作为课程实验参考与期末复习材料。资源包内含1个docx文档,约215KB,结构紧凑,便于直接查阅与整理。目前已有83人学习下载。读者可借此了解实验目的、操作步骤与配置命令,掌握子网地址规划、路由器端口及子接口配置、RIP与OSPF动态路由实现等实践技能,并对照思考题深化对网络协议工作机制的理解,提升网络工程与管理的动手能力。

1. 从一份华科计院实验报告说起:网络组建与 SOCKET 编程到底练什么

如果你正在搜「华中科技大学计算机学院实验报告」,大概率不是想抄一份交差,而是想找一份能把网络组建、路由配置、VLAN 划分、ACL 访问控制、SOCKET 编程串起来的完整参考。这份《计算机网络》实验报告来自华中科技大学计算机学院,作者是姚富品和刘华涧,学号 U202213625,班级 Cs1105,两人奉献占比 40% 和 60%。报告分两大部分:试验一用 Boson Netsim 5.31 在 Windows 7 下做网络组建与实施,试验二用 Visual Studio 写 C++ FTP 客户端。它最大的价值不是「答案」,而是一条从 IP 规划到路由协议、从 VLAN 隔离到 ACL 过滤、再到应用层 Socket 通信的完整链路。适合正在做课设、准备网络实验答辩、或者想补网络实操经验的人。下面我按「资源是什么 → 怎么用 → 坑在哪」拆开讲。

2. 试验一网络组建:IP 规划、子网划分与 Boson Netsim 拓扑落地

2.1 为什么先用 Boson Netsim 而不是直接上真机

这份报告选的是 Boson Netsim 5.31 仿真软件,跑在 Windows 7 上。很多人第一反应是「为什么不用 Packet Tracer 或 eNSP」,其实在当年高校网络实验里,Boson Netsim 的命令行还原度更接近真实 Cisco IOS,尤其是int fa0/1.1这种子接口配置、cl ra 64000时钟频率设置,语法和真机几乎一致。它的拓扑设计器叫 Net Designer,先画图再转到 NetSim 里配命令,这个流程和实际工程里「先出拓扑图再上架配置」的习惯是对得上的。

选仿真而不是真机的理由很直接:真机做 VLAN 和 ACL 实验,配错一条access-group就可能把自己 Telnet 通道断掉,恢复得去机房插 Console 线。仿真里最坏就是重启拓扑,试错成本几乎为零。但仿真也有边界——它不模拟真实流量拥塞、不模拟硬件故障,所以报告里反复强调「测试连通性」这一步不能省,因为仿真里通不代表真机一定通。

2.2 第一项试验:同网段与跨网段 IP 规划的具体配法

报告里第一项试验要求把 PC1、PC2 放在 192.168.0.0/24,PC3~PC8 放在 192.168.1.0/24,同时给路由器配端口地址,让两个子网互通。后来要求变更为三个网段:PC1/PC2 在 192.168.0.0,PC3/PC5/PC7 在 192.168.1.0,PC4/PC6/PC8 在 192.168.2.0。这里的关键是路由器 fa0/1 要配子接口,也就是单臂路由的雏形。

具体 IP 规划如下表:

设备IP 地址子网掩码默认网关
PC1192.168.0.2255.255.255.0192.168.0.1
PC2192.168.0.3255.255.255.0192.168.0.1
PC3192.168.1.2255.255.255.0192.168.1.1
PC4192.168.2.2255.255.255.0192.168.2.1
PC5192.168.1.3255.255.255.0192.168.1.1
PC6192.168.2.3255.255.255.0192.168.2.1
PC7192.168.1.3255.255.255.0192.168.1.1
PC8192.168.2.3255.255.255.0192.168.2.1

路由器配置命令如下:

Router>enable Router#conf t Router(config)#int fa0/0 Router(config-if)#ip addr 192.168.0.1 255.255.255.0 Router(config-if)#no shutdown Router(config-if)#exit Router(config)#int fa0/1 Router(config-if)#no shutdown Router(config-if)#exit Router(config)#int fa0/1.1 Router(config-subif)#ip addr 192.168.1.1 255.255.255.0 Router(config-subif)#no shutdown Router(config-subif)#exit Router(config)#int fa0/1.2 Router(config-subif)#ip addr 192.168.2.1 255.255.255.0 Router(config-subif)#no shutdown Router(config-subif)#end

逻辑说明:fa0/0 是物理接口,直接配 192.168.0.1 作为 PC1/PC2 的网关。fa0/1 本身不配 IP,只no shutdown激活,然后在其下建两个子接口 fa0/1.1 和 fa0/1.2,分别对应 VLAN 场景下的两个网段。参数上,子接口号.1和.2只是逻辑标识,真正决定网段的是ip addr后面的地址。这里有个容易翻车的点:如果 fa0/1 主接口没no shutdown,子接口即使配了 IP 也不通,因为物理层没起来。

2.3 第二项试验:RIP 与 OSPF 配置及时钟频率的坑

第二项试验要求四台路由器互联,PC1~PC4 分别处于 192.168.1.0 到 192.168.4.0 四个网段,先配 RIP 再配 OSPF。报告里 Router1 到 Router4 的串口配置都带了cl ra 64000,也就是 clock rate 64000。思考题专门问「不设置时钟频率会出什么现象」——答案是 DCE 端不提供时钟,DTE 端链路起不来,串口状态会停在 down,路由协议邻居关系根本建立不了。

RIP 配置以 Router1 为例:

Router1>enable Router1#conf t Router1(config)#router rip Router1(config-router)#network 192.168.0.0 Router1(config-router)#network 192.168.4.0 Router1(config-router)#network 192.168.5.0 Router1(config-router)#end

逻辑说明:router rip进入 RIP 配置模式,network后面跟的是主类网络号,不是子网号。比如 192.168.4.0/24 要写成network 192.168.4.0,不能写成network 192.168.4.0 255.255.255.0,因为 RIP v1 不支持变长子网掩码。参数上,Router1 连接了 192.168.0.0(fa0/0)、192.168.4.0(s0)、192.168.5.0(s1),所以三个都要宣告。如果漏掉一个,对端路由器就学不到那条路由,ping 不通是必然的。

OSPF 配置思路类似,但命令是router ospf 1加network 192.168.x.0 0.0.0.255 area 0,反掩码写法是新手最容易写错的地方。常见做法是先用 RIP 跑通,再换 OSPF 对比收敛速度,报告里也是这个顺序。

3. 试验一进阶:VLAN 划分、Trunk 链路与单臂路由互通

3.1 VLAN 数据库模式与 VTP 域配置

第三项试验在第二项基础上做 VLAN 划分,要求把交换机 2、3、4 组成的网络分成两个 VLAN:PC3/PC5/PC7 在一个 VLAN,PC4/PC6/PC8 在另一个 VLAN。报告里用的是vlan database模式,这是 Boson Netsim 和旧版 Cisco 交换机的写法,新版本 IOS 已经改成全局配置模式下的vlan 2直接创建。

Switch#vlan database Switch(vlan)#vtp domain class Switch(vlan)#vlan 2 name Class1 Switch(vlan)#vlan 3 name Class2 Switch(vlan)#ctrl-z

逻辑说明:vtp domain class把三台交换机划到同一个 VTP 管理域,这样在 switch2 上创建的 VLAN 会自动同步到 switch3 和 switch4。参数上,VLAN 2 命名为 Class1,VLAN 3 命名为 Class2,注意 VLAN 1 是默认存在的,不能删除也不能改名。这里有个血泪经验:如果 VTP 域名字大小写不一致,比如一台写class另一台写Class,VLAN 信息同步会失败,而且不会报错,只能靠show vtp status去查。

3.2 端口划分与 Trunk 链路配置

端口划分到 VLAN 的命令:

Switch#conf t Switch(config)#int fa0/4 Switch(config-if)#switchport mode access Switch(config-if)#switchport access vlan 2 Switch(config)#exit Switch(config)#int fa0/5 Switch(config-if)#switchport mode access Switch(config-if)#switchport access vlan 3 Switch(config)#ctrl-z Switch#show vlan

逻辑说明:switchport mode access把端口设为接入模式,switchport access vlan 2把该端口划入 VLAN 2。fa0/4 接 PC3/PC5/PC7 所在网段,fa0/5 接 PC4/PC6/PC8。show vlan用来验证划分结果,重点看端口有没有出现在正确的 VLAN 行里。

Trunk 链路配置:

Switch#en Switch#conf t Switch(config)#int fa0/2 Switch(config-if)#switchport mode trunk Switch(config-if)#switchport trunk encap dot1q Switch(config)#exit Switch(config)#int fa0/3 Switch(config-if)#switchport mode trunk Switch(config-if)#switchport trunk encap dot1q Switch(config)#ctrl-z

逻辑说明:交换机之间互联的端口必须配成 trunk,否则 VLAN 信息过不去。switchport trunk encap dot1q指定 802.1Q 封装,这是 VLAN 标签的标准协议。参数上,fa0/2 和 fa0/3 分别连向相邻交换机,switch3 和 switch4 的对应端口也要做同样配置。如果 trunk 两端封装不一致,比如一端 dot1q 一端 isl,链路会起不来,show interface trunk能看到状态是 not-trunking。

3.3 单臂路由让两个 VLAN 互通

VLAN 划分完后,两个 VLAN 之间默认隔离。要让它们互通,需要在路由器上配子接口并封装 dot1q:

Router(config)#int fa0/1 Router(config-if)#no shutdown Router(config-if)#exit Router(config)#int fa0/1.1 Router(config-subif)#encap dot1q 1 Router(config-subif)#ip addr 192.168.1.1 255.255.255.0 Router(config-subif)#no shutdown Router(config-subif)#exit Router(config)#int fa0/1.2 Router(config-subif)#encap dot1q 2 Router(config-subif)#ip addr 192.168.2.1 255.255.255.0 Router(config-subif)#no shutdown Router(config-subif)#end

逻辑说明:encap dot1q 1和encap dot1q 2里的数字是 VLAN ID,必须和交换机上创建的 VLAN 号对应。子接口 fa0/1.1 对应 VLAN 1,fa0/1.2 对应 VLAN 2。参数上,IP 地址分别作为两个 VLAN 的网关。这里注意,报告里 VLAN 编号和子接口编号有交叉,实际配置时以encap dot1q后面的 VLAN ID 为准,子接口号只是本地标识。

4. 试验二 SOCKET 编程:FTP 客户端从一级到五级的实现路径

4.1 为什么选 FTP 客户端而不是简单的 TCP Echo

试验二要求用 C++ 在 Visual Studio 里写一个 FTP 客户端,分五级要求。第一级只要求指定 IP 和端口、支持 PORT/PASV 两种模式、匿名和用户名登录、目录浏览切换、单线程上传下载、主动断开。第五级要求多线程同时下载多个文件、每个线程有进度指示、GUI 友好。这个梯度设计很合理:FTP 协议本身覆盖了控制连接和数据连接分离、主动被动模式切换、文件传输完整性校验,比写一个 Echo 服务器能练到的 Socket 知识点多得多。

报告里用的 FTP 服务器是 Xlight FTP 服务器,测试账号用户名 12345、密码 12345。这个组合在局域网实验里够用,但要注意 Xlight 默认被动模式端口范围可能和防火墙冲突,如果 PASV 连不上,先检查服务器端的被动端口设置。

4.2 控制连接与数据连接的 Socket 建立流程

FTP 客户端最核心的逻辑是两条连接:控制连接走 21 端口,发命令收响应;数据连接在 PORT 或 PASV 模式下动态建立。以 PASV 模式为例,客户端先发PASV,服务器返回一个 IP 和端口,客户端再向那个端口发起数据连接。

// 控制连接建立 SOCKET ctrlSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); sockaddr_in serverAddr; serverAddr.sin_family = AF_INET; serverAddr.sin_port = htons(21); serverAddr.sin_addr.s_addr = inet_addr("192.168.1.100"); connect(ctrlSock, (sockaddr*)&serverAddr, sizeof(serverAddr)); // 接收服务器欢迎信息 char recvBuf[1024]; recv(ctrlSock, recvBuf, sizeof(recvBuf), 0); // 发送用户名 send(ctrlSock, "USER 12345\r\n", strlen("USER 12345\r\n"), 0); recv(ctrlSock, recvBuf, sizeof(recvBuf), 0); // 发送密码 send(ctrlSock, "PASS 12345\r\n", strlen("PASS 12345\r\n"), 0); recv(ctrlSock, recvBuf, sizeof(recvBuf), 0);

逻辑说明:socket创建 TCP 套接字,connect连接服务器 21 端口。FTP 命令必须以\r\n结尾,这是协议规定,少一个字符服务器就不解析。recv接收响应,实际工程里要循环读到\r\n结尾才算一条完整响应,这里简化成一次接收。参数上,htons(21)把主机字节序转网络字节序,inet_addr把点分十进制 IP 转成网络地址结构。

PASV 模式数据连接:

// 发送 PASV 命令 send(ctrlSock, "PASV\r\n", strlen("PASV\r\n"), 0); recv(ctrlSock, recvBuf, sizeof(recvBuf), 0); // 解析响应,格式如 227 Entering Passive Mode (192,168,1,100,10,20) // 提取 IP 和端口,端口 = 10*256 + 20 int dataPort = 10 * 256 + 20; SOCKET dataSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); sockaddr_in dataAddr; dataAddr.sin_family = AF_INET; dataAddr.sin_port = htons(dataPort); dataAddr.sin_addr.s_addr = inet_addr("192.168.1.100"); connect(dataSock, (sockaddr*)&dataAddr, sizeof(dataAddr)); // 发送 RETR 命令下载文件 send(ctrlSock, "RETR test.txt\r\n", strlen("RETR test.txt\r\n"), 0); // 从 dataSock 接收文件内容

逻辑说明:PASV 响应里的括号内六个数字,前四个是 IP,后两个是端口的高字节和低字节。端口计算公式是高字节 * 256 + 低字节。参数上,RETR是下载命令,STOR是上传命令。数据连接建立后,文件内容从 dataSock 读写,控制连接继续用来发命令和收响应。这里最容易翻车的是 PASV 响应解析,不同服务器返回格式略有差异,有的带括号有的不带,解析时要容错。

4.3 断点续传与文件校验的实现思路

第四级要求断点续传,第五级要求多线程。断点续传的核心是REST命令,告诉服务器从文件的第几个字节开始传:

// 获取本地已下载文件大小 long long localSize = getFileSize("local_test.txt"); // 发送 REST 命令 char restCmd[64]; sprintf(restCmd, "REST %lld\r\n", localSize); send(ctrlSock, restCmd, strlen(restCmd), 0); recv(ctrlSock, recvBuf, sizeof(recvBuf), 0); // 再发 RETR send(ctrlSock, "RETR test.txt\r\n", strlen("RETR test.txt\r\n"), 0); // 以追加模式打开本地文件,从 localSize 处继续写入

逻辑说明:REST命令的参数是字节偏移量,服务器收到后会把下次数据传输的起始位置设到该偏移。参数上,localSize通过stat或fseek/ftell获取。文件校验常见做法是下载完后算 MD5 或 SHA1,和服务器端提供的校验值对比。报告里第三级提到「对已下载完的文件进行校验」,但没给具体算法,我一般会用 MD5,因为 C++ 有现成的 OpenSSL 库可以调。

多线程下载的思路是每个文件一个线程,每个线程独立建立控制连接和数据连接。但要注意 FTP 服务器通常限制同一 IP 的并发连接数,Xlight 默认可能只允许几个,线程开太多会被拒绝。常见做法是控制在 3~5 个线程,并且每个线程用独立的控制连接,不要共用。

5. 避坑与排查:从 IP 配错到 Socket 阻塞的 5 个真实翻车点

5.1 现象:PC 之间 ping 不通,但 IP 配置看起来没问题

原因:最常见的是子网掩码写错,比如 192.168.1.2 配了 255.255.255.0 但网关写成 192.168.0.1,跨网段时 ARP 请求发不出去。另一个原因是路由器接口没no shutdown,物理层没起来。

解决:先用ipconfig确认 IP、掩码、网关三项一致,再在路由器上show ip interface brief看接口状态是不是 up/up。如果是单臂路由,检查子接口的encap dot1qVLAN ID 和交换机端口 VLAN 是否匹配。

5.2 现象:RIP 配了但路由表里学不到对端网段

原因:network命令后面跟的是主类网络号,如果写了子网号或者漏宣告了某个直连网段,对端就学不到。另一个原因是串口时钟频率没设,链路协议 down。

解决:show ip route看有没有 R 开头的路由条目,show ip protocols看 RIP 宣告了哪些网络。串口两端确认一端配clock rate 64000,另一端不用配。

5.3 现象:VLAN 划分后同一 VLAN 内能通,跨 VLAN 不通

原因:这是正常现象,VLAN 本来就是隔离广播域的。如果要求互通但没配单臂路由,或者路由器子接口的encap dot1qVLAN ID 和交换机上不一致,就会不通。

解决:在路由器上show ip interface brief确认子接口状态,在交换机上show interface trunk确认 trunk 链路是 trunking 状态。show vlan确认端口划到了正确的 VLAN。

5.4 现象:FTP 客户端 PASV 模式连不上数据连接

原因:服务器被动模式返回的 IP 可能是内网地址,如果客户端和服务器不在同一网段,或者服务器防火墙没放行被动端口范围,数据连接就建不起来。

解决:先用 PORT 模式测试,如果 PORT 能通说明控制连接没问题,问题在 PASV 端口。检查 Xlight 的被动模式端口设置,确保防火墙放行。代码里解析 PASV 响应时打印出 IP 和端口,确认解析正确。

5.5 现象:Socket 的 recv 一直阻塞,程序卡死

原因:FTP 响应可能分多次到达,一次recv读不全,如果代码里只调一次recv就等下一句,可能读到不完整响应。另一个原因是数据连接没关闭,recv在等对端发数据。

解决:控制连接的recv要循环读到\r\n结尾,或者用select设超时。数据连接读完文件后,服务器会关闭连接,recv返回 0 表示传输结束。如果一直不返回,检查是不是命令发错了,服务器在等后续命令。

6. 进阶技巧:用 Wireshark 抓包验证 FTP 主动被动模式差异

报告里没提抓包,但这是验证 Socket 编程最直接的手段。我一般会在客户端和服务器之间跑 Wireshark,过滤ftp或tcp.port == 21,然后对比 PORT 和 PASV 两种模式的报文差异。

主动模式下,客户端发PORT 192,168,1,100,10,20,服务器从 20 端口主动连客户端的 10*256+20 端口。抓包能看到服务器发起的 SYN 包,方向是服务器→客户端。被动模式下,客户端发PASV,服务器回227 Entering Passive Mode,然后客户端发 SYN 连服务器指定端口,方向是客户端→服务器。这个方向差异就是「主动」和「被动」名字的由来——主动是服务器主动连客户端,被动是客户端主动连服务器。

验证断点续传时,抓包看REST命令后面的偏移量,再对比RETR之后数据包的序列号,确认是从指定偏移开始传的。如果序列号从 0 开始,说明 REST 没生效,常见原因是服务器不支持 REST 或者偏移量格式不对。

还有一个技巧:用ftp命令行客户端做对照测试。Windows 自带的ftp命令支持literal子命令发原始 FTP 命令,比如literal PASV、literal REST 1024,可以快速验证服务器端行为,排除自己代码的问题。我每次写 FTP 客户端卡住的时候,都会先用系统 ftp 跑一遍同样的命令序列,确认服务器端没问题再回头查代码。

从那以后我每次做网络实验,都强制先画拓扑图、标好 IP 和 VLAN 规划再动手配命令,配完先show一遍再测试连通性。Socket 编程也是,先抓包确认协议交互正确,再调代码逻辑。希望帮到你。

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

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

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

立即咨询