Структура протокола TCP

3 minute read

Transmission Control Protocol или TCP описан в RFC 793, обеспечивает приложениям надежную службу, ориентированную на подключение.

Протокол TCP похож на телефонный звонок, в котором сначала устанавливается соединение, затем передаются данные, и в конце осуществляется отключение когда передача данных завершена.

TCP использует три основных механизма, описанных ниже:

  • Пакеты маркируются порядковыми номерами (sequence number). Это позволяет службе TCP с приёмной стороны восстановить корректную последовательность пакетов, прежде чем отправлять их конечному приложению.
  • Для обеспечения надежности TCP использует механизмы подтверждения, чексуммы и таймеров (acknowledment, checksum, timers). Получатель может уведомить отправителя о том, что какой-то пакет из последовательности не пришел или содержит ошибки, или отправитель может предположить, что пакет не дошел до получателя, если получатель не прислал подтверждение получателю через определенное время.
  • TCP использует механизм “плавающего окна” (windowing) для регулирования потока пакетов. Windowing уменьшает шанс того, что пакет будет отброшен приемной стороной из-за переполнения буфера.

Заголовок TCP следует сразу за данными прикладного уровня, он содержит поля необходимые для работы механизмов, которые описаны выше, а также определяет порты, которые в свою очередь определяют приложения источника и назначения. Данные с заголовком TCP затем инкапсулируются в заголовок IP.

Структура протокола TCP выглядит следующим образом

TCP Header Structure

Source и Destination порты - 16-битные поля, определяющие приложения источника и назначения для инкапсулированных данных. RFC 1700 определяет все номера для портов (общего и не общего назначения).

Сокет - сочетание порта (источника/назначения) и соответствующего IP-адреса. Сокет уникально определяет каждое приложение в сети.

Source and Destination Ports

Sequence Number - 32-битное поле, определяет где инкапсулированные данные находятся внутри общего потока отправителя. Например, если порядковый номер сегмента 1234 и сегмент содержит 512 байт данных, то следующий сегмент должен иметь порядковый номер 1234 + 512 = 1746

Ниже представлена вырезка из трафика, в котором sequence number равен 337, ожидаемый следующий порядковый номер должен быть 390, который состоить из seq number + TCP Payload (337 + 53 = 390)

Sequence Number 1

А вот вторая вырезка, которая подтверждает ожидаемый в предыдущем пакете порядковый номер.

Sequence Number 2

Acknowledgment Number - 32-битное поле, определяет порядковый номер, который источник ожидает получить от получателя в следующий раз. Если устройство получает номер подтверждения, который не соответствует следующему порядковому номеру, который он собирается отправить (или отправил), то это будет означать, что пакеты были утеряны.

Header Length или еще данное поле называют Data Offset - 4-битное поле, определяющее длину заголовка в 32-битных словах. Данное поле очень важно, т.к. оно позволяет определить начало данных, потому что поле Options имеет переменную длину.

Header Length

Reserved - 4-битное поле, которое всегда заполнено нулями.

Reserved

Flags - 8 однобитовых флагов, которые используются для управления потоком данных и контроля подключения. Флаги слева направо:

  • CWR - Congestion Window Reduced
  • ECE - ECN-Echo
  • URG - Urgent
  • ACK - Acknowledment
  • PSH - Push
  • RST - Reset
  • SYN - Synchronize
  • FIN - Final
Flags

Window Size - 16-битное поле, которое используется для контроля потока. Данное поле определяет количество байт, которое отправитель сегмента примет от узла на другом конце соединения, прежде чем этот узел прекратит передачу, ожидая подтверждения.

Window Size

Window вычисляется путём умножения значения window на window size scaling factor, в случае выше получаем 8181 * 32 = 261792

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

Checksum

Urgent Pointer - 16-битное поле, используется только в случае использования флага URG. Значение данного поля добавляется к Sequence Number тем самым указывая на окончание срочных данных.

Urgent Pointer

Options - как следует из названия, данное поле определяет опции в процессе TCP. Наиболее часто используемая опция - Maximum Segment Size (MSS), которая информирует получателя о наибольшем размере сегмента, который отправитель готов принять. Оставшаяся часть поля заполняется нулями до выравнивания до значения 4 байт.

Более подробно каждое поле можно рассмотреть, скачав данный дамп

P.S. вся информация представленная здесь используется исключительно в образовательных целях. Все совпадения с реальными объектами, адресами, именами и т.д. случайна и не несёт цели получить от этого выгоду или причинить кому-либо вред.

Back to top ↑

Leave a comment