
我最近開始學習 OSI 模型、網路等等。
由於我喜歡用 C 語言編碼,因此我想發送自己的乙太網路幀。
我現在開始工作了;但是,我仍然不確定一件事:
從機器發送乙太網路幀時A加工乙(假設兩台機器在同一網路中),我必須指定什麼MAC位址目的地訊框的MAC位址?
我嘗試了路由器的MAC位址和機器的MAC位址乙,兩種方法都有效。取得機器的MAC位址乙,我只是做了一個 ARP 請求。
然而,什麼是正確的方法呢?
我用Wireshark在機器上監控流量A與tcp轉儲在機器上乙。這是機器上的輸出乙(e0:d5:5e:c6:52:9a
是機器的MAC位址乙):
指定機器時乙的 MAC 位址作為目標位址(a0:ce:c8:10:75:8c
是機器的網路卡 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
是路由器的網路卡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 主機位址相對應,具有正確的乙太網路目標位址到。