На этом занятии вы переходите от протокола UDP к протоколу TCP - одному из самых популярных протоколов стека TCP/IP. Мы разберём, чем TCP отличается от UDP, как он обеспечивает надёжную передачу потока байт, зачем нужны подтверждения и нумерация, и как устроен заголовок TCP.
Практическая часть построена как лабораторная: вы сгенерируете TCP-трафик, увидите сегменты TCP в Wireshark и научитесь находить в заголовке порты, порядковый номер, номер подтверждения и флаги.
TCP (Transmission Control Protocol - протокол управления передачей) работает на транспортном уровне моделей OSI и стека TCP/IP. Его имя входит в название самого стека - настолько он важен для современных сетей.
Протокол был описан в документе RFC 793 в 1981 году. Обновлённая версия стандарта вышла в 2022 году как RFC 9293 и объединила множество изменений, которые раньше публиковались в отдельных RFC.
TCP предоставляет приложению сервис надёжной передачи потока байт (Reliable Byte Stream). Он получает от приложения поток данных - например, файл - делит его на части, которые называются сегментами. Каждый сегмент передаётся по сети отдельно. На стороне получателя TCP собирает сегменты обратно в поток байт и передаёт его приложению.
В отличие от UDP, который передаёт отдельные короткие сообщения (дейтаграммы), TCP ориентирован на непрерывный поток и гарантирует его доставку и порядок.
TCP исходит из того, что сеть ненадёжна. Сегменты могут теряться и не доходить до получателя. Они могут приходить не в том порядке: отправленные раньше могут прийти позже из-за разницы маршрутов. Наконец, один и тот же сегмент может прийти дважды или больше раз.
Чтобы компенсировать это, TCP обеспечивает гарантию доставки и гарантию сохранения порядка сообщений. У UDP таких гарантий нет - приложение само решает, как реагировать на потери и перестановки.
Когда отправитель передаёт данные, получатель в ответ отправляет подтверждение (Acknowledgement, часто сокращают до ACK). После получения ACK отправитель может передавать следующую порцию данных. Если подтверждение не пришло в течение заданного времени, отправитель считает, что данные не доставлены, и отправляет их заново.
На практике для повышения производительности TCP подтверждает не каждый сегмент по отдельности, а несколько подряд - для этого используется механизм скользящего окна, который подробно рассматривается в следующих темах курса.
Если потеряется не сегмент с данными, а само подтверждение, отправитель не получит ACK и по таймеру отправит данные повторно. У получателя окажется две копии одних и тех же данных. Получатель должен понимать, что это дубликат, а не новая порция.
Кроме того, сегменты могут приходить не по порядку. Чтобы и устранить дубликаты, и восстановить правильный порядок, в TCP используется нумерация - не сообщений, а байтов в потоке.
В TCP каждому байту в потоке присваивается номер. В заголовке сегмента передаётся порядковый номер первого байта данных в этом сегменте. Например, первый сегмент может нести байты 0-1023, второй - 1024-2047, третий - 2048 и далее.
В подтверждении указывается номер следующего ожидаемого байта. Если получатель отправил ACK с номером 1024, это значит: «все байты от 0 до 1023 получены, жду данные, начинающиеся с байта 1024». Так получатель может отбросить дубликаты и собрать сегменты в правильном порядке.
Чтобы реализовать механизмы надёжности, TCP перед передачей данных устанавливает соединение. В UDP соединения нет - дейтаграмму отправили и забыли. В TCP обе стороны должны договориться о начале обмена.
Зачем это нужно? Во-первых, убедиться, что отправитель и получатель готовы обмениваться данными. Во-вторых, синхронизировать номера байт - с каких чисел начнётся нумерация в этом соединении. В-третьих, согласовать дополнительные параметры (например, максимальный размер сегмента). После завершения передачи данных соединение корректно разрывается.
TCP обеспечивает надёжную передачу потока байт: получает поток от приложения, делит на сегменты, передаёт по сети, на стороне получателя собирает сегменты обратно и отдаёт приложению. Все сообщения нумеруются по байтам - это даёт порядок и защиту от дубликатов. Получатель подтверждает получение; при отсутствии подтверждения отправитель повторяет передачу. Для работы всех этих механизмов TCP использует соединение - установку, обмен данными и разрыв.
Заголовок TCP нужен для реализации всех функций надёжности и управления соединением. Он начинается с порта отправителя и порта получателя - это адреса на транспортном уровне, как и в UDP. Далее идут порядковый номер (sequence number) - номер первого байта данных в сегменте - и номер подтверждения (acknowledgement number) - следующий ожидаемый байт.
Затем указывается смещение данных (data offset) - где в сегменте начинаются данные. Заголовок 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 сейчас не используется.
После обязательной части заголовка могут идти параметры (опции). Часто используются: MSS (Maximum Segment Size) - максимальный размер сегмента; масштаб окна (window scale) - позволяет увеличить эффективный размер окна до 1 ГБ для высокоскоростных каналов; SACK (Selective Acknowledgement) - выборочное подтверждение фрагментов; метки времени (timestamps) - для более точной оценки времени оборота (RTT) и настройки таймеров повторной передачи.
В литературе и в 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 - когда важна минимальная задержка или когда приложение само управляет повторными запросами: DNS-запросы, голос, видео, телеметрия. TCP сложнее и создаёт больше накладных расходов; UDP проще, но не даёт встроенной надёжности.
Практически все протоколы, которым важна полная и упорядоченная доставка, работают поверх TCP: HTTP/HTTPS, SMTP, FTP, SSH, многие базы данных и API. Когда вы открываете веб-страницу, загружаете файл или отправляете письмо, как правило, под капотом используется TCP.
Умение различать TCP и UDP в захвате трафика и понимать основные поля заголовка TCP - базовый навык для диагностики сетей и анализа безопасности.
Перед интерактивами зафиксируйте: TCP даёт надёжную передачу потока байт; сеть считается ненадёжной - возможны потери, перестановки и дубликаты; доставка обеспечивается подтверждениями и повторной отправкой по таймеру; нумерация байтов даёт порядок и защиту от дубликатов; перед обменом данными устанавливается соединение; заголовок TCP содержит порты, порядковый номер, номер подтверждения, смещение данных, флаги (SYN, ACK, FIN и др.), размер окна и контрольную сумму, плюс опции.
Далее - задания, короткий тест допуска и практика в Wireshark с разбором TCP-сегментов.
Выберите верные утверждения.
Какой флаг используется при установке соединения для синхронизации номеров байт?
Выберите свойства, которые есть у TCP, но отсутствуют у UDP.
Для доступа к практике нужно набрать не менее 80% - минимум 7 правильных ответов из 8.
1. TCP расшифровывается как:
2. Какой сервис предоставляет TCP приложению?
3. Нумерация в TCP присваивается:
4. В номере подтверждения (ACK) указывается:
5. Зачем TCP устанавливает соединение перед передачей?
6. Какой флаг TCP используется для разрыва соединения?
7. Поле Data offset в заголовке TCP указывает:
8. Основной документ стандарта TCP (обновлённая версия):
В этой части вы выполните пошаговые действия за компьютером: сгенерируете TCP-трафик (например, загрузку страницы или запрос через curl), откроете захват в Wireshark, примените фильтр по TCP и разберёте заголовки сегментов - порты, порядковый номер, номер подтверждения и флаги. Файл для сдачи не требуется - проверка по результату на экране и по контрольным вопросам в конце.
curl -I https://example.com или откройте в браузере любую страницу по
HTTP/HTTPS. После этого остановите захват в Wireshark.tcp и
нажмите Enter. Оставьте только TCP-пакеты. Если трафика много, можно сузить: например,
tcp.port == 443 для HTTPS.tcp.port == 80 или tcp.port == 443 до начала захвата. Выполните снова
curl https://example.com или откройте страницу в браузере. Убедитесь, что видны только TCP-пакеты
с выбранным портом.Ответьте себе (можно устно или в тетради):
Если вы можете уверенно ответить и показать поля в Wireshark - вы закрепили введение в протокол TCP.