ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

计算机网络实验报告:从仿真组网路由配置到FTP客户端实现

计算机网络实验报告:从仿真组网路由配置到FTP客户端实现 简介这份资源是华中科技大学计算机学院《计算机网络》课程的实验报告面向高校计算机网络方向学生及需要实操演练的初学者系统梳理了网络组建与配置中的核心知识体系。全文基于Boson Netsim仿真环境展开涵盖IP地址规划、子网掩码划分、路由器端口配置、RIP与OSPF动态路由协议部署以及二/三层交换机、VLAN隔离原理等关键环节并附有完整的配置命令行记录和连通性测试分析便于读者理解网络层与数据链路层协议的实际应用逻辑。资源包内为1个docx文档整体约215KB内容结构清晰、实验步骤完整既包含拓扑搭建过程也涉及IP配置表、默认网关设置、路由协议启用等细节可直接作为课程实验参考或期末复习素材。已有82人学习下载适合正在完成类似网络实验或备战计算机网络考试的学生对照练习、查漏补缺。1. 计算机实验报告拆解从仿真组网到 FTP 客户端的完整闭环这份华中科技大学计算机学院的《计算机网络》实验报告包含两大部分网络组建与实施、SOCKET 编程。前者基于 Boson Netsim 5.31 仿真软件完成 IP 规划、RIP/OSPF 路由协议、VLAN 划分和 ACL 访问控制后者用 C 在 Visual Studio 里写了一个具备 GUI 的 FTP 客户端功能从 PORT/PASV 双模式一直延伸到断点续传和多线程下载。对正在写计网实验、备考网络工程师认证或者要复现路由交换配置的从业者来说它比教材示例更贴近真实排错场景——默认网关填错、串口时钟没配、VLAN 编号对不上这些最容易磨人的问题在报告里全都有迹可循。整份报告最花时间的不是配置命令本身而是查错。2. 网络组建与 IP 规划从拓扑模拟到子接口单臂路由2.1 拓扑搭建与 PC 地址规划先画图再仿真第一项试验要求用 Net Designer 画出图 1.1 的拓扑再载入 Boson NetSim 做配置。这个流程和真实设备调试很像先确认物理连接关系再做逻辑规划。Net Designer 里拖出交换机、路由器、PC 并连线保存后切到 Boson NetSim 的仿真界面此时各设备默认配置是空的需要逐台设置。IP 规划分两个阶段。第一阶段只划分两个网段PC1、PC2 在 192.168.0.0/24PC3 到 PC8 在 192.168.1.0/24。第二阶段把 PC3~PC8 拆成两个网段PC3、PC5、PC7 在 192.168.1.0/24PC4、PC6、PC8 在 192.168.2.0/24。各 PC 的具体地址如下设备IP 地址子网掩码默认网关PC1192.168.0.2255.255.255.0192.168.0.1PC2192.168.0.3255.255.255.0192.168.0.1PC3192.168.1.2255.255.255.0192.168.1.1PC4192.168.2.2255.255.255.0192.168.2.1PC5192.168.1.3255.255.255.0192.168.1.1PC6192.168.2.3255.255.255.0192.168.2.1PC7192.168.1.3255.255.255.0192.168.1.1PC8192.168.2.3255.255.255.0192.168.2.1注意 PC7 和 PC5、PC8 和 PC6 的 IP 是重复的仿真环境能跑通但真实网络里会出现地址冲突复现时建议把 PC7 改为 .4、PC8 改为 .4。网关地址全部指向路由器对应接口这是跨网段通信的前提——PC 发往其他网段的数据包必须先交给默认网关再由网关转发。配置完 PC 地址后同网段内的主机可以互通例如 PC1 能 ping 通 PC2PC3、PC5、PC7 之间能互通但跨网段不通因为路由器接口还没有地址。2.2 路由器端口与子接口配置单臂路由的雏形要让三个网段互通需要在路由器上给每个网段配一个网关地址。物理接口 fa0/0 给了 192.168.0.1/24但 fa0/1 这个物理口要同时承担 192.168.1.0/24 和 192.168.2.0/24 两个网段的网关所以要用子接口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子接口是单臂路由Router-on-a-Stick的典型做法一个物理端口通过 802.1Q 封装拆成多个逻辑子接口每个子接口对应一个 VLAN 或一个网段的网关。这里 fa0/1.1 和 fa0/1.2 只是逻辑上的区分实际流量还是从 fa0/1 这个物理口进出。注意父接口 fa0/1 必须 no shutdown否则子接口状态起不来这是初学者最容易忽略的一步。配置完成后PC1 ping PC3 的路径是PC1 → fa0/0 → 路由表查 192.168.1.0/24 走 fa0/1.1 → PC3。此时三个网段互相都能通但要注意路由器的路由表里必须存在这三条直连路由show ip route 能确认。2.3 连通性测试顺序先同网段再跨网段我在复现时习惯按这个顺序验证先 ping 网关地址确认本机到路由器接口的二层链路通再 ping 同网段其他 PC确认交换机转发正常最后 ping 跨网段 PC验证路由器转发和子接口配置。如果跨网段不通先看 PC 的默认网关是不是和自己在同一个网段再看路由器接口有没有 no shutdown最后看子接口地址有没有配错。报告里第一阶段配置后“各 PC 之间都能够相互连通”实际上用的是三层交换机或路由器加子接口的方式。这里有个细节Boson NetSim 5.31 对命令的容忍度和真实 IOS 略有差别比如子接口配置不需要 encapsulation dot1q 也能通因为拓扑里没有 VLAN 隔离但到了后面的 VLAN 试验必须显式封装 dot1q。3. 路由协议与交换配置RIP、OSPF、VLAN 与 ACL 的落地命令3.1 RIP 协议配置四台路由器宣告直连网段第二项试验用图 1.2 的拓扑四台路由器串行链路相连每台路由器下挂一个网段。PC1 对应 192.168.0.0/24PC2 对应 192.168.1.0/24PC3 对应 192.168.2.0/24PC4 对应 192.168.3.0/24。路由器之间用串口相连地址规划是 R1-R2 之间 192.168.4.0/24R1-R3 之间 192.168.5.0/24R2-R3 之间 192.168.6.0/24R3-R4 之间 192.168.7.0/24。串口配置的关键是时钟频率。连接串口线时一端是 DCE一端是 DTEDCE 端必须配 clock rate! Router1 串口配置 Router1(config)# int s0 Router1(config-if)# ip address 192.168.4.1 255.255.255.0 Router1(config-if)# clock rate 64000 Router1(config-if)# no shutdown Router1(config-if)# int s1 Router1(config-if)# ip address 192.168.5.1 255.255.255.0 Router1(config-if)# clock rate 64000 Router1(config-if)# no shutdown如果不配 clock rate串口会一直处于 protocol down 状态RIP 邻居关系建立不起来——这就是报告思考题说的“不设置时钟频率会出现的现象”。RIPv1 是有类路由协议network 命令只写主类网络号! Router1 上配置 RIP 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 ! Router2 上配置 RIP Router2(config)# router rip Router2(config-router)# network 192.168.1.0 Router2(config-router)# network 192.168.4.0 Router2(config-router)# network 192.168.6.0 ! Router3 上配置 RIP Router3(config)# router rip Router3(config-router)# network 192.168.2.0 Router3(config-router)# network 192.168.5.0 Router3(config-router)# network 192.168.6.0 Router3(config-router)# network 192.168.7.0 ! Router4 上配置 RIP Router4(config)# router rip Router4(config-router)# network 192.168.3.0 Router4(config-router)# network 192.168.7.0network 命令宣告的是直连网段RIP 会把这些网段通告给邻居同时从邻居学习非直连网段。配置完等几十秒show ip route 能看到以 R 开头的路由条目四台路由器学到全部网段后各 PC 才能互通。3.2 OSPF 进阶配置为什么比 RIP 更适合大网络报告要求“在路由器上重配置 OSPF 协议”实验报告里没给完整命令按常见做法补全。OSPF 是链路状态协议收敛速度比 RIP 快得多而且没有 15 跳限制! 以 Router1 为例OSPF 进程号 1所有接口宣告进 area 0 Router1(config)# router ospf 1 Router1(config-router)# network 192.168.0.0 0.0.0.255 area 0 Router1(config-router)# network 192.168.4.0 0.0.0.255 area 0 Router1(config-router)# network 192.168.5.0 0.0.0.255 area 0 Router1(config-router)# endOSPF 的 network 命令带的是通配符掩码不是子网掩码。0.0.0.255 表示匹配前 24 位等价于 192.168.x.0/24 这个网段。四台路由器都配完后OSPF 邻居通过 Hello 报文建立邻接关系链路状态数据库同步后计算最短路径树。RIP 和 OSPF 的主要差别对比项RIPOSPF算法类型距离矢量链路状态度量值跳数上限 15带宽计算的 Cost收敛速度慢周期广播快触发更新适用规模小型网络中大型网络协议号/端口UDP 520IP 协议号 89OSPF 配置完后同样用 show ip route 验证路由条目来源变成 O此时各 PC 依然能互通。如果之前配过 RIP 没清掉记得先 no router rip 再配 OSPF两个协议同时跑会互相干扰路由表。3.3 VLAN 划分与 Trunk 链路VTP 域与 802.1Q 封装第三项试验在第一项的基础上做 VLAN 划分。Switch2、Switch3、Switch4 组成一个区域要求 PC3、PC5、PC7 在一个 VLANPC4、PC6、PC8 在另一个 VLAN同时把 PC1、PC2 划入 VLAN1。VLAN 间默认不通需要路由器的单臂路由来打通。先在交换机上建 VTP 域和 VLAN。三台交换机配置相同Switch(config)# vlan database Switch(config-vlan)# vtp domain class Switch(config-vlan)# vlan 2 name Class1 Switch(config-vlan)# vlan 3 name Class2 Switch(config-vlan)# exit这里的 VLAN 编号是 2 和 3VLAN 名称是 Class1、Class2。注意 VTP 域必须一致否则 VLAN 信息不会同步。然后把端口划入对应 VLAN! Switch2 的配置Switch3/Switch4 类似端口是 fa0/3 和 fa0/4 Switch(config)# int fa0/4 Switch(config-if)# switchport mode access Switch(config-if)# switchport access vlan 2 Switch(config-if)# exit Switch(config)# int fa0/5 Switch(config-if)# switchport mode access Switch(config-if)# switchport access vlan 3 Switch(config-if)# exit交换机之间的互联端口要配成 Trunk并指定 802.1Q 封装! Switch2 与 Switch3/Switch4 互联端口 fa0/2、fa0/3 Switch(config)# int fa0/2 Switch(config-if)# switchport mode trunk Switch(config-if)# switchport trunk encapsulation dot1q Switch(config-if)# exit Switch(config)# int fa0/3 Switch(config-if)# switchport mode trunk Switch(config-if)# switchport trunk encapsulation dot1qTrunk 链路允许多个 VLAN 的流量通过帧上打 802.1Q 标签标明所属 VLAN。这步配完同一个 VLAN 内的 PC 能互通不同 VLAN 的 PC 互相 ping 不通——这正是 VLAN 隔离的目的。3.4 单臂路由打通 VLAN子接口封装 dot1q要让两个 VLAN 互通路由器的 fa0/1 接口要配子接口每个子接口对应一个 VLAN 的网关Router(config)# int fa0/1 Router(config-if)# no shutdown Router(config-if)# exit Router(config)# int fa0/1.1 Router(config-subif)# encapsulation dot1q 1 Router(config-subif)# ip address 192.168.1.1 255.255.255.0 Router(config-subif)# exit Router(config)# int fa0/1.2 Router(config-subif)# encapsulation dot1q 2 Router(config-subif)# ip address 192.168.2.1 255.255.255.0 Router(config-subif)# end这里最容易翻车VTP 里 VLAN 编号是 2 和 3而子接口封装的是 dot1q 1 和 dot1q 2两边编号并不对应。封装时必须确认 dot1q 后的数字是 VLAN ID不是子接口号也不是 VLAN 名称。复现时建议统一编号比如 VLAN 10 和 VLAN 20子接口就封装 dot1q 10 和 dot1q 20避免混乱。VLAN 间能互通后再把 PC1、PC2 划入 VLAN1。Switch1 上建同样的 VTP 域和 VLAN2Class1把 fa0/0、fa0/1 配成 access 模式划入 VLAN 2。由于 VLAN1 是默认 VLANNative VLAN实际上 PC1、PC2 所在端口保持默认即可但报告里要求显式配置照做就行。3.5 ACL 访问控制通配符掩码与方向的坑第四项试验要求对 Router1 配 ACL让 PC1 无法访问其他 PC也不能被访问。正确写法Router1(config)# access-list 10 deny host 192.168.0.2 Router1(config)# access-list 10 permit any Router1(config)# int fa0/0 Router1(config-if)# ip access-group 10 in报告里的命令写成了deny host 192.168.0.00.0.0.255这是笔误deny 的源地址应该是 PC1 的实际 IP 192.168.0.2。ACL 10 是标准 ACL只能匹配源地址deny 掉 PC1 的流量后必须加一条 permit any否则所有流量都会被隐式 deny 掉。应用方向 in 表示检查从 fa0/0 进入路由器的流量。进阶思考题让 PC1 不能访问 PC2 所在网段的 FTP 服务但能访问其他服务。标准 ACL 做不到按端口过滤需要用扩展 ACLRouter1(config)# access-list 101 deny tcp host 192.168.0.2 host 192.168.1.2 eq 21 Router1(config)# access-list 101 permit ip any any Router1(config)# int fa0/0 Router1(config-if)# ip access-group 101 outextended ACL 匹配源地址、目的地址、协议和端口。这里 eq 21 只拦 FTP 控制端口数据端口20和被动模式的高端口没拦如果服务端用主动模式完整拦截还需要考虑 port 21/20 的数据连接。方向 out 表示检查从 fa0/0 出去到 PC1 的流量从 PC1 视角看就是“去往 PC2 的 FTP 被拦”。4. SOCKET 编程FTP 客户端的 PORT/PASV 与五级实现4.1 FTP 双通道模型控制连接与数据连接分离FTP 和 HTTP 最大的区别是双通道控制连接固定走 21 端口数据连接有两种模式。PORT主动模式下客户端在控制连接上告诉服务器“我开了哪个端口等你来连”服务器主动发起数据连接PASV被动模式下服务器告诉客户端“我开了哪个端口你来连我”。这两种模式切换的核心是 PASV 命令和 227 响应的解析// 被动模式数据连接建立Windows Winsock 示例 SOCKET sCtrl socket(AF_INET, SOCK_STREAM, 0); // 连接服务器 21 端口代码略send/recv 用阻塞模式 // 1. 发送 PASV 命令 send(sCtrl, PASV\r\n, 6, 0); // 2. 接收 227 响应形如 // 227 Entering Passive Mode (192,168,1,10,200,1) char buf[256]; recv(sCtrl, buf, 255, 0); int a, b, c, d, p1, p2; sscanf(buf, 227 Entering Passive Mode (%d,%d,%d,%d,%d,%d), a, b, c, d, p1, p2); // 3. 数据端口 p1 * 256 p2 int dataPort p1 * 256 p2;解析 227 响应有两个坑一是有些服务器返回的 IP 是内网地址NAT 环境下客户端直连会失败常见做法是忽略响应里的 IP改用控制连接已连通的服务器地址二是 p1、p2 是十进制数计算端口号时别转十六进制。数据连接建立后发送 RETR 文件名然后从数据 socket 读数据写本地文件传输完成后服务端返回 226 响应。4.2 登录与目录操作响应码驱动的状态机FTP 的交互本质是状态机每个命令对应一个响应码客户端根据响应码决定下一步动作。登录流程// 连接控制端口后等待 220 欢迎消息 // 发送 USER 12345服务器返回 331需要密码 // 发送 PASS 12345服务器返回 230登录成功 // 匿名登录USER anonymous PASS 任意邮箱地址 send(sCtrl, USER 12345\r\n, 12, 0); recv(sCtrl, buf, 255, 0); // 331 Password required send(sCtrl, PASS 12345\r\n, 12, 0); recv(sCtrl, buf, 255, 0); // 230 Logged in // 目录切换CWD 路径名成功后返回 250 send(sCtrl, CWD /pub\r\n, 10, 0); recv(sCtrl, buf, 255, 0); // 250 CWD command successful // 列目录PASV 建立数据连接然后发送 LIST send(sCtrl, LIST\r\n, 6, 0); // 从数据连接读取目录列表结束后控制连接返回 226响应码 220、331、230、250、226 是正常路径530 是未登录550 是文件不存在或权限不足。调试时把每次 recv 的响应码打印出来就能定位卡在哪一步。报告里的实验结果截图显示“从服务器端读出文件目录信息”就是这个 LIST 流程。4.3 文件下载与上传数据通道的读写时机下载文件时数据连接建立后要立即发 RETR然后从数据 socket 读。这里有个时序问题如果用阻塞 socket先 recv 控制连接会一直等应该先读数据连接直到收到 0 字节或服务端关闭再读控制连接的 226 响应// 下载文件核心流程 // 1. PASV 建立数据连接得到 dataSock // 2. 发送 RETR filename // 3. 循环 recv(dataSock)写入本地文件直到 recv 返回 0 // 4. recv(sCtrl)读到 226 Transfer complete const int BUF_SIZE 4096; char fileBuf[BUF_SIZE]; FILE* fp fopen(local_file.bin, wb); int bytesRead 0; while ((bytesRead recv(dataSock, fileBuf, BUF_SIZE, 0)) 0) { fwrite(fileBuf, 1, bytesRead, fp); } fclose(fp); // 此时控制连接会收到 226表示传输完成上传方向相反先 PASV 建数据连接再发 STOR 文件名然后往数据 socket 写本地文件内容写完 shutdown 数据连接服务端返回 226。上传的常见问题是忘记在发完数据后关闭写方向服务端不知道数据传完会一直等待。4.4 五级功能演进从最小可用到多线程并发报告把 FTP 客户端分成五个级别正好对应从“能跑”到“好用”的演进路线级别功能要求核心实现点第一级指定 IP/端口、PORT/PASV、匿名/口令登录、目录浏览、单线程单文件控制台 基础命令序列第二级GUI、指定上传/下载目录、文件队列机制队列数据结构 界面刷新第三级进度指示、完整性校验、断线重连进度回调 MD5 重连逻辑第四级本地目录浏览、拖放、断点续传REST 命令 文件偏移第五级多线程多文件下载可来自不同服务器线程池 每线程独立控制连接到第二级就需要设计队列不能一个文件传完再等下一个人工点击。我一般用一个阻塞队列存放下载任务工作线程从队列取任务执行GUI 线程只管往队列塞任务和接收进度事件——这个模式在 MFC 里用 PostMessage 或者 Qt 的 signal/slot 都能实现。第五级的多线程要注意每个线程必须有自己的控制连接和数据连接FTP 协议没有跨连接共享会话的概念。5. 避坑与排查仿真器与 FTP 编程的高频翻车现场5.1 网络仿真与设备配置的坑坑一跨网段 ping 不通查了半天发现默认网关没填。现象是 PC1 ping PC2 通ping PC3 不通。原因是 PC 的默认网关为空或填了其他网段的地址数据包不知道该交给谁。解决方法是逐台检查 PC 的 IP 配置网关必须是路由器对应接口的地址且与 PC 自身 IP 在同一网段。Boson NetSim 里配置完地址要确认没被 reset 掉仿真器的 PC 配置偶尔会丢。坑二串口一直 protocol downRIP 路由学不到。现象是 show interface serial0 显示 line protocol is downRIP 邻居关系起不来。原因是 DCE 端没配 clock rate。串口线缆连接时接 DCE 的一端必须手动指定时钟频率否则物理层就起不来。解决方法是找到 DCE 端设备执行 clock rate 64000然后 no shutdown。真实环境里还要确认两端波特率一致仿真器里通常 64000 就行。坑三VLAN 编号和子接口封装对不上。现象是单臂路由配完后 VLAN 间还是不通show vlan 能看到 VLAN 2 和 VLAN 3路由器子接口也配了 IP但 ping 不通。原因是子接口的 encapsulation dot1q 后面的数字要和交换机上 VLAN 的实际编号一致。报告里 VTP 建的是 VLAN 2、3子接口却封 dot1q 1、2如果按字面配置就错了。解决方法是先 show vlan 确认 VLAN ID再逐一核对子接口封装号。坑四ACL 一配就全网不通。现象是配完访问控制列表后不只是 PC1其他 PC 也互相访问不了。原因是标准 ACL 里只写了 deny忘了放过其他流量或者把 access-group 应用在了错误的接口和方向。解决方法是写完 ACL 一定加一条 permit any 兜底并确认应用方向标准 ACL 尽量放在离目的端近的接口方向 in/out 要看流量进入路由器的方向。5.2 FTP 客户端开发与联调的坑坑五PASV 模式下数据连接超时。现象是控制连接登录正常输入 PASV 后服务器返回 227但连接数据端口超时。原因有两种一种是服务器返回的 IP 是内网地址客户端直接连了这个内网 IP另一种是中间防火墙只放行了 21 端口高位数据端口被拦。解决方法是忽略 227 里的 IP 字段用客户端已知的服务器地址连接计算出的端口号Xlight FTP 这类服务端可以在设置里指定被动端口范围把这个范围加入防火墙放行列表。坑六下载的文件比源文件多几个字节或少几个字节。现象是下载完的二进制文件和服务器端比对不一致。原因是用文本模式传输或 recv 循环里没有等数据连接关闭就读了控制连接的 226。解决方法是二进制传输前发 TYPE I传输结束后循环读数据连接直到 recv 返回 0再读控制连接确认 226——顺序错了会把残留的响应当成新命令的响应。坑七多线程下载时某个线程卡在 recv 不返回。现象是开了五个线程下载四个完成一个永远卡住。原因是线程共用了同一个控制连接或者某个命令的响应被其他线程抢先读走。FTP 的控制连接是串行的一个线程一个控制连接才安全。解决方法是每个下载线程独立创建 socket独立走一遍登录流程互不共享状态。6. FTP 客户端进阶断点续传、多线程下载与完整性校验断点续传的原理其实很直接下载前先发 SIZE 命令获取服务器文件大小本地已有文件的大小就是续传偏移量接着发REST 偏移量服务器返回 350 后再发 RETR数据就会从偏移位置开始传输// 续传核心REST 命令必须在 RETR 之前发送 send(sCtrl, SIZE remote_file.bin\r\n, 22, 0); recv(sCtrl, buf, 255, 0); // 213 文件大小 long localSize getLocalFileSize(local_file.bin); char cmd[64]; sprintf(cmd, REST %ld\r\n, localSize); send(sCtrl, cmd, strlen(cmd), 0); recv(sCtrl, buf, 255, 0); // 350 Restarting at 偏移量 send(sCtrl, RETR remote_file.bin\r\n, 23, 0); // 数据连接收到的数据从 localSize 处开始追加写入本地文件多线程下载多文件比单文件分块简单得多每个线程独立连接一个服务器下载一个文件互不干扰——这也正是报告第五级“多个文件来自不同服务器”的场景。如果一定要做单文件分块FTP 没有原生的 Range 头只能手动按偏移量开多个数据连接分别 REST RETR最后拼接文件还要处理每个分块的边界复杂度高不少不如直接用 HTTP 下载。完整性校验方面下载完成后用 MD5 比对是最常见做法。Xlight FTP 支持SITE MD5 文件名扩展命令如果没有就先下载一份小文件做基准再比对。重连机制要处理两个状态控制连接断开的重新登录以及数据连接中断后的 REST 续传。验证整套逻辑有个好习惯用 WireShark 抓包过滤tcp.port 21 || tcp.port 50000看控制连接的每次交互和响应码数据连接的建立和关闭一目了然。那次我为了省事跳过抓包PASV 连不上折腾了一晚上最后发现是 227 响应的端口被 NAT 改写了。从那以后我每写一个 FTP 功能都强制先抓一遍完整控制流确认状态机走对了再继续。希望帮到你。本文还有配套的精品资源点击获取
返回列表