Транспортный уровень: TCP и UDP

(здесь планировался ещё разговор про NAT, но он не получился) Цели:

  1. Цельность передаваемых данных и надёжность передачи
  2. Различение потоков и управление ими

Задачи:

UDP — «один пакет», TCP — поток

Порт + поток ⇒ клиент/сервер. Асимметричная (клиент-серверная) природа транспортных протоколов.

Привязка портов: /etc/services и временный порт отправителя.

TCP

Статья в Википедии

  1. Установление (и завершение) соединения
  2. Подтверждение доставки каждого пакета
  3. Уведомление об ошибках
  4. Повторная передача при отсутствии уведомлений
  5. Окно «одновременно» пересылаемых пакетов
  6. Поддержка цельности потока / порядка пакетов с помощью Sequential Number
  7. Двунаправленное (т. е. состоит из двух встречных потоков)

Sequential Number

Задачи:

Решение:

Подключение

Пакеты могут носить с собой т. н. флаги — это способ управления соединением

3-way handshake — установление двунаправленного соединения (флаг SYN — запрос на подключение, флаг FIN — запрос на отключение, флаг ACK — подтверждение получения пакета):

Завершение соединение может инициировать любая сторона.

Обработка ошибок и обеспечение надёжности

Получение каждого пакета в каждую сторону нужно подтвердить (ACK)

Sliding Window

Средство от всего — Sliding window protocol и «низкий старт».

Окно — это последовательная группа пакетов из потока, которую можно передавать/получать «одновременно», не дожидаясь подтверждения каждого. При получении очередного пакета окно «сдвигается» на следующий ещё не полученный. Если пакеты идут с разной скоростью или пропадают, в окне получателя образуется «недопринятая» область:

  1. Непрерывное начало потока уже получено целиком
  2. Недопринятая область (с неё начинается окно)
    • Первый пакет в окне ещё не получен
    • Далее — какие-то пакеты в окне получены, какие-то — нет
    • Последний из полученных пакетов в окне
  3. Ещё не полученные пакеты в окне
  4. Остальные пакеты потока пока только предполагаются ☺

Фиксированное окно

Будем называть «очередными» пакеты, принадлежащие уже полученному потоку, а «внеочередными» — пакеты, принадлежащие недопринятой области окна, т. е. полученные раньше, чем какой-то предыдущий потока.

Этот алгоритм содержит несколько избыточное количество подтверждений, но:

Демо:

Масштабируемое окно

Чем больше окно, тем больше потенциальная пропускная способность:

Чем меньше окно, тем меньше пропускная способность (спасибо, Кэп).

Поэтому размер окна может изменяться в зависимости от «качества» канала передачи данных.

Напомним, что TCP — двунаправленное соединение, и во встречном потоке данных действуют те же правила, а абоненты меняются ролями.

Дурацкое маленькое окошко на медленных / ненадёжных каналах.

Пример масштабирования окна (без обработки ошибок)

У скользящего окна ∃ ещё «быстрый старт» и много-много модификаций…

UDP

Применение: DNS, traceroute, DHCP, SNMP, NTP

Использование netcat и socat

TODO

Другие варианты транспорта?

Д/З

Новое в образе: conntrack, ssh для root и приколы для лекций ☺

Задание 6

  1. Суть: Почитать документацию по socat (руководство, есть статьи попроще ☺) и организовать проброс TCP-соединения и UDP-датаграммы без использования маршрутизации.

  2. Площадка: Клиент-1 ←сеть1→ Клиент-2 ←Сеть-2→ Клиент-3
    • Настроить сеть на всех хостах заранее, в отчёт не входит
  3. Отчёт:
    1. (на Клиенте-1) report 6 client1

      • Запустить socat в режиме listen на каком-нибудь TCP-порту с перенаправлением вывода на стандартный вывод

    2. (на Клиенте-2) report 6 client2

      • Запустить socat в режиме listen на каком-нибудь TCP-порту и выводом на TCP-порт Клиента-1

    3. (на Клиенте-3) report 6 client3

      • Запустить cal и перенаправить с помощью socat вывод на TCP-порт Клиента-2

      • В результате этой команды на Клиенте-1 появится вывод cal и все socat-ы остановятся

    4. (снова на Клиенте-1, report не останавливаем)
      • Запустить socat в режиме UDP-RECVFROM: (см. документацию) на каком-нибудь UDP-порту с перенаправлением вывода на стандартный вывод

    5. (снова на Клиенте-2, report не останавливаем)
      • Запустить socat в режиме UDP-RECVFROM: на каком-нибудь UDP-порту с выводом на UDP-порт Клиента-1 (режим UDP-SENDTO:)

    6. (снова на Клиенте-3)
      • Запустить cal и перенаправить с помощью socat (режим UDP-SENDTO:) вывод на UDP-порт Клиента-2

      • В результате этой команды на Клиенте-1 появится вывод cal и все socat-ы остановятся

    7. Остановить все report-ы
  4. Три отчёта (названия сохранить, должно быть: report.06.client1, report.06.client2 и report.06.client3) переслать одним письмом в качестве приложений на uneexlectures@cs.msu.ru

LecturesCMC/LinuxNetwork2022/06_TransportProtocols (последним исправлял пользователь FrBrGeorge 2022-04-02 23:57:32)