【翻译】主机通过路由器的通信

175 阅读5分钟

上一篇文章中,我们了解了直连主机间的网络通信中发生的每一件事。而在这篇文章中,我们在上一篇的基础上加入一个网络设备:路由器。我们来看看加入路由器后网络间通信又会发生什么。

这篇文章是将路由器作为我们之前讨论的网络传输的关键角色的实际应用。在学习后面的内容之前,了解路由器的协作方式是非常有必要的。

我们先开始研究路由器的每个功能,最后再用一张GIF图将路由器的完整协作方式展示一遍。

路由器的作用

路由器主要有4个作用:学习,泛洪(flooding),转发和过滤。

学习

作为第二层(L2)的设备,路由器所有出的所有行为都是基于L2的标头.具体来说,路由器使用源MAC地址和目标MAC地址来做转发。

路由器的目的就是创建一个MAC地址表——用来映射路由器端口和连接设备的MAC地址。

MAC地址表一开始是空的,每次路由器接受到消息,它会查看这个帧的源MAC地址。这个MAC地址和接收帧的端口进行映射并在MAC地址表中建立这个映射关系。

每个连接的设备都会发送这个一些东西,因此路由器早晚在MAC地址表中填满信息。然后这个表就可以在适当的时候巧妙的将帧转发到预期目的地。

泛洪

然而,事情并不上上一小节说的这么顺利,路由器早晚会接受到一些不知道目的地MAC地址的帧。

这种情况下,路由器只能复制这些帧然后一股脑的全部散发出去。这个动作就叫做泛洪。

泛洪确保的是如果目标设备存在并且能连接到路由器,得让它能接受到帧。

当然,所有连接到特定路由器得设备都会收到这个携带者最终MAC地址得帧,如果它们不是这个帧真正得接收者,它们会简单的将这个帧丢弃。

如果它们是接收者,那么路由器就知道这个帧可以成功的发送出去。

而且,当目标接受到帧,会产生一个响应,它会告知路由器MAC地址并让路由器建立映射关系。

转发

理想情况下,路由器的MAC地址表拥有遇到过的每个目标MAC地址。

当开始工作时,路由器可以轻松的将帧从适当的端口转发出去。

有许多种办法可以将帧转发出去,我们简单介绍一下:

  • 保存和转发(Store and Forward): 路由器复制整个帧,保存在内存中,同时在转发前探测有没有错误。整个过程速度很慢,但它有最好的错误检测机制和一些附加功能。例如优先处理某些类型的流量以加快处理速度。
  • 穿透(Cut-Through):路由器啥也不存,仅检查为了实现转发的很少的信息。这种方式速度很快,但是没有很强的错误检查以及一些额外的功能。
  • 碎片隔离(Fragment Free):这种方式混合了前两种。在转发前路由器检查帧的第一部分(64 bytes)。如果传输发生错误,一般会在前64个字节中捕获到。因此,这个方法提供了一个足够好的错误检查,同时提升了不小效率。

不过在现代,这三种方式的速度差异可以忽略不计。但大部分现代路由器用的是第一种(保存和转发)。

过滤

路由器的左右一个作用就是过滤。一般来说,路由器的过滤是不会让转发的帧给回到发出帧的同一个端口。

最常见的,就是泛洪的时候——帧会被复制并发送到每个端口,除了它自己。

很少的情况下会出现主机目标的MAC地址就是自己的情况,出现这种情况一般都是出错了或者遭到攻击。当这种情况发生时,路由器就丢掉这个帧。

路由器的运作方式

现在我们知道了路由器都做了哪些事。下面这个动画,可以清楚的描述路由器的工作流程。

通常来说,下图的主机主要进行ARP解析,但我们为了重点关注路由器的机制,忽略了ARP,假装主机间已经知道了彼此的IP和MAC地址。

packtrav-host-switch-host.gif

A主机有一些数据要发送给主机B。但这个数据对路由器来说是无关紧要的,它只需要知道帧有一个L2标头并且携带着来源和目标的MAC地址。

开始的时候,MAC地址表是空的。记住,只有当帧被接受到时,这个表才会被填充映射。

当主机A发送帧到路由器,帧包括了来源的MAC地址aaaa.aaaa.aaaa。同时促使路由及将端口1和MAC地址在MAC地址表上进行关联。

之后,当开始转发帧的时候,路由器意识到没有指向bbbb.bbbb.bbbb的入口。帧离开路由的方法只有一个:复制自己并且泛洪到所有端口,除了它自己(Port 1)—— 只是由“过滤”来处理的。

这个帧会被主机B和主机C接收到。主机C检查L2标头时发现帧不是发给我的,就丢掉了。反过来,主机B发现是发给自己的,它就接收了这个帧并生成一个响应。

当响应到达路由器,MAC地址表开始学习并记录:端口2对应的MAC地址是bbbb.bbbb.bbbb。

然后交换机查找目标MAC地址 (aaaa.aaaa.aaaa)并意识到该地址存在于端口1。然后交换机可以简单地转发帧,因为它知道目标MAC址的位置。