当一台计算机想要向同一网络中的另一台计算机发送 IP 数据包时,它如何知道该主机的目标 MAC 地址?

当一台计算机想要向同一网络中的另一台计算机发送 IP 数据包时,它如何知道该主机的目标 MAC 地址?

我知道交换机比集线器更好,因为它们可以将以太网帧准确地转发到具有特定目标 MAC 地址的主机。

但是,当两台计算机通信时,它们使用IP地址来发送数据包。

如果我编写一个 C 程序(一个服务器和一个客户端),并在一台 PC 上运行服务器,在同一网络上的另一台主机上运行客户端并开始通信(假设我知道它们两个的 IP),那么第一台计算机的 NIC 究竟如何知道具有目标 IP 的计算机的 NIC?

该帧必须具有目标 MAC,否则所有目标 MAC 都将是广播 MAC。

如果计算机不知道目标 MAC 地址,交换机就毫无用处(据我所知),而且我不明白如果主机实际上使用 IP 地址进行通信,它们如何知道彼此的 MAC。

答案1

如果我编写一个 C 程序(一个服务器和一个客户端),并在一台 PC 上运行服务器,在同一网络上的另一台主机上运行客户端并开始通信(假设我知道它们两个的 IP),那么第一台计算机的 NIC 究竟如何知道具有目标 IP 的计算机的 NIC?

假设是 IPv4。对于 IPv6,原理类似,但细节不同(邻居发现而不是 ARP)。

首先,您的计算机在其 IP 路由表中查找目标 IP 地址。这将告诉它“接口”和“下一跳 IP 地址”。如果目标位于本地子网中,则下一跳 IP 地址将与目标 IP 地址相同(如果目标不在本地子网中,则下一跳 IP 地址将是网关的地址)。

接下来,您的计算机在 ARP 表中查找接口的下一跳 IP 地址。如果找到与有效目标 MAC 地址匹配的 IP 地址,则可以立即发送数据包。否则,数据包将排队,直到有可用的 MAC 地址。

要发现 MAC 地址,您的计算机会发出 ARP 请求。ARP 请求将发送到广播 MAC 地址。如果一切正常,下一跳(您的情况中为目的地)计算机将回复 ARP 请求,您的计算机将在其 arp 表中创建一个条目,然后发送排队的数据包。

如果 ARP 请求没有得到响应,则您的系统可能会重试有限次数,然后放弃发送数据包。根据操作系统的不同,它在放弃时可能会生成 ICMP 目标主机不可达数据包(Linux 会生成,BSD 显然不会,Windows 不确定)。

我更了解路由的工作原理。基本上(?如果计算机在 ARP 缓存中没有 IP 地址,并且网络上没有主机响应 arp 请求包),那么想要将数据发送到某个 IP 的主机会将数据包转发到默认网关(应该是路由器),然后该路由器将检查路由表以查看它连接到目标 IP 所属网络的哪个端口。如果网络不在该表中,则路由器将转发到其自己的默认路由,依此类推,直到某个路由器知道该网络。这是正确的吗?

这是错误的,当 IP 路由表中没有其他条目与目标 IP 匹配时,将使用默认网关。如果 ARP 失败,则不会使用它。如果 ARP 失败,则使用默认网关很可能会产生路由循环。

相关内容