Можно ли отправить все пакеты, полученные от сетевой карты, в стек TCP / IP, даже если их адрес Ethernet не совпадает с моим адресом Ethernet? Другими словами, я хочу обрабатывать все входящие пакеты на моем сетевом адаптере. Может ли кто-нибудь упомянуть возможный сценарий изменения кода драйвера сетевого интерфейса? Как я могу проверить работу кода драйвера?
Помещать все пакеты, полученные на сетевой карте, в стек TCP / IP
Ответы (1)
В типичной системе это уже происходит. То есть все, что вам нужно сделать, это перевести интерфейс в неразборчивый режим. Затем драйвер отправляет все полученные пакеты в стек TCP / IP. Проверьте любой обычный сетевой драйвер, вы увидите, что при обработке полученных пакетов не происходит сравнения MAC-адреса (или Ethernet-адреса) с MAC-адресом устройства.
Значительное упрощение:
Обычно происходит то, что, когда у вас не включен неразборчивый режим, драйвер настраивает устройство таким образом, что оно фильтрует по определенному MAC-адресу, доставляя только кадры с совпадающим адресом или широковещательным адресом ( или иногда адрес многоадресной рассылки, который может также фильтроваться, а может и не фильтроваться). Когда вы включаете неразборчивый режим, драйвер просто сообщает устройству не фильтровать по MAC-адресу, а доставлять все кадры. Затем драйвер получит все кадры и доставит их в стек. В Linux это обычно происходит через вызов netif_receive_skb () или его вариант.
Сам стек TCP / IP не заботится об MAC-адресе. Вместо этого он будет искать пакеты с адресом IP, совпадающим с его собственным. Любые полученные пакеты, у которых нет IP-адреса, принадлежащего этому ящику, просто отбрасываются - если только программа пользовательского режима не пытается получить необработанные пакеты (например, tcpdump). [В последнем случае он все равно отбрасывается после доставки в tcpdump.]
Если он совпадает с IP-адресом, он затем передается по стеку в TCP или UDP [и т. Д.] - где он также может быть отброшен, если он не соответствует сеансу / порту, о котором заботится что-либо в коробке.
Но обычно пакеты, предназначенные для MAC-адреса, не совпадающего с адресом, назначенным этому устройству, не будут пакетами, которые важны для этой машины. Следовательно, неразборчивый режим обычно включен только для отладки, устранения неполадок, криминалистической экспертизы (например, tcpdump, wirehark и т. Д.). В остальное время это пустая трата ресурсов обработки, поскольку пакеты просто отбрасываются.
accept()
уже существующее соединение? Какую розетку вы бы использовали? - person Guido   schedule 03.12.2013