Loading...
墨滴

PythonCN

2021/08/19  阅读:40  主题:橙心

【翻译】Packet 的旅行 — 主机间通信

在讨论了 OSI 模型的组成以及将数据包从一台主机传输到另一台主机时所涉及的一些关键参与者之后,我们最终可以讨论允许主机间通信的具体功能。 ​

互联网的核心思想是两台计算机可以相互通信。 尽管很少发现两台主机直接相互连接的情况,但如果了解它们连接在一起会发生什么对于了解多台主机通过交换机或路由器进行通信时发生的所有其他事情至关重要。 ​

因此,本文将重点介绍主机到主机的通信,以及该过程中涉及的每个单独步骤。 ​

主机到主机通信

由于图中没有路由器,我们知道所有通信都发生在同一个网络中——因此,主机 A 和主机 B 都配置了属于同一网络的 IP 地址。

每个主机都有唯一的 IP 地址和 MAC 地址。 由于每个主机也是一个 L3 设备,所以每个主机都有一个 ARP 表。 目前,他们的 ARP 表是空的。 ​

主机 A 首先为主机 B 生成一些数据。主机 A 知道此数据的最终目的地将是 IP 地址 10.10.10.20(主机 B)。 主机 A 也知道它自己的地址 (10.10.10.10),因此能够使用所需的源和目标 IP 地址创建 L3 报文头。 ​

但正如我们之前了解到的,数据包传递是 L2 的工作,因此尽管这些主机彼此直接相连,但必须创建 L2 报文头。 ​

L2 报文头的源MAC 地址将是主机 A 的 MAC 地址 (aaaa.aaaa.aaaa)。 L2 报文头的目的MAC 地址应该是 Host B 的 MAC 地址,但此时 Host A 在其 ARP 表中没有 Host B IP 地址的条目,因此,不知道 Host B 的 MAC 地址。 ​

因此,此时主机 A 无法创建正确的 L2 报文头来将数据包传送到主机 B 的 NIC。 主机 A 必须发起 ARP 请求才能获取丢失的信息:

ARP 请求是一个单一的数据包,它本质上是在询问:“如果有人拥有 IP 10.10.10.20,请将你的 MAC 地址发送给我。” ​

请记住,此时主机 A 不知道主机 B 是否存在。 实际上,Host A 并不知道它直接连接到 Host B。因此,这个问题是针对链路上的每个人的。 ARP 请求作为广播发送,如果有其他主机连接到此链接,它们也会收到 ARP 请求。 ​

另外请注意,主机 A 在 ARP 请求本身中包含其自己的 MAC 地址。 这允许主机 B(如果存在)轻松地将请求的信息直接回复给主机 A。

接收 ARP 请求允许主机 B 学到一些东西。 即,该主机 A 的 IP 地址是 10.10.10.10,相关的 MAC 地址是 aaaa.aaaa.aaaa。 请注意,此条目现在已添加到主机 B 的 ARP 表中。 ​

主机 B 可以使用此新信息直接响应主机 A。ARP 响应作为单播消息发送,直接寻址到主机 A。如果此链路上有其他主机,它们就不会看到 ARP 响应。 ​

ARP 响应将包括主机 A 请求的信息:IP 地址 10.10.10.20 由 MAC 地址为 bbbb.bbbb.bbbb 的 NIC 提供服务。 主机 A 将使用此信息填充其 ARP 表:

填充主机 A 的 ARP 表后,主机 A 现在可以成功地将正确的 L2 报文头放在一起,并将数据包发送到主机 B。 ​

当主机 B 获取数据时,它将能够毫不费力地做出响应,因为它的 ARP 表中已经有主机 A 的映射。 ​

总结

同样,很少发现两台主机直接相互连接。 但是了解从一台主机到另一台主机的数据包需要什么是了解交换机如何实现多主机通信或路由器如何实现多网络通信的关键。 这两者都将是本系列下一篇文章的主题。 ​

需要注意的关键是主机不知道它是连接到交换机还是直接连接到另一台主机。在这两种情况下,主机在尝试与另一个主机通信时都将遵循上面概述的流程。 ​

翻译
Host to Host Communication[1]

参考资料

[1]

Host to Host Communication: https://www.practicalnetworking.net/series/packet-traveling/host-to-host/

PythonCN

2021/08/19  阅读:40  主题:橙心

作者介绍

PythonCN