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

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

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

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

    • Очерёдность, коллизии, приоритеты и т. п.
    • Защита данных и авторизация абонента

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

Ethernet:

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

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

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

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

Ethernet

Общая среда ⇒

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

Linux

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

VB_Intnet.png

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

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

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

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

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

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

Wi-Fi

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

WIFI в Linux

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

TUN/TAP

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

tmux

TODO

Виртуальный интерфейс tap.

Вручную сложнее всего вызвать этот самый ioctl. Вот программа tapdump.py:

   1 import struct
   2 import sys
   3 import fcntl
   4 import binascii
   5 
   6 IFNAMSIZ = 16
   7 IFREQSIZ = 40
   8 TUNSETIFF = 0x400454ca
   9 
  10 fformat = f"{IFNAMSIZ}sH{IFREQSIZ-2-IFNAMSIZ}s"
  11 sflags = """
  12 #define IFF_TUN         0x0001
  13 #define IFF_TAP         0x0002
  14 #define IFF_NAPI        0x0010
  15 #define IFF_NAPI_FRAGS  0x0020
  16 #define IFF_NO_CARRIER  0x0040
  17 #define IFF_NO_PI       0x1000
  18 #define IFF_ONE_QUEUE   0x2000
  19 #define IFF_VNET_HDR    0x4000
  20 #define IFF_TUN_EXCL    0x8000
  21 #define IFF_MULTI_QUEUE 0x0100
  22 #define IFF_ATTACH_QUEUE 0x0200
  23 #define IFF_DETACH_QUEUE 0x0400
  24 #define IFF_PERSIST     0x0800
  25 #define IFF_NOFILTER    0x1000
  26 """.strip().split()
  27 fflags = {sflags[i+1]: int(sflags[i+2], 16) for i in range(0, len(sflags), 3)}
  28 
  29 ifname = sys.argv[1] if len(sys.argv) > 1 else "tap0"
  30 fd = open("/dev/net/tun", "rb")
  31 print(fflags)
  32 ifreq = struct.pack(fformat, ifname.encode(), fflags["IFF_TAP"], b'')
  33 print(binascii.hexlify(ifreq, ' '))
  34 fcntl.ioctl(fd, TUNSETIFF, ifreq)
  35 while s := fd.read(128):
  36     print(s.decode())

Ежели совсем руками, можно воспользоваться утилитой ioctl (в составе дистрибутивов ALT она пропатчена специально для нас!)

TODO если успеем — socat на двух интерфейсах и IP на них

Д/З

Новый Образ

Задание 2

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

LecturesCMC/LinuxNetwork2025/02_DataLink (последним исправлял пользователь FrBrGeorge 2025-02-27 00:07:00)