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 ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.