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). Однако в контексте взаимодействия “абонент-сеть” выделяют две сущности:
- User Data (SDU — Service Data Unit): Это исходный блок данных, который приложение передает транспортному уровню. Это чистая информация без заголовков.
- 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).
Алгоритм работы в ненадежной среде:
- Отправитель посылает сегмент и запускает таймер.
- Если таймер истекает (Timeout), а подтверждение (ACK) не пришло, сегмент считается потерянным.
- Отправитель ретранслирует (повторно отправляет) этот сегмент.
- Благодаря порядковым номерам (Sequence Numbers), получатель может корректно собрать данные, даже если они пришли не по порядку, и отбросить дубликаты.
4. Жесткое разъединение (Abortive Release / RST-пакет)
В TCP существует два типа закрытия соединения: штатное (полуоткрытое, с помощью FIN) и жесткое (сброс).
Жесткое разъединение инициируется отправкой сегмента с установленным флагом RST (Reset).
Сценарии использования:
- Приложение аварийно завершило работу, и ОС закрывает сокет принудительно.
- Хост получает сегмент для несуществующего соединения (порт закрыт) — отправляет RST в ответ, чтобы “отшить” отправителя.
- Таймаут соединения превышен, и хост решает, что связь потеряна безвозвратно.
Особенность: В отличие от FIN, после отправки RST не требуется обмена подтверждениями и пересылки оставшихся данных. Буферы немедленно очищаются, соединение уничтожается двусторонне (обе стороны считают канал разорванным). Это аварийный, “грубый” способ, используемый для экономии ресурсов при сбоях.
5. Процедура «Тройное рукопожатие» (Three-Way Handshake)
Это стандартный метод установления TCP-соединения. Его цель — синхронизировать порядковые номера (Sequence Numbers) обеих сторон и подтвердить готовность к обмену.
Пошаговый процесс:
Шаг 1 (SYN):
- Клиент отправляет серверу сегмент с флагом SYN=1.
- Указывает свой начальный порядковый номер:
SEQ = X(например, 100). - Состояние клиента:
SYN_SENT.
Шаг 2 (SYN-ACK):
- Сервер получает SYN, выделяет буферы и отправляет ответ.
- Флаг SYN=1, флаг ACK=1.
- Указывает свой начальный номер:
SEQ = Y(например, 500). - В поле подтверждения (Acknowledgment) ставит:
ACK_NUM = X + 1(то есть 101), показывая, что он ждет следующий байт от клиента. - Состояние сервера:
SYN_RCVD.
Шаг 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) позволяет получателю сообщать точные неподтвержденные диапазоны данных. Отправитель, видя “дырку”, ретранслирует только потерянный сегмент, продолжая слать новые данные в пределах оставшейся части окна, не дожидаясь заполнения всей дырки. Это максимально утилизирует пропускную способность канала.
Резюмирующая схема работы
- Приложение генерирует данные (SDU).
- Транспортный уровень (TCP) нарезает их на сегменты (PDU), присваивает SEQ.
- Через Тройное рукопожатие согласовываются начальные SEQ и размер Окна (rwnd).
- Отправка идет пачками (размер окна). Таймеры контролируют потери в ненадежной сети.
- При получении кумулятивного ACK окно сдвигается.
- При критической ошибке или отказе инициируется RST (Жесткое разъединение), мгновенно освобождающее ресурсы без ожидания таймаутов.