LINUX.ORG.RU

Поясните по сетевым интерфейсам

 ,


1

3

Каша в голове, да. Я прав или где-то ошибаюсь?

Значит такая модель. Есть 4 сетевых интерфейса: eth0, wlan0, tun0, tap0. Для каждого есть драйвер и какая-то плата, либо юзерспейсное приложение.

Открываем мы значит лор в браузере, http-запрос (прикладной уровень) упаковывается в ip-пакет (сетевой уровень). Согласно нашим таблицам маршруторизации ip-пакет пойдёт по одному из сетевых интерфейсов. При этом различий в ip-пакете не будет. Значит для сетевых интерфейсов есть какая-то общая функция типа send_data(interface, data).

Дальше начинаются различия.

В eth0 ip-пакет по идее должен быть упакован в ethernet-frame. Это происходит в драйвере или уже на плате? А может бывает по разному?

В wlan0 ip-пакет будет упакован во что-то похожее на ethernet-frame, но другое, так как wifi и ethernet отличаются на канальном и физическом уровнях.

В tap0 ip-пакет будет упакован драйвером в ethernet-frame и передан в юзерспейсное приложение.

В tun0 ip-пакет никуда не будет упакован, а будет сразу передан драйвером в юзерспейсное приложение.

Так или не так?


Ответ на: комментарий от mv

Да. Пытаюсь провести параллели между ней и линуксовым софтом.

anonymous
()
В eth0 ip-пакет по идее должен быть упакован в ethernet-frame. Это происходит в драйвере или уже на плате? А может бывает по разному?

Насколько я помню, в устройство уже уходит сформированный пакет со всеми хедерами. А бывает ли по-разному - самому интересно.

hts-al
()

Забыл про TCP (если речь про HTTP).

Для того чтобы правильно упаковать IP в Ethernet карта должна знать какой Dest MAC подставить. Для пакетов в той же IP подсети как у отправителя, для этого в принципе достаточно держать на карте ARP cache (немного странно, но почему бы и нет). А вот для других подсетей надо поглядеть в таблицу маршрутизации.
Если ты уже поглядел в неё один раз из драйвера/OS, то зачем делать это второй раз на карте?
Пусть карта своим дело занимается — лепит преамбулу, заполнитель и FCS =)

frob 😊
()
Последнее исправление: frob (всего исправлений: 1)

Все зависит от конкретной реализации, в общем случае драйвер сетевого устройства должен зарегестрировать в системе класс реализующий сетевой интерфейс (struct net_device from include/linux/netdevice.h). В этой структуре есть 2 основные таблицы виртуальных методов (const struct net_device_ops *netdev_ops; const struct header_ops *header_ops;)

Если сетевой стек хочет отправить данные в какойто сетевой интерфейс он вызывает ndo_start_xmit (из таблицы netdev_ops) для данного интерфейса и передает туда сокет буффер в котором находятся данные на отправку (struct sk_buff from include/linux/skbuff.h). Как реально заполняются и создаются заголовки и тело пакета система в принципе не знает, всем занимается конкретный драйвер. Но есть куча шаблонов для драйверов (например шаблон типичного ETHERNET адаптера - include/linux/etherdevice.h, и если нужно написать новый драйвер для ethernet адаптера то как правило наследуют этот шаблон и реализовывают только части которые «соприкасаются» с железом).

zaz
()
Ответ на: комментарий от zaz

Как реально заполняются и создаются заголовки и тело пакета система в принципе не знает

Пакета какого уровня? IP-заголовки создаются снаружи или в драйвере конкретного девайса? Или тоже зависит от реализации?

suuaq
() автор топика
Ответ на: комментарий от suuaq

Посмотрите структуру sk_buff - там заголовки лежат отдельно, данные отдельно. Насколько я понимаю заполнением HW заголовков занимается драйвер сетевого устройста, но опять таки если драйвер унаследован от базавого ethernet устройства то скорее всего заголовками будет заниматся эта базавая библиотека.

zaz
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.