Каша в голове, да. Я прав или где-то ошибаюсь?
Значит такая модель. Есть 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-пакет никуда не будет упакован, а будет сразу передан драйвером в юзерспейсное приложение.
Так или не так?