View on GitHub

Methodics of Linux Network Protocols

Practical materials for learning TCP/IP and its implementation on Linux

Физический уровень наиболее далёк от Linux, поскольку описывает буквально оторванную от компьютеров часть стека протоколов. Именно по этой причине у производителей сетевого оборудования в стеке TCP/IP оказывается четыре уровня: физический и интерфейсный уровни для сетевого устройства мало различимы с практической точки зрения.

Особенности физического уровня

В первой главе мы обсудили, что физический уровень решает вопрос определения среды передачи данных. Унификация заключается в описании самой среды передачи данных, а систематизировать нужно правила передачи и формат данных в этой среде.

Свойства среды передачи данных

При описании свойств одним из первых фиксируется способ передачи данных.

Коммутация каналов больше подходит для аналоговых потоков (классический пример — телефонный разговор, где всё время соединения идёт непрерывный поток данных). Раньше коммутация каналов требовала даже отдельных линий для сеансов связи, сейчас с помощью частотной модуляции (использования нескольких несущих частот для одной среды передачи данных) появилась возможность поддерживать несколько соединений на одном физическом канале.

В случае цифрового потока применяется модель с разделением данных, она же коммутация пакетов, при которой отдельные блоки данных особым образом маркируются и передаются через одну среду передачи данных. Главной проблемой такого метода является огромное количество маркирующей метаинформации, нередко в разы превышающей размеры самого сообщения.

Передавать данные можно с помощью чего угодно. Даже в рамках стандарта передачи физического уровня RS-232 возможно реализовать передачу по трём проводам (RxD, TxD, GND), пяти (+RTS, CTS) или классически по 9 (включая «землю»). Существуют также более сложные стандарты. Таким, например, является RS-485, использующий дифференцированный сигнал, более устойчивый к помехам.

Отдельно стоит упомянуть витую пару. Её технологии разработки включают в себя множество параметров, влияющих на свойства среды: сопротивление провода, шаг скрутки проводов основного и дифференциального сигнала, прослойка между витыми парами в кабеле для повышения надёжности и качества сигнала. Существует даже отдельный набор стандартов, где описаны все возможные комбинации и их характеристики.

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

Формат данных

Переходим к систематизации — определению формата данных и правил передачи.

Первым определяется физическое кодирование данных — представление 0 и 1 в передаваемых сигналах. В зависимости от типа сигнала и типа среды можно выделить 4 базовых комбинации (для каждой из них определяется свой способ кодирования):

При кодировании необходимо синхронизировать поток данных. Например, для прямого алгоритма кодирования NRZ необходимо вводить в поток синхронизирующие метки. Они задают начало передачи и синхронизируют частоту работы приемника и передатчика в процессе этой передачи. Существуют более сложные самокорректирующиеся кодировки, например, Манчестерское кодирование, которое используется в стандарте 10BASE-T Ethernet. В нем данные считываются по направлению фронта изменения напряжения, а не по уровню напряжения. TODO По ним определяется … обработка метаинформации … частотного потока — что??

На слой систематизации ложится также задача отличия данных от шума и посторонней информации в среде. Это называется проблема кадра, она определяет обязательное наличие у информационного блока преамбулы — информации, оповещающей о начале сообщения и какой-то метаинформации о нём. В этом месте физический уровень очень сильно пересекается с интерфейсным, поскольку описание кадра входит в его область задач.

В задачу определения формата передачи входит и обнаружение ошибок. Среда передачи данных — основной источник помех и проблем с данными, и чем она хуже, тем важнее прямо на этом же уровне провести проверку и чистку данных, нежели передавать избыточную информацию для обработки на вышестоящих уровнях.

Элементарный способ определения ошибок — добавление бита чётности. В случае линейного кодирования возможно даже исправление одной ошибки. Для большей защиты используются более сложные кодировки.

При передаче также может возникать проблема «накопления единицы». Подача однотипного сигнала приводит к нарушению работы канала, резонансу и так называемой «усталости среды» — рассинхронизации частот передатчика и приёмника. Для решения этой проблемы используется скремблинг — технология преобразования данных с помощью последовательности псевдослучайных чисел. Объединение информационного сообщения с псевдослучайным рядом разрушает однотипные цепочки, делая поток данных более разнородным и менее вредящим среде. На приёмнике данные преобразоуются обратно по тому же псевдослучайному ряду.

Linux в физической области

Что получает сама операционная система со стороны аппаратного уровня? На самом деле, информация очень сильно урезана, поскольку интерфейсный уровень может лишь программно воздействовать на среду (в VirtualBox даже эти действия очень ограничены, поскольку эмуляция настолько тонкой реальной передачи трудно реализуема).

Для практического исследования физического уровня организуем соединение для двух устройств и передадим через них данные. Соединение в VirtualBox эмулируется через описание подключений в COM-порты. Для настройки канала связи между двумя устройствами используется сокетное соединение (в VirtualBox оно называется Host Pipe).

TODO Какие такие base и second? TODO Где вообще раздел по работе с VirtualBox??

base и second — названия виртуальных машин, настройка будет делаться на COM-порт 2 (--uart2), для одного устройства поставим настройку создания канала (server), для второго — только подключение к нему (client).

TODO чуть подробнее о том, что это за client и server такие

VBoxManage modifyvm base --uart2 0x02f8 3 --uart-mode2 server peep
VBoxManage modifyvm second --uart2 0x02f8 3 --uart-mode2 client peep

Внутри виртуальной машины посмотреть параметры порта можно с помощью команды stty:

