
Недавно я начал изучать модель OSI, сетевое взаимодействие и т. д.
Поскольку мне нравится писать код на языке C, я хотел отправлять собственные кадры Ethernet.
Теперь у меня это работает, однако я все еще не уверен в одном:
при отправке кадра Ethernet с машиныАк машинеБ(предполагая, что обе машины находятся в одной сети), какой MAC-адрес мне нужно указать в качествеМесто назначенияMAC-адрес кадра?
Я пробовал как MAC-адрес моего маршрутизатора, так и MAC-адрес машиныБ, оба способа работают. Чтобы получить MAC-адрес машиныБ, я просто сделал ARP-запрос.
Однако как правильно поступить?
Я отслеживал трафик с помощью Wireshark на машинеАи сtcpdumpна машинеБ. Это вывод на машинеБ( e0:d5:5e:c6:52:9a
это MAC-адрес машиныБ):
При указании машиныБMAC-адрес в качестве адреса назначения ( a0:ce:c8:10:75:8c
это MAC-адрес сетевой карты машины)А):
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-адрес и, вероятно, использует свой кэш для определения правильного MAC-адреса назначения для IP-адреса назначения.
Как маршрутизатор обрабатывает кадр, в котором указан MAC-адрес машины?Буказано?
Есть ли разница между этими двумя способами?
Есть ли один предпочтительный/правильный способ?
решение1
В целом правильный метод, если вы знаете, что конечный компьютер находится в локальной подсети, заключается в прямом использовании MAC-адреса конечного компьютера (при необходимости выполняя поиск ARP). Это сработаетнесмотря ни на чтоethertype или содержимого кадра и, как правило, обходит маршрутизатор (он будет закорочен через коммутатор Ethernet).
Есликадр содержит IPv4 или IPv6, вы можете отправить его на маршрутизатор подсети, который выполнит поиск ARP и перешлет полезную нагрузку кадра на любой хост, которому принадлежит IP-адрес назначения. (В конце концов, именно это и делают маршрутизаторы)делать:(Они пересылают IP-пакеты — даже если это означает просто их отражение обратно на тот же интерфейс.)
Однако отправка локальных пакетов через маршрутизатор неэффективна и совершенно не нужна в большинстве случаев. Для более дешевых маршрутизаторов это может означать обработку пакета очень медленным ЦП (по сравнению с полной скоростью линии коммутатора Ethernet).
Тем не менее, второй методявляетсяиногда используется на практике вместе с функциями «изоляции клиента» (т. н. «частной VLAN») на коммутаторах и точках доступа.
решение2
Помните, что в Ethernet нет маршрутизаторов. Маршрутизаторы — это концепция уровня 3 (сетевого уровня, где, например, находится IP), который находится на уровне выше Ethernet, о котором сам Ethernet, как предполагается, не имеет никакого представления.
Правильным адресом для указания в поле назначения заголовка Ethernet является MAC-адрес Ethernet хоста назначения.
В своем вопросе вы также упоминаете отправку кадра Ethernet на хост, и, как оказалось, этот кадр Ethernet содержал IP-дейтаграмму для другого IP-хоста, нежели пункт назначения Ethernet, на который вы его отправили. Так что этот IP-хост оказался маршрутизатором и перенаправил вашу IP-дейтаграмму для вас, отправив ее обратно в ту же локальную сеть Ethernet, но на этот раз с правильным адресом назначения Ethernet, соответствующим адресу IP-хоста, на который была направлена IP-дейтаграмма.