Skip to content

3.7 Функционирование транспортного уровня. Блоки данных абонентов сети. Вариант протокола для работы с ненадежной сетью. Жесткое разъединение. Процедура «тройное рукопожатие». Особенности реализации процедуры «окно».

1. Функционирование транспортного уровня (Layer 4)

Транспортный уровень является связующим звеном между прикладным процессом (пользовательскими данными) и физической средой передачи (сетью). Его главная задача — обеспечить сквозную (end-to-end) доставку данных независимо от того, из каких подсетей состоит глобальная сеть.

Ключевые функции:

  • Мультиплексирование/Демультиплексирование: Преобразование множества потоков данных от приложений в один поток для отправки и наоборот. Идентификация осуществляется через порты (Source Port / Destination Port).
  • Сегментация: Разбиение длинного сообщения от приложения на блоки данных (сегменты), размер которых не превышает Maximum Segment Size (MSS), чтобы избежать фрагментации на сетевом уровне.
  • Управление потоком (Flow Control): Предотвращение переполнения буфера приемника (механизм скользящего окна).
  • Управление перегрузками (Congestion Control): Защита сети от коллапса, когда отправитель снижает скорость из-за потерь пакетов в маршрутизаторах.

2. Блоки данных абонентов сети (Протокольные единицы)

На транспортном уровне оперируют понятием Segment (для TCP) или Datagram (для UDP). Однако в контексте взаимодействия “абонент-сеть” выделяют две сущности:

  1. User Data (SDU — Service Data Unit): Это исходный блок данных, который приложение передает транспортному уровню. Это чистая информация без заголовков.
  2. Protocol Data Unit (PDU — Protocol Data Unit): Это структурированный блок, который передается нижестоящему сетевому уровню. Он состоит из Заголовка (Header) транспортного уровня и вложенного SDU.

Структура PDU (TCP-сегмент):

  • Заголовок (20–60 байт): содержит порты, порядковые номера (Sequence Number), номера подтверждений (Acknowledgment Number), флаги и размер окна.
  • Поле данных (Payload): собственно данные абонента.

Для сети провайдера эти блоки являются “черным ящиком” (данные инкапсулированы), но для конечных хостов именно структура PDU определяет логику обмена.


3. Вариант протокола для работы с ненадежной сетью

В условиях ненадежной сети (потери пакетов, задержки, переупорядочивание) используется протокол TCP (Transmission Control Protocol).

Почему именно TCP, а не UDP?

  • UDP не гарантирует доставку — он просто отправляет датаграмму и забывает о ней.
  • TCP реализует механизмы позитивной квитанции с ретрансмиссией (PAR — Positive Acknowledgment with Retransmission).

Алгоритм работы в ненадежной среде:

  1. Отправитель посылает сегмент и запускает таймер.
  2. Если таймер истекает (Timeout), а подтверждение (ACK) не пришло, сегмент считается потерянным.
  3. Отправитель ретранслирует (повторно отправляет) этот сегмент.
  4. Благодаря порядковым номерам (Sequence Numbers), получатель может корректно собрать данные, даже если они пришли не по порядку, и отбросить дубликаты.

4. Жесткое разъединение (Abortive Release / RST-пакет)

В TCP существует два типа закрытия соединения: штатное (полуоткрытое, с помощью FIN) и жесткое (сброс).

Жесткое разъединение инициируется отправкой сегмента с установленным флагом RST (Reset).

Сценарии использования:

  1. Приложение аварийно завершило работу, и ОС закрывает сокет принудительно.
  2. Хост получает сегмент для несуществующего соединения (порт закрыт) — отправляет RST в ответ, чтобы “отшить” отправителя.
  3. Таймаут соединения превышен, и хост решает, что связь потеряна безвозвратно.

Особенность: В отличие от FIN, после отправки RST не требуется обмена подтверждениями и пересылки оставшихся данных. Буферы немедленно очищаются, соединение уничтожается двусторонне (обе стороны считают канал разорванным). Это аварийный, “грубый” способ, используемый для экономии ресурсов при сбоях.


