XMU《计算机网络与通信》第四次实验报告

计算机网络 实验四 通信

这次实验的话,我的报告参考意义不大,毕竟这次实验的主要难点是完成那两个代码,但是我报告中没有任何对于代码的解释。

大家如果需要的话,我的两个代码可以在这里下载,仅供参考:点击下载

一、个人信息

姓名:XXX

学号:XXXXXXXXXXXXXX

二、实验目的

  1. 理解和掌握ARP与ICMP协议在IPv4分组收发处理过程中的作用。
  2. 理解和掌握路由器静态路由转发过程。
  3. 理解和掌握动态路由选择协议的基本原理与过程。
  4. 提升文档阅读能力。
  5. 提升代码编写能力。

三、实验内容与结果分析

在实验二中,我们已学习了Wireshark的使用方法,并在发送主机侧观察了ARP及ICMP协议的 具体过程,在本任务中,你将继续使用Wireshark在全路径范围内(包括发送主机侧,转发路由器上,以及接收主机侧)观察并分析ARP、ICMP协议。

任务⼀:观察和分析ARP和ICMP协议过程

image-20231123144646376

在Mininet终端中使⽤ping命令来测试host1到host2的⽹络连通性。追踪并分析在ping命令运⾏过程中,⽹络中各节点相关协议数据包的流向和变化过程。请在实验报告中通过分析抓到的包,还原ping的过程,分析ARP和ICMP协议包的传输过程.

image-20231123151640375

上图是在运行 host1 ping -c 3 host2 以后 Wireshark 捕获到的数据包记录截图。

左上、右上、左下、右下依次是 host1, host2, router1, router2

在第一次运行这个 ping 的时候,ARP 缓存为空,host1 广播了一个 ARP 请求包,询问路由器 100.0.0.1 的 Mac 地址,同时,在 host1router1 的截图中,分别可以发现发出和收到了这个 ARP 请求。接着,router1 回应了这个请求,告诉了 host1 自己的 MAC 地址,在 router1host1 的截图中,可以发现分别发出和收到了这个 ARP 请求。在获得 router1 的 MAC 地址后,host1 正式将第一个由 ping 产生的 ICMP 数据包发送给了 router1。这个数据包对应 host1 的第 \(3\) 条记录和 router1 的第 \(3\) 条记录。

随后,router1 发现需要将这个数据包发送给 router2 进行间接交付,于是但是这个时候它还不知道 router2 的 MAC 地址,于是 router1 在与 router2 连接的局域网内广播了一个 ARP 请求询问(router1 的第 \(4\) 条和 router2 的第 \(1\) 条),然后 router2 收到之后,发送了 ARP 回应告知自己的 MAC 地址(router2 的第 \(2\) 条和 router2 的第 \(5\) 条)。在获知 router2 的 MAC 地址后,router1 便把这个 ICMP 数据包转发给了 router2router1 的第 \(6\) 条和 router2 的第 \(3\) 条)。

router2 获得这个 ICMP 数据包之后,需要将它交付给 host2,但是不知道它的 MAC 地址,因此需要发出 ARP 询问请求(router2 的第 \(4\) 条和 host2 的第 \(1\) 条),在获得了 host2 的 MAC 地址后(host2 的第 \(2\) 条和 router2 的第 \(5\) 条),router2 就把 ICMP 数据包交付给了 host2router2 的第 \(6\) 条和 host2 的第 \(3\) 条)。

host2 收到 ICMP 数据包后,需要向 host1 发送回应。因为之前 router2 已经向 host2 发送过 ARP 询问报文,因此 host2 已经知道了 router2 的 MAC 地址,不需要再发 ARP 询问了,因此 host2 直接向 router2 发送了目的 IP 为 100.0.0.250 的 ICMP 包。接着,router2 收到这个回应后,转发给 router1router1 收到后直接交付给 host1

因为 ping 的次数为 \(3\) 次,因此 host1 还会再向 host2 发送两次 ICMP 数据。因为在第一次数据包发送的过程中,所有节点的 ARP 缓存已经存在需要的信息了,所以不再需要发送各种 ARP 包。其余转发过程与第一次相同。

