我最近开始学习 OSI 模型、网络等。
因为我喜欢用 C 语言编码,所以我想发送自己的以太网帧。
我现在已经让它工作了;然而,我仍然不确定一件事:
当从机器发送以太网帧时A机器乙(假设两台机器都在同一个网络中),我必须指定什么 MAC 地址目的地帧的 MAC 地址?
我尝试了路由器的 MAC 地址和机器的 MAC 地址乙,两种方法都有效。要获取机器的 MAC 地址乙,我只是发出了一个 ARP 请求。
然而什么才是正确的方法呢?
我在机器上使用 Wireshark 监控流量A与tcpdump在机器上乙. 这是机器上的输出乙(e0:d5:5e:c6:52:9a
是机器的 MAC 地址乙):
指定机器时乙的 MAC 地址作为目标地址(a0:ce:c8:10:75:8c
是机器的 NIC MACA):
18:42:46.152800 a0:ce:c8:10:75:8c > e0:d5:5e:c6:52:9a, ethertype IPv4 (0x0800), length 64: 192.168.178.21.23455 > 192.168.178.27.23456: UDP, length 5
当指定路由器的MAC地址作为目标地址(c8:0e:14:fd:f3:23
是路由器的NIC MAC)时:
18:45:04.735375 c8:0e:14:fd:f3:23 > e0:d5:5e:c6:52:9a, ethertype IPv4 (0x0800), length 60: 192.168.178.21.23455 > 192.168.178.27.23456: UDP, length 5
此结果表明路由器重写了来源MAC 地址,并可能使用其缓存来确定目标 IP 的正确目标 MAC 地址。
路由器如何处理机器 MAC 地址为乙是否指定?
这两种方式有什么区别吗?
是否有一种首选/正确的方法?
答案1
如果您知道目标计算机位于本地子网中,通常正确的方法是直接使用目标计算机的 MAC 地址(必要时进行 ARP 查找)。这将有效不管帧的以太网类型或内容,并且通常会绕过路由器(它将通过以太网交换机短路)。
如果如果帧包含 IPv4 或 IPv6,您可以将其发送到子网的路由器,路由器将执行 ARP 查找并将帧的有效负载转发到目标 IP 地址所属的任何主机。(毕竟,这就是路由器做:它们转发 IP 数据包 — — 即使这只是意味着将它们反射回同一个接口。
但是,在大多数情况下,通过路由器发送本地数据包效率低下且完全没有必要。对于较便宜的路由器,这可能意味着数据包由非常慢的 CPU 处理(与以太网交换机的全线速相比)。
也就是说,第二种方法是在实践中偶尔会与交换机和接入点上的“客户端隔离”(又名“私有 VLAN”)功能一起使用。
答案2
请记住,以太网没有路由器。路由器是第 3 层(网络层,例如 IP 所在的层)概念,位于以太网之上,以太网本身应该对此一无所知。
以太网头的目标字段中应放入的正确地址是目标主机的以太网 MAC 地址。
在您的问题中,您还提到将以太网帧发送到主机,而事实证明,以太网帧包含的 IP 数据报与您将其发送到的以太网目标 IP 主机不同。因此,该 IP 主机恰好充当路由器,它通过将 IP 数据报发送回同一以太网 LAN 来为您路由 IP 数据报,但这次使用与 IP 数据报所针对的 IP 主机地址相对应的正确以太网目标地址。