5. Процедура «Тройное рукопожатие» (Three-Way Handshake)

Это стандартный метод установления TCP-соединения. Его цель — синхронизировать порядковые номера (Sequence Numbers) обеих сторон и подтвердить готовность к обмену.

Пошаговый процесс:

  1. Шаг 1 (SYN):

    • Клиент отправляет серверу сегмент с флагом SYN=1.
    • Указывает свой начальный порядковый номер: SEQ = X (например, 100).
    • Состояние клиента: SYN_SENT.
  2. Шаг 2 (SYN-ACK):

    • Сервер получает SYN, выделяет буферы и отправляет ответ.
    • Флаг SYN=1, флаг ACK=1.
    • Указывает свой начальный номер: SEQ = Y (например, 500).
    • В поле подтверждения (Acknowledgment) ставит: ACK_NUM = X + 1 (то есть 101), показывая, что он ждет следующий байт от клиента.
    • Состояние сервера: SYN_RCVD.
  3. Шаг 3 (ACK):

    • Клиент получает SYN-ACK.
    • Отправляет сегмент с флагом ACK=1.
    • SEQ = X + 1 (101).
    • ACK_NUM = Y + 1 (501), подтверждая получение SYN от сервера.
    • Состояние клиента переходит в ESTABLISHED.
    • Сервер, получив этот ACK, также переходит в ESTABLISHED.

Итог: Номера синхронизированы, оба знают, что канал работает в обе стороны.


6. Особенности реализации процедуры «Окно» (Sliding Window)

Механизм “Окно” решает две задачи: управление потоком (чтобы не завалить медленного приемника) и управление перегрузкой (чтобы не завалить сеть).

А. Окно приемника (Receiver Window — rwnd)

Это динамический размер буфера свободного места у принимающей стороны.

  • Получатель в каждом ACK сообщает отправителю, сколько байт он готов принять (Window Size в заголовке TCP).
  • Отправитель не имеет права послать больше байт, чем указано в rwnd. Если окно = 0, отправитель останавливается и отправляет “ZWP” (Zero Window Probes) для проверки освобождения буфера.

Б. Окно перегрузки (Congestion Window — cwnd)

Это механизм, регулируемый отправителем на основе оценки загруженности сети (алгоритм медленного старта и избегания перегрузок).

  • Реальный размер окна отправки = min(rwnd, cwnd).

В. Особенности скользящего механизма (Сдвиг окна)

Окно сдвигается влево (в сторону увеличения порядковых номеров) только после получения подтверждения (ACK) за самый старый неподтвержденный байт.

Ключевая особенность реализации (Кумулятивные ACK):

  • TCP использует накопительные (кумулятивные) подтверждения. Если отправитель получил ACK с номером N, это значит, что все байты до N-1 гарантированно доставлены.
  • Это позволяет сдвигать окно сразу на большую группу байтов, а не на каждый байт по отдельности, что повышает эффективность.

Проблема “Дырок” (Selective Acknowledgment — SACK):

  • Базовая реализация окна плохо работает при потере одного пакета среди потока (отправитель ждет ACK для потерянного пакета и останавливает отправку новых данных — проблема “головного блокирования”).
  • Современная реализация (SACK, опция TCP) позволяет получателю сообщать точные неподтвержденные диапазоны данных. Отправитель, видя “дырку”, ретранслирует только потерянный сегмент, продолжая слать новые данные в пределах оставшейся части окна, не дожидаясь заполнения всей дырки. Это максимально утилизирует пропускную способность канала.

Резюмирующая схема работы

  1. Приложение генерирует данные (SDU).
  2. Транспортный уровень (TCP) нарезает их на сегменты (PDU), присваивает SEQ.
  3. Через Тройное рукопожатие согласовываются начальные SEQ и размер Окна (rwnd).
  4. Отправка идет пачками (размер окна). Таймеры контролируют потери в ненадежной сети.
  5. При получении кумулятивного ACK окно сдвигается.
  6. При критической ошибке или отказе инициируется RST (Жесткое разъединение), мгновенно освобождающее ресурсы без ожидания таймаутов.