注意到 router1, router2, host2 的 Wireshark 最后还捕捉到了一些 ARP 数据包,但是观察捕捉到的时间,这不是在这个 ping 的过程中发出了 ARP 分组,因此我这里将他们忽略。

在Mininet终端运⾏traceroute命令来测试host1到host2的路由。追踪并分析在traceroute命令运⾏过程中,⽹络中各节点相关协议数据包的流向和变化过程。请在实验报告中还原并分析traceroute相关数据包的传输过程。

捕获数据包:

host1

image-20231124161552365

host2

image-20231124161616085

router1

image-20231124161646199

router2

image-20231124161719171

可以发现,host1 首先发送了一个无法被接受的 UDP 包,其 TTL\(1\)router1 在收到这个包后,没有进行转发,而是向 router1 发回了一个 ICMP 时间超过报文。这个过程重复了三次。

接着,host1 发送了一个无法被接受的 UDP 包,其 TTL\(2\)router1 在收到这个 UDP 包以后将 TTL 减一并转发给了 router2router2 收到这个数据包以后没有进行转发,而是向 host1 的 IP 地址发送了一个 ICMP 时间超过报文给 router1router1 再将这个 ICMP 时间超过报文交付给 host1。这个过程也重复了三次。

然后,host1 发送了一个无法被接受的 UDP 包,其 TTL\(3\)router1 在收到这个 UDP 包以后将 TTL 减一并转发给了 router2router2 在收到这个 UDP 包以后将 TTL 减一并直接交付给了 host2host2 发现这个 UDP 包无法接收,因此以 host1 的 IP 为目的发送了 ICMP 端口不可达给 router2router2 将这个包转发给了 router1router1 将这个包直接交付给 host1,这时候 host1 就知道自己发送的 UDP 数据包已经到达了 host2,从而知道路径上一共有两个路由器。这个过程也会重复三次。

按道理来说,这个时候 traceroute 就会停止发送 UDP 数据包,但是我们通过 Wireshark 观察到,host1 仍然在继续发送,一共发送了 \(3\)TTL\(4\) 个包,\(3\)TTL\(5\) 的包和 \(1\)TTL\(6\) 的包,甚至对于最后的 \(3\)TTL\(5\) 的包和 \(1\)TTL\(6\) 的包,host2 收到了 UDP 包却没有发送 ICMP 端口不可达的回应。

我们猜测这可能是因为 traceroute 有一个最少发送的 UDP 包数量的限制,在这个限制达到之前,无论有没有收到 ICMP 端口不可达的回应,都要继续发送 UDP 报文。

断开router1和router2之间的链路后,再使⽤ping命令测host1到host2连通性,追踪并分析⽹络中各节点相关协议数据包的流向和变化过程。 请在实验报告中还原并分析此时ping相关数据包的传输过程。

image-20231123155348906

断开 router1router2 之间的链路后,可以发现 host1 发送的 ICMP 报文没有被成功送达 hsot2

在第一个 host1 发送的报文到达 router1 后,router1 发现路由表中没有目标网段,因此发送回了一个 ICMP Net Unreachable 报文给 host1

因为设置的 ping 次数是 \(3\),因此这个过程会重复两次。

补充内容 1 追踪并分析在ping和traceroute命令执⾏过程中,⽹络中各节点ARP协议数据包的流向和变化过程,对⽐ARP缓存为空和不为空时,数据包流向的区别。

ARP 缓存为空的时候,ping 命令的 ARP 协议数据包流向:

image-20231203234634219

从上图可见,一共有 \(3\) 对 ARP 分组:

  • host1 广播了一个 ARP 询问分组,询问 router1(100.0.0.1) 的 MAC 地址,router1 收到了这个 ARP 询问分组将自己的 MAC 地址发送给 host1,同时将 host1(100.0.0.250) 的 MAC 地址也记录在自己的 ARP 缓存中。
  • router1 广播了一个 ARP 询问分组,询问 router2(10.100.0.2) 的 MAC 地址,router2 收到了这个 ARP 询问分组将自己的 MAC 地址发送给 router1,同时将 router1(10.100.0.1) 的 MAC 地址也记录在自己的 ARP 缓存中。
  • router2 广播了一个 ARP 询问分组,询问 host2(192.0.1.251) 的 MAC 地址,host2 收到了这个 ARP 询问分组将自己的 MAC 地址发送给 router2,同时将 router2(192.0.1.1) 的 MAC 地址也记录在自己的 ARP 缓存中。

而当 ARP 缓存为空时,ping 命令的 ARP 协议数据包流向:

image-20231203234815921

可以发现,当 ARP 缓存不为空,不会出现任何的 ARP 数据包,因为这个时候已经不需要通过广播 ARP 分组来获得目标 IP 地址对应的 MAC 地址了。

ARP 缓存为空的时候,traceroute 命令的 ARP 协议数据包流向:

image-20231203235110125

可以发现,基本上和 ping 命令产生的 ARP 分组完全相同,因此这里不做分析。

image-20231203235159331

当 ARP 缓存不为空,同 ping 命令一样,不会出现任何的 ARP 数据包,因为这个时候已经不需要通过广播 ARP 分组来获得目标 IP 地址对应的 MAC 地址了。

补充内容 2 追踪并分析在ping和traceroute命令执⾏过程中,⽹络中各节点ICMP协议数据包的流向和变化过程,对⽐终点可达和不可达时,数据包流向的区别。

终点可达时的 ping 命令产生的 ICMP 数据包:

image-20231123151640375

在本任务的第一个子任务中,我已经分析过 ping 命令产生的 ICMP 数据包的流向和转发过程,这里不再重复。

traceroute 命令产生的 ICMP 数据包的流向:

image-20231203235346329

在本任务的第二个子任务中,我已经分析过 traceroute 命令产生的 ICMP 数据包的流向和转发过程,这里不再重复。

下图是在终点不可达时,ping 命令产生的 ICMP 协议数据包流向。

image-20231123155348906

在本任务的子任务三中,我已经分析过这个数据包的流向和变化过程。

下图是当终点不可达时,traceroute 命令发出的 ICMP 数据包的流向和变化过程。

image-20231203235500624

因为我们只关注了 ICMP 数据包,因此这里忽略了几个 UDP 分组。可以猜测到的是,一开始 host1 发送了一个无法交付的 UDP 报文给 host2 的 IP 192.0.1.251,但是当数据包到达 router1 时,router1 无法在自己的路由表中找到匹配这个 IP 的条目,因此发送了一个 Network Unreachable 的 ICMP 差错报文给 host1

host1 连续发送两次 UDP 分组后都只收到了 router1 的 ICMP 差错报文,traceroute 就知道无法到达 host2 了,因此不再发送。

补充内容 3 分析并列出ARP与ICMP协议相关的以太⽹帧,在⽹络中经过各节点时的MAC地址变化。

对于所有的 ARP 报文,其只在局域网内部传送,不会经由路由器转发,因此不涉及以太网帧的重新组装,每一对 ARP 报文基本上都可以用一个请求分组和一个 ARP 回应分组来代表。下面以 host1 发送 ARP 分组询问 router1 的 MAC 地址为例,研究 MAC 地址的变化。

image-20231203235653903 image-20231203235715086

可以发现,对于 host1 发送的 ARP 询问分组,因为不知道 router1 的 MAC 地址,因此只能把这个 ARP 询问在局域网内广播,故而在这个分组的 MAC 帧首部中,源地址是自己的 MAC 地址(8e:0f:a3:4a:f6:e5),而目的地址是 ff:ff:ff:ff:ff:ff,代表这个分组应该被广播。

而对于 router1 发送的 ARP 回应分组,因为 router1 这个时候通过询问分组获得了 host1 的 MAC 地址,因此这个分组不必广播,而是可以标明 host1 是接受方,因此在 ARP 回应分组中,源地址是 router1 自己的 MAC 地址(c6:dc:64:56:a9:a5),而目的地址是 host1 的 MAC 地址(8e:0f:a3:4a:f6:e5)。

下图是 host1 ping host2 产生的第一个 ICMP 数据包的传送过程,我将以这个分组的传送过程为例研究 ICMP 数据包经过网络各个节点时的以太网帧的变化。

image-20231204000700648

在这个分组的传播过程中,一共需要经过三条链路:<host1, router1>,<router1, router2>,<router2, host2>。因此,以太网帧被重新组装了三次,也就有三个不同的以太网帧。

在第一条链路中,也就是图中左上和左下的两个截图中,以太网帧的目的地址是 router1eth1 的 MAC 地址(c6:dc:64:56:a9:a5),源地址是 host1 的 MAC 地址(8e:0f:a3:4a:f6:e5),代表这个分组是 host1 交由局域网内的路由器 router1 间接交付的。

在第二条链路中,也就是图中中下和右下的两个截图中,以太网帧的目的地址是 router2eth2 的 MAC 地址(7e:f8:e6:a7:b8:e4),源地址是 router1eth2 的 MAC 地址(aa:c7:bb:9b:c7:85),代表这个分组是路由器 router1 交由路由器 router2 间接交付的。

第三条链路中,也就是图中中下和右下的两个截图中,以太网帧的目的地址是 host2 的 MAC 地址(02:84:eb:2f:80:3c),源地址是 router2eth1 的 MAC 地址(ce:dc:a7:21:46:1b),代表这个分组是路由器 router2 直接交付给 host2 的。

任务二 静态路由

在该任务中,你将实现一个具有静态路由功能的路由器。该路由器将会接收以太网帧,并像真 实的路由器一样对IPv4分组进行收发和处理,然后将它们转发到正确的端口。本任务已预先创 建好了一个网络拓扑,并提供了具体的代码实现框架,保证路由器可正确地接收到以太网帧, 进而使得你的主要精力可放在静态路由实现上。为了降低任务的复杂程度,绝大部分静态路由代码已给出,且代码中包含了详细的注释。

任务要求:

请基于给定的拓扑及代码框架

  1. 将静态路由代码补充完整,正确实现路由器的静态转发功能。
  2. 阅读代码,在实验报告中画出路由器的代码流程图。

./sr 运行演示

image-20231124161933818

测试结果

image-20231124162522908

代码流程图

sr_router.c-2

任务三

在本任务中,你将在任务二静态路由的基础上,为路由器添加动态路由功能。同任务二一样,任务三的网络拓扑与代码框架均已给出。

任务要求:

请基于给定的拓扑及代码框架

  1. 将动态路由代码补充完整,实现RIP路由协议。
  2. 阅读代码,画出动态路由的代码流程图。

测试结果

image-20231124161008001

代码流程图

sr_rt.c-3

四、实验小结与感想

在这次实验中,我深入探索了计算机网络领域,通过对 Wireshark 的使用,我更深刻地理解了网络通信的细节。Wireshark 为我提供了一个窗口,让我观察和分析 ARP 与 ICMP 协议在 IPv4 分组收发处理过程中的作用。这种实际操作让我对网络通信的细节有了更清晰的认识,不再只是停留在理论层面。

在第一个实验任务中,我使用 Wireshark 观察并分析 ARP 和 ICMP 协议的过程。通过追踪 pingtraceroute 命令的执行,我还进一步了解了网络中各节点相关协议数据包的流向和变化过程。这种实际操作让我更好地理解了计算机网络中的协议工作原理,加深了我对网络通信的认识。

静态路由的实现使我深入了解了路由器的基本原理,通过阅读和补充代码,我学到了如何实现路由器的静态转发功能。这为我提供了一个更加全面的视角,让我理解了网络中路由器的工作机制。这种深入的学习体验,让我更自信地处理网络相关的问题。

在动态路由的实现中,我进一步扩展了对路由器的理解,通过实现 RIP 路由协议,我学到了路由器之间如何动态地交换路由信息。这种实际的编码实践让我感受到了网络协议的灵活性和实用性,也让我更加熟练地运用所学的知识。

通过这次实验,我不仅学到了计算机网络的相关知识,还提升了我的网络调试和分析能力。在不断迭代和调试的过程中,我积累了解决网络问题的经验,增强了我的问题解决能力。这次实验是一次很有收获的实践,为我未来深入网络领域的学习和工作奠定了坚实的基础。

posted @ 2024-04-28 08:52  hankeke303  阅读(10)  评论(0编辑  收藏  举报