base

[root@base ~]# stty -a  
speed 9600 baud; rows 51; columns 103; line = 0;  
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>;  
start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; discard = ^O; min = 1; time = 0;  
-parenb -parodd -cmspar cs8 hupcl -cstopb cread clocal -crtscts  
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon ixoff -iuclc -ixany -imaxbel  
iutf8  
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0  
isig icanon -iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt -echoctl echoke -flusho  
-extproc  
[root@base ~]#

От физического уровня сюда проникает только аппаратная скорость передачи (9600 bit/sec), но никак воздействовать на неё VBox возможности не даёт.

Для просмотра конкретного порта (а не текущего) можно использовать специальный флаг -F, а можно использовать перенаправление на нужный порт:

base

[root@base ~]# stty -a < /dev/ttyS1  
speed 9600 baud; rows 0; columns 0; line = 0;  
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>;  
start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; discard = ^O; min = 1; time = 0;  
-parenb -parodd -cmspar cs8 hupcl -cstopb cread clocal -crtscts  
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl -ixon -ixoff -iuclc -ixany -imaxbel  
-iutf8  
-opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0  
-isig -icanon iexten -echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke -flusho  
-extproc  
[root@base ~]#

К слову сказать, ещё одно устройство, соединённое со средой передачи данных — это Ethernet-адаптер. Некоторые сведения по этой среде можно получить командой ethtool:

base

[root@base ~]# ethtool eth0  
Settings for eth0:  
       Supported ports: [ TP    AUI ]  # аппаратный параметр — поддерживаемые среды передачи данных
       Supported link modes:   Not reported
       Supported pause frame use: No
       Supports auto-negotiation: No
       Supported FEC modes: Not reported
       Advertised link modes:  Not reported
       Advertised pause frame use: No
       Advertised auto-negotiation: No
       Advertised FEC modes: Not reported
       - Speed: 10Mb/s   # аппаратный параметр — скорость передачи
       Duplex: Half
       Auto-negotiation: off
       Port: AUI  # аппаратный параметр — текущий подключённый порт
       PHYAD: 0
       Transceiver: internal
       Current message level: 0x00000007 (7)
                              drv probe link
       Link detected: no
[root@base ~]#

TODO Переделать комментарии в список под копипастой

Вернёмся к последовательному порту. Для работы вначале отключим cooked mode для порта. Он позволяет интерпретировать управляющие последовательности при работе с терминалом (вторая и третья строчки вывода stty -a), для нас же важна передача байтов в чистом виде без преобразований — т.н. raw mode. Также отключим эхо — режим, при котором символы отображаются на терминале немедленно после ввода, ещё до того, как данные будут переданы операционной системе. Когда командная строка получит введённые символы, она их выведет, и если не выключить эхо, каждая буква отобразится дважды.

Для base используем команду cat для получения данных с порта:

base

[root@base ~]# stty raw -echo < /dev/ttyS1  
[root@base ~]# cat /dev/ttyS1


Сделаем аналогичное отключение режимов в second, а после передадим через порт календарь:

second

[root@second ~]# stty raw -echo < /dev/ttyS1  
[root@second ~]# cal > /dev/ttyS1  
[root@second ~]#

При этом календарь будет прочитан в base:

base

[root@base ~]# cat /dev/ttyS1  
   February 2025
Su Mo Tu We Th Fr Sa  
                  1
2  3  4  5  6  7  8
9 10 11 12 13 14 15  
16 17 18 19 20 21 22  
23 24 25 26 27 28

  
[root@base ~]#
[root@base ~]#

Домашнее задание

  1. Дважды склонировать базовый образ (виртуалки будут называться base и second)
  2. Настроить COM2 в двух образах на работу с сокетом («настройки ВМ → COM-порты» «Порт2 → хост-канал» + какое-нибудь имя, например, vboxport; см. подсказку VirtualBox-а, как это должно называться под Windows — там хитро)
    • На одном хосте поставить галочку «подключаться к уже существующему каналу», на другом — нет (он-то будет открывать сокет) (В результате запись в COM2 на одной машине должна приводить к чтению из COM2 на другой и наоборот)
    • Если делать то же самое из командной строки:
      VBoxManage modifyvm base --uart2 0x02f8 3 --uart-mode2 server название_канала
      VBoxManage modifyvm second --uart2 0x02f8 3 --uart-mode2 client название_канала
      
  3. Отчёты:
    • На базовой машине (report 1 base)
      • stty -a < /dev/ttyS1
      • stty raw -echo < /dev/ttyS1
      • stty -a < /dev/ttyS1
      • cat /dev/ttyS1
      • после получения текста нажать ^C (Это control+C)
      • (не забыть ^D для остановки отчёта)
    • На клоне (report 1 second)
      • stty -a < /dev/ttyS1
      • stty raw -echo < /dev/ttyS1
      • date > /dev/ttyS1
      • stty -a < /dev/ttyS1
      • (не забыть ^D для остановки отчёта)
  4. Получить оба отчёта с виртуалок. Например, перенастроить на обеих машинах COM2 для получения через него отчёта в файл, и тем же cat засунуть его туда

  5. Оба отчёта (report.01.base и report.01.second) именно с такими названиями переслать одним письмом в качестве двух приложений на uneexlectures@cs.msu.ru
    • В теме письма должно встречаться слово LinuxNetwork2027
    • Перед отправкой обязательно проверьте, что отчёт не битый и открывается как tar.gz-архив! Если он побился, возможно, вы не сделали stty raw -echo.