Введение

Транспортный уровень. Протокол TCP. Введение

На этом занятии вы переходите от протокола UDP к протоколу TCP - одному из самых популярных протоколов стека TCP/IP. Мы разберём, чем TCP отличается от UDP, как он обеспечивает надёжную передачу потока байт, зачем нужны подтверждения и нумерация, и как устроен заголовок TCP.

Практическая часть построена как лабораторная: вы сгенерируете TCP-трафик, увидите сегменты TCP в Wireshark и научитесь находить в заголовке порты, порядковый номер, номер подтверждения и флаги.

Протокол TCP

Что такое TCP

TCP (Transmission Control Protocol - протокол управления передачей) работает на транспортном уровне моделей OSI и стека TCP/IP. Его имя входит в название самого стека - настолько он важен для современных сетей.

Протокол был описан в документе RFC 793 в 1981 году. Обновлённая версия стандарта вышла в 2022 году как RFC 9293 и объединила множество изменений, которые раньше публиковались в отдельных RFC.

Сервис TCP

Надёжная передача потока байт

TCP предоставляет приложению сервис надёжной передачи потока байт (Reliable Byte Stream). Он получает от приложения поток данных - например, файл - делит его на части, которые называются сегментами. Каждый сегмент передаётся по сети отдельно. На стороне получателя TCP собирает сегменты обратно в поток байт и передаёт его приложению.

В отличие от UDP, который передаёт отдельные короткие сообщения (дейтаграммы), TCP ориентирован на непрерывный поток и гарантирует его доставку и порядок.

Приложение -> поток байт -> TCP делит на сегменты -> сеть -> TCP собирает сегменты -> поток байт -> приложение
Проблемы ненадёжной сети

Почему TCP не доверяет сети

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

Чтобы компенсировать это, TCP обеспечивает гарантию доставки и гарантию сохранения порядка сообщений. У UDP таких гарантий нет - приложение само решает, как реагировать на потери и перестановки.

Александр
То есть TCP сам повторяет отправку, если сегмент не дошёл?
Мария
Да. Получатель подтверждает получение, а если подтверждения нет - отправитель по таймеру отправляет те же данные снова.
Подтверждения

Как TCP обеспечивает доставку

Когда отправитель передаёт данные, получатель в ответ отправляет подтверждение (Acknowledgement, часто сокращают до ACK). После получения ACK отправитель может передавать следующую порцию данных. Если подтверждение не пришло в течение заданного времени, отправитель считает, что данные не доставлены, и отправляет их заново.

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

Потеря подтверждения

Что если потеряется ACK

Если потеряется не сегмент с данными, а само подтверждение, отправитель не получит ACK и по таймеру отправит данные повторно. У получателя окажется две копии одних и тех же данных. Получатель должен понимать, что это дубликат, а не новая порция.

Кроме того, сегменты могут приходить не по порядку. Чтобы и устранить дубликаты, и восстановить правильный порядок, в TCP используется нумерация - не сообщений, а байтов в потоке.

Нумерация байтов

Порядковый номер и номер подтверждения

В TCP каждому байту в потоке присваивается номер. В заголовке сегмента передаётся порядковый номер первого байта данных в этом сегменте. Например, первый сегмент может нести байты 0-1023, второй - 1024-2047, третий - 2048 и далее.

В подтверждении указывается номер следующего ожидаемого байта. Если получатель отправил ACK с номером 1024, это значит: «все байты от 0 до 1023 получены, жду данные, начинающиеся с байта 1024». Так получатель может отбросить дубликаты и собрать сегменты в правильном порядке.

Сегмент 1: данные 0-1023, SEQ=0 Получатель: ACK=1024 (получено 0-1023, жду с 1024) Сегмент 2: данные 1024-2047, SEQ=1024 Получатель: ACK=2048
Соединение TCP

Зачем нужно соединение

Чтобы реализовать механизмы надёжности, TCP перед передачей данных устанавливает соединение. В UDP соединения нет - дейтаграмму отправили и забыли. В TCP обе стороны должны договориться о начале обмена.

Зачем это нужно? Во-первых, убедиться, что отправитель и получатель готовы обмениваться данными. Во-вторых, синхронизировать номера байт - с каких чисел начнётся нумерация в этом соединении. В-третьих, согласовать дополнительные параметры (например, максимальный размер сегмента). После завершения передачи данных соединение корректно разрывается.

Итог по логике TCP

Краткое резюме

TCP обеспечивает надёжную передачу потока байт: получает поток от приложения, делит на сегменты, передаёт по сети, на стороне получателя собирает сегменты обратно и отдаёт приложению. Все сообщения нумеруются по байтам - это даёт порядок и защиту от дубликатов. Получатель подтверждает получение; при отсутствии подтверждения отправитель повторяет передачу. Для работы всех этих механизмов TCP использует соединение - установку, обмен данными и разрыв.

Дмитрий
То есть заголовок TCP сложнее, чем у UDP - там же и номера, и флаги соединения?
Александр
Да. У TCP один из самых сложных заголовков - как раз из-за надёжности и соединения.
Формат заголовка TCP

Из чего состоит заголовок

Заголовок TCP нужен для реализации всех функций надёжности и управления соединением. Он начинается с порта отправителя и порта получателя - это адреса на транспортном уровне, как и в UDP. Далее идут порядковый номер (sequence number) - номер первого байта данных в сегменте - и номер подтверждения (acknowledgement number) - следующий ожидаемый байт.

Затем указывается смещение данных (data offset) - где в сегменте начинаются данные. Заголовок TCP имеет переменную длину: есть обязательная часть и опциональные параметры, поэтому нужно явно указывать границу заголовка и данных.

Флаги TCP

Биты управления

В RFC 9293 определено восемь флагов. SYN (synchronization) используется при установке соединения - стороны договариваются о начальных номерах байт. ACK означает, что поле «номер подтверждения» значимо; в нормальном обмене данными ACK установлен почти всегда, кроме самого первого шага установки соединения.

FIN (finish) используется для корректного разрыва соединения: каждая сторона отправляет сегмент с FIN и ждёт подтверждения. RST (reset) - принудительный сброс соединения. Флаги PSH (push) и URG (urgent) в современной практике почти не используются. Есть также флаги для явного управления перегрузкой (CWR, ECE), они работают совместно с IP.

Окно и контрольная сумма

Размер окна и проверка ошибок

Поле размер окна (window) задаёт объём данных, которые отправитель этого сегмента готов принять. Оно используется для управления потоком - чтобы не перегружать медленного получателя. Подробнее механизм окна разбирается в следующих темах.

Контрольная сумма (checksum) служит для обнаружения ошибок передачи. Указатель на срочные данные (urgent pointer) применяется вместе с флагом URG, но функция срочных данных в TCP сейчас не используется.

Параметры TCP

Опции заголовка

После обязательной части заголовка могут идти параметры (опции). Часто используются: MSS (Maximum Segment Size) - максимальный размер сегмента; масштаб окна (window scale) - позволяет увеличить эффективный размер окна до 1 ГБ для высокоскоростных каналов; SACK (Selective Acknowledgement) - выборочное подтверждение фрагментов; метки времени (timestamps) - для более точной оценки времени оборота (RTT) и настройки таймеров повторной передачи.

Source Port, Dest Port, Sequence Number, Ack Number, Data Offset, Flags (CWR,ECE,URG,ACK,PSH,RST,SYN,FIN), Window, Checksum, Urgent Ptr, [Options...]
Английские названия полей

Как называются поля в документации

В литературе и в Wireshark вы встретите: Source port, Destination port - порт отправителя и получателя; Sequence number - порядковый номер первого байта в сегменте; Acknowledgment number - следующий ожидаемый байт; Data offset - смещение данных (длина заголовка в 32-битных словах); Window - размер окна; Checksum - контрольная сумма; Urgent pointer - указатель на срочные данные.

Трёхкратное рукопожатие

Как устанавливается соединение

Установка соединения TCP часто называется трёхкратным рукопожатием (three-way handshake). Первая сторона отправляет сегмент с флагом SYN и начальным порядковым номером. Вторая отвечает сегментом SYN+ACK - подтверждает получение и отправляет свой начальный номер. Первая отправляет ACK. После этого соединение считается установленным и можно передавать данные. Подробно этот процесс разбирается в одной из следующих тем курса.

Сравнение TCP и UDP

Когда какой протокол уместен

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

Мария
Получается, большая часть интернета едет по TCP?
Дмитрий
По объёму трафика - да. Веб, стриминг, облака - в основном TCP. Но по количеству пакетов UDP тоже очень много за счёт DNS и медиа.
TCP и приложения

Где используется TCP

Практически все протоколы, которым важна полная и упорядоченная доставка, работают поверх TCP: HTTP/HTTPS, SMTP, FTP, SSH, многие базы данных и API. Когда вы открываете веб-страницу, загружаете файл или отправляете письмо, как правило, под капотом используется TCP.

Умение различать TCP и UDP в захвате трафика и понимать основные поля заголовка TCP - базовый навык для диагностики сетей и анализа безопасности.

тут скриншот: заголовок TCP в Wireshark
Переход к заданиям

Что важно запомнить

Перед интерактивами зафиксируйте: TCP даёт надёжную передачу потока байт; сеть считается ненадёжной - возможны потери, перестановки и дубликаты; доставка обеспечивается подтверждениями и повторной отправкой по таймеру; нумерация байтов даёт порядок и защиту от дубликатов; перед обменом данными устанавливается соединение; заголовок TCP содержит порты, порядковый номер, номер подтверждения, смещение данных, флаги (SYN, ACK, FIN и др.), размер окна и контрольную сумму, плюс опции.

Далее - задания, короткий тест допуска и практика в Wireshark с разбором TCP-сегментов.

Задание 1

Что верно про TCP

Выберите верные утверждения.

Задание 2

Сопоставьте поле заголовка TCP и назначение

Sequence number
Acknowledgment number
Window
Задание 3

Флаги TCP

Какой флаг используется при установке соединения для синхронизации номеров байт?

Задание 4

Отличие TCP от UDP

Выберите свойства, которые есть у TCP, но отсутствуют у UDP.

Финальный допуск

Краткий тест (8 вопросов)

Для доступа к практике нужно набрать не менее 80% - минимум 7 правильных ответов из 8.

1. TCP расшифровывается как:

2. Какой сервис предоставляет TCP приложению?

3. Нумерация в TCP присваивается:

4. В номере подтверждения (ACK) указывается:

5. Зачем TCP устанавливает соединение перед передачей?

6. Какой флаг TCP используется для разрыва соединения?

7. Поле Data offset в заголовке TCP указывает:

8. Основной документ стандарта TCP (обновлённая версия):

Практика

Практика: TCP в Wireshark

В этой части вы выполните пошаговые действия за компьютером: сгенерируете TCP-трафик (например, загрузку страницы или запрос через curl), откроете захват в Wireshark, примените фильтр по TCP и разберёте заголовки сегментов - порты, порядковый номер, номер подтверждения и флаги. Файл для сдачи не требуется - проверка по результату на экране и по контрольным вопросам в конце.

Практика - Шаг 1

Откройте терминал и Wireshark

1Запустите терминал: Windows - PowerShell или cmd, macOS/Linux - Terminal. Откройте Wireshark и подготовьте окно захвата трафика.
Практика - Шаг 2

Запустите захват

2Выберите активный сетевой интерфейс (тот, через который вы выходите в интернет) и начните захват. Пока не применяйте фильтр - сначала соберём трафик.
Практика - Шаг 3

Сгенерируйте TCP-трафик

3В терминале выполните команду, которая создаёт TCP-соединение. Например: curl -I https://example.com или откройте в браузере любую страницу по HTTP/HTTPS. После этого остановите захват в Wireshark.
Практика - Шаг 4

Примените фильтр TCP

4В строке фильтра Wireshark введите tcp и нажмите Enter. Оставьте только TCP-пакеты. Если трафика много, можно сузить: например, tcp.port == 443 для HTTPS.
Практика - Шаг 5

Найдите сегмент с установкой соединения

5Найдите пакет, в котором в заголовке TCP установлен флаг SYN. Обычно это один из первых пакетов в обмене. Выберите этот пакет и разверните секцию TCP в нижней панели.
Практика - Шаг 6

Порты в первом сегменте

6В развёрнутом заголовке TCP найдите Source port и Destination port. Запишите их. Порт назначения для HTTPS обычно 443, для HTTP - 80; порт источника - динамический, выданный ОС вашему приложению.
Практика - Шаг 7

Порядковый номер (Sequence number)

7В том же или в следующем TCP-пакете найдите поле Sequence number (raw) или Sequence number. Обратите внимание: в сегменте с SYN это часто начальное значение для синхронизации (ISN). Запишите его для себя.
Практика - Шаг 8

Номер подтверждения (Acknowledgment number)

8Найдите пакет с установленным флагом ACK. В нём должно быть заполнено поле Acknowledgment number. Оно означает следующий ожидаемый байт от другой стороны. Убедитесь, что такой пакет есть в вашем захвате.
Практика - Шаг 9

Флаги в Wireshark

9В разных пакетах посмотрите блок Flags. Найдите сегменты, где установлены [SYN], [SYN, ACK], [ACK], [PSH, ACK], а в конце обмена - [FIN, ACK] или [RST]. Сопоставьте их с этапами: установка соединения, передача данных, разрыв.
Практика - Шаг 10

Data offset и длина заголовка

10В заголовке TCP найдите Header Length или Data offset. Убедитесь, что заголовок может быть больше 20 байт - когда присутствуют опции (например, MSS, window scale).
Практика - Шаг 11

Размер окна (Window)

11Найдите поле Window size value. Оно показывает, сколько байт готов принять отправитель этого сегмента. Запишите значение для одного из пакетов с данными.
Практика - Шаг 12

Инкапсуляция TCP - IP - кадр

12Убедитесь, что в дереве пакета видна цепочка: прикладные данные (например, HTTP или TLS) внутри TCP, TCP внутри IP, IP внутри кадра (Ethernet или другой). Это типичная инкапсуляция для стека TCP/IP.
Практика - Шаг 13

Сравните с UDP

13Вспомните занятие по UDP. Ответьте себе: каких полей нет в заголовке UDP, но есть в TCP? (Порядковый номер, номер подтверждения, флаги, размер окна, смещение данных.)
Практика - Шаг 14

Повторный захват с фильтром по порту

14При желании запустите новый захват с фильтром tcp.port == 80 или tcp.port == 443 до начала захвата. Выполните снова curl https://example.com или откройте страницу в браузере. Убедитесь, что видны только TCP-пакеты с выбранным портом.
Практика - Шаг 15

Контрольные вопросы

Ответьте себе (можно устно или в тетради):

  • Какой порт назначения был у вашего TCP-соединения (80 или 443)?
  • Какой динамический порт источника назначила ОС вашему приложению?
  • В каком сегменте вы видели флаг SYN, в каком - ACK, в каком - FIN?
  • Чем порядковый номер в TCP отличается от нумерации в UDP (в UDP её нет)?

Если вы можете уверенно ответить и показать поля в Wireshark - вы закрепили введение в протокол TCP.