Интерфейсный уровень и его представление

Долги за прошлую лекцию:

Задачи интерфейсного уровня:

  1. Подключение среды передачи данных к устройству (собственно интерфейс)

    • Как отличить данные от не-данных (или начало от середины)?
    • Метаинформация
  2. Дисциплина использования среды
    • Очерёдность, коллизии, приоритеты и т. п.
    • Защита данных и авторизация абонента

Инкапсуляция на аппаратном уровне (то, чего на интерфейсном уровне не видно):

Ethernet:

Пример принципиально иной дисциплины доступа: Token Ring

Фреймы (пакеты интерфейсного уровня)

Сеть с разделением пакетов (окончательно)

Состав фрейма:

Ethernet

Общая среда ⇒

⇒ нет гарантированного времени доставки

Linux

Настройка внутренней сети в VBox

../../LinuxNetwork2022/02_DataLink/intnet.png

Проверка работоспособности

Минимальный размер фрейма — 64 октета (включая 4 октета контрольной суммы, которая формируется / проверяется аппаратно и не выводится).

Если вместо -XX написать -X, увидим только payload — «Hi».

Если запустить tcpdump с добавочным ключом -p, то:

Протоколы интерфейсного уровня

Вообще-то Тысячи их

Wi-Fi

Например, IEEE 802.11g

WIFI в Linux

(На всякий случай — в конце лекции) Взято отсюда. См. также

Если успеем: TUN/TAP

Отступление о screen: как запустить два шелла в одной консоли:

Два сеанса:

(tmux был бы лучше, но он требует glibc-locales, ждём lite сборки)

(TODO ip tuntap add tap0 mode tap и т. д. — упирается в /dev/net/tun: File descriptor in bad state, потому что требует указания, куда его цеплять, см тут )

ЧЕРНОВИК:

# ip tuntap add mode tap name tap
# ip link set tap0 up
# # TUNSETIFF — системный вызов, зависит от ядра
# cat tap.py
import struct
import sys
import fcntl
import binascii

IFNAMSIZ = 16
IFREQSIZ = 40
TUNSETIFF = 0x400454ca

fformat = f"{IFNAMSIZ}sH{IFREQSIZ-2-IFNAMSIZ}s"
sflags = """
#define IFF_TUN         0x0001
#define IFF_TAP         0x0002
#define IFF_NAPI        0x0010
#define IFF_NAPI_FRAGS  0x0020
#define IFF_NO_CARRIER  0x0040
#define IFF_NO_PI       0x1000
#define IFF_ONE_QUEUE   0x2000
#define IFF_VNET_HDR    0x4000
#define IFF_TUN_EXCL    0x8000
#define IFF_MULTI_QUEUE 0x0100
#define IFF_ATTACH_QUEUE 0x0200
#define IFF_DETACH_QUEUE 0x0400
#define IFF_PERSIST     0x0800
#define IFF_NOFILTER    0x1000
""".strip().split()
fflags = {sflags[i+1]: int(sflags[i+2], 16) for i in range(0, len(sflags), 3)}

ifname = sys.argv[1] if len(sys.argv) > 1 else "tap0"
fd = open("/dev/net/tun", "rb")
print(fflags)
ifreq = struct.pack(fformat, ifname.encode(), fflags["IFF_TAP"], b'')
print(binascii.hexlify(ifreq, ' '))
fcntl.ioctl(fd, TUNSETIFF, ifreq)
while s := fd.read(128):
    print(s)
# python3 tun.py
# # На другом экране:
# cal | socat - INTERFACE:tap0

Ещё один вариант (используется пропатченный ioctl из Сизифа):

# {
echo "74 61 70 30 00 00 00 00 00 00 00 00 00 00 00 00 02 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00" | xxd -r -p | ioctl 3 TUNSETIFF -s 40
ioctl 3 TUNGETIFF -s 40 | hexdump -C
cal >&3
} 3> /dev/net/tun
# # На другом экране:
# tcpdump -XXe -i tap0

Д/З

Новый Образ

Задание 2

Воспроизвести пример из лекции с двумя виртуалками, объединёнными внутренней сетью

LecturesCMC/LinuxNetwork2024/02_DataLink (последним исправлял пользователь FrBrGeorge 2024-02-26 12:02:46)