Какой флаг в tcp заголовке используется в ответ на сообщение fin

Обновлено: 02.07.2024

Протокол TCP является одним из важнейших протоколов связи в компьютерных сетях. В этой статье познакомимся с ним поближе.

Что такое транспортные протоколы

Транспортные протоколы (TCP и UDP) используются для передачи информации. Информация передаётся маленькими частями – сетевыми пакетами. То есть поток информации разбивается на много маленьких пакетов.

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

Особенности TCP

Главной особенностью TCP (Transmission Control Protocol) является то, что он гарантирует доставку всех отправленных пакетов. При этом проверяется целостность пакетов и их порядок. Если пакет потерялся или испортился, то получатель запросит эти пакеты у отправителя снова. Если пакеты пришли не в том порядке, то они на принимающей стороне всё равно обработаются в правильном. Этот механизм контроля доставки накладывает дополнительную нагрузку в виде увеличения служебной информации, которую нужно передать вместе с полезными данными.

TCP делит поток информации на сегменты. В одном сегменте может быть несколько пакетов. Каждый сегмент проверяется на целостность, и если все хорошо, отправляется подтверждение передающей стороне. Таким образом подтверждается не каждый пакет, а каждый сегмент, но в сегменте может оказаться и всего лишь один пакет.

Поверх протокола TCP работают многие прикладные протоколы:

TCP пакеты передаются не просто так, а в рамках установленного соединения – которое называют TCP сессией.

Подключение можно выполнить только если вторая сторона прослушивает порт, к которому будет выполняться подключение.

Алгоритм работы TCP

Алгоритм работы TCP следующий:

  1. Используя трехкратное рукопожатие, между двумя узлами создаётся сеанс связи.
  2. При отправке пакетов узлы последовательно нумеруют их и рассчитывают контрольную сумму.
  3. Поскольку все пакеты имеют последовательные номера, то становится видно если какие-то из них отсутствуют. В этом случае отправляется запрос на повторную отправку пакета.
  4. Если для какого-то пакета не совпала контрольная сумма, то отправляется запрос на повторную отправку пакета.

При открытии даже одной веб странички создаются несколько TCP соединений для:

  • html страницы;
  • каждого CSS и JavaScript файлов;
  • каждого изображения.

И для каждого такого соединения вначале устанавливается сеанс, что замедляет передачу данных.

Заголовок TCP пакета

Заголовок TCP пакета состоит из следующих полей:

  • Порт отправителя.
  • Порт получателя.
  • Порядковый номер в сегменте (sequence number). В целях безопасности это значение генерируется случайным образом и может быть равно от 0 до 4294967295;
  • Номер подтверждения (acknowledgment number). Когда мы подтверждаем определённый пакет, в нем записывается sequence number подтверждаемого пакета.
  • Длина заголовка (data offset). В этом поле указывается длина заголовка TCP пакета и где начинаются фактические данные.
  • Зарезервированное поле. Эти биты зарезервированы для будущего использования.
  • Флаги. Необходимы для дополнительной функциональности. Например, позволяют установить или разорвать соединение, включить или выключить защиту от перегрузки сети и тому подобное.
  • Размер окна (Window Size). Указывается количество байт, считая от последнего номера подтверждения, которые готов принять отправитель данного пакета. То есть, какой у него в данный момент времени размер буфера.
  • Контрольная сумма (Checksum). Используется для проверки на наличие ошибок при приеме или передачи пакетов. Рассчитывается с учетом заголовка (кроме контрольной суммы) и самих данных.
  • Указатель срочности (Urgent pointer). Используется, если стоит флаг URG. По этому значению определяются срочные данные и они сразу же передаются приложению. Остальные данные попадают в буфер.
  • Дополнительные опции. Необязательно, но используются почти всегда.
  • Заполнение (Padding). Дополняет заголовок, пока он не закончится на 32-разрядной границе. Всегда состоит только из нулей.

Флаги в заголовке TCP

Создание TCP сессии

Для установления соединения использует трехкратное рукопожатие.

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

Первый этап. Клиент отправляет на сервер пакет с флагом SYN. При этом клиент устанавливает порядковый номер сегмента на случайное значение A.

Второй этап. В ответ сервер отвечает пакетом с флагами SYN и ACK. Номер подтверждения установлен на единицу больше принятого (A+1). Поскольку сервер также будет отправлять данные, то для себя он тоже выбирает номер первого пакета, который будет другим случайным числом B.

Третий этап. Клиент отправляет ACK на сервер. Порядковый номер устанавливается равным A+1, а номер подтверждения устанавливается на B+1.

На этом этапе клиент и сервер получили подтверждение соединения и образовали двухстороннюю связь.

Передача данных в TCP

Теперь разберём пример передачи данных в уже установленном сеансе.

Обмен данными TCP

Клиент отравляет запрос к серверу. Поскольку данные поместились в один пакет TCP, он получил флаг PSH, чтобы сервер не ждал продолжение получения данных. При этом пакет получил 2 флага: ACK (подтвердил предыдущею передачу пакетов от сервера) и PSH.

В ответ на это сервер отправляет пакет ACK с номером успешно полученных данных.

Далее сервер обработал запрос и отправляет данные клиенту. Эти данные делятся на пакеты и отправляются сегментами.

Далее клиент подтверждает, что данные получены отправляя пакеты с флагом ACK.

Завершение сеанса TCP

Завершение сеанса использует четырёхкратное рукопожатие, причём каждая сторона завершает своё соединение независимо.

Завершение сеанса TCP

Когда одна из сторон хочет остановить свою половину соединения, она передаёт пакет FIN, который другая сторона подтверждает пакетом с ACK.

После того, как сторона, отправившая первый FIN, ответила с последним ACK, она ожидает некоторое время прежде чем окончательно закрыть соединение. В течение этого времени локальный порт недоступен для новых соединений.

Также возможно разорвать соединение трёхкратным рукопожатием, когда первая сторона отправляет FIN, а вторая отвечает FIN и ACK (просто объединяет 2 шага в один). Дальше первая сторона подтверждает завершение сеанса с помощью ACK.

Состояния сеанса TCP

Сеанс TCP может находится в следующих состояниях:

  • CLOSED – начальное состояние;
  • LISTEN – сервер ожидает запросы от клиента;
  • SYN-SENT – клиент хочет установить соединение с сервером и ожидает подтверждение;
  • SYN-RECEIVED – сервер получил запрос на создание сеанса, отправил ответный запрос и ожидает подтверждение;
  • ESTABLISHED – соединение установлено, идёт передача данных;
  • FIN-WAIT-1 – одна из сторон завершает соединение, отправив флаг FIN;
  • CLOSE-WAIT – другая сторона переходит в это состояние, отправив подтверждение на FIN, но продолжает передачу;
  • FIN-WAIT-2 – первый узел получил ACK, разорвал свое соединение, но еще читает данные;
  • LAST-ACK – второй узел заканчивает передачу и отправляет флаг FIN;
  • TIME-WAIT – сервер получил пакет с флагом FIN, отправил флаг ACK и ждёт некоторое время, перед окончательным закрытием соединения;
  • CLOSING – обе стороны инициировали закрытие соединения одновременно.

Вот мы и познакомились с одним из самых важных протоколов сети Интернет. Разобрались с его особенностями, алгоритмом работы. Узнали про сеансы TCP, пакеты и сегменты.

Протокол TCP является одним из важнейших протоколов связи в компьютерных сетях. В этой статье познакомимся с ним поближе.


По нашему опыту, когда дело доходит до низкоуровневого анализа TCP девять из десяти ИТ специалистов в компаниях среднего и крупного бизнеса чувствуют себя неуверенно. Не могут точно сказать, что такое ретрансмиссии, размер окна и т.д. Большинство материалов в интернете по этой теме больше походят на научные работы. В этой статье мы попытаемся донести с практической точки зрения, что же полезного прячет в себе протокол TCP для того, кто занимается анализом сетевого трафика.

В каких случаях нам нужен анализ TCP пакетов?

База анализатора трафика не имеет информации, в каком бите содержится код реквеста, какой код соответствует респонсу и т.д. В таких ситуациях приходится прибегать к самым азам сетевой науки – TCP анализу. Давайте рассмотрим, что прячет внутри себя этот протокол.

По своей сути TCP является протоколом транспортного уровня. Он позволяет осуществить соединение одного сокета (IP-адрес + порт) хоста источника с сокетом хоста назначения. Заголовок IP будет содержать информацию, связанную с IP-адресами, а заголовок TCP — информацию о порте.

Заголовок TCP

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

Заголовок TCP

Рисунок 1. Заголовок TCP

В заголовке TCP содержаться следующие поля:

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

Установка соединения осуществляется с помощью, так называемого трехстороннего рукопожатия TCP. Инициатором соединения может выступать любая сторона. Однако чтобы упростить рассмотрения данного вопроса в рамках данной статьи, мы рассмотрим пример, когда клиент инициализирует соединение с сервером.

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

Рисунок 2. Трехстороннее рукопожатие TCP

После инициализации соединения полезная нагрузка будет перемещаться в обоих направлениях TCP-соединения. Все пакеты в обязательном порядке будут содержать установленный флаг ACK. Другие флаги, такие как, например, PSH или URG, могут быть, а могут и не быть установленными.

Завершение TCP-соединения

Рисунок 3. Завершение TCP-соединения

  • Keep-alive или повторное использование соединений

Вступайте в Telegram канал проекта NetworkGuru, чтобы не пропустить интересные статьи и вебинары.

Подписывайтесь на рассылку, делитесь статьями в соцсетях и задавайте вопросы в комментариях!


Протокол управления передачей (TCP) является одним из самых важных протоколов пакета Internet Protocols. Это наиболее широко используемый протокол для передачи данных в сети связи, такой как Интернет.

Длина заголовка TCP составляет минимум 20 байтов и максимум 60 байт.


Адресация

Связь TCP между двумя удаленными хостами выполняется с помощью номеров портов (TSAP). Номера портов могут варьироваться от 0 до 65535, которые делятся как:

  • Порты системы (0 — 1023)
  • Порты пользователей (1024 — 49151)
  • Частные / динамические порты (49152 — 65535)

Управление подключениями

Связь TCP работает в модели Server / Client. Клиент инициирует соединение, и сервер либо принимает, либо отклоняет его. Для управления подключением используется трехстороннее связывание.


Установка соединения

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

Любой из серверов и клиентов может отправлять сегмент TCP с флагом FIN, установленным в 1. Когда принимающая сторона отвечает на это посредством ACKnowlinging FIN, это направление связи TCP закрывается и соединение освобождается.

Управление полосой пропускания

Например, клиент использует размер окна 2 и отправляет 2 байта данных. Когда подтверждение этого сегмента получено, размер окна удваивается до 4, а следующий отправленный сегмент отправляется длиной 4 байта данных. Когда получено подтверждение 4-байтового сегмента данных, клиент устанавливает размер окна 8 и т. Д.

Если упущено подтверждение, то есть данные, потерянные в транзитной сети или полученные NACK, размер окна уменьшается до половины, а медленная начальная фаза начинается снова.

Контроль ошибок и контроль потока

TCP использует номера портов, чтобы узнать, какой процесс приложения ему нужен для передачи сегмента данных. Наряду с этим он использует порядковые номера для синхронизации с удаленным хостом. Все сегменты данных отправляются и принимаются с порядковыми номерами. Отправитель знает, какой последний сегмент данных был принят Получателем, когда он получает ACK. Получатель знает о последнем сегменте, отправленном отправителем, ссылаясь на порядковый номер недавно полученного пакета.

Если порядковый номер недавно полученного сегмента не совпадает с порядковым номером, который ожидал приемник, он отбрасывается и NACK отправляется обратно. Если два сегмента поступают с одинаковым порядковым номером, значение временной метки TCP сравнивается для принятия решения.

Мультиплексирование

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

Это позволяет клиентской системе получать несколько соединений по одному виртуальному соединению. Эти виртуальные соединения не подходят для серверов, если тайм-аут слишком длинный.

Контроль перегрузок

  • Аддитивное увеличение, мультипликативное уменьшение
  • Медленный старт
  • Время ожидания

Управление таймером

TCP использует различные типы таймеров для управления и управления различными задачами:

Таймер сохранения:

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

Таймер повторной передачи:

  • Этот таймер поддерживает сеанс передачи данных с сохранением состояния.
  • Если подтверждение отправленных данных не будет получено в течение времени повторной передачи, сегмент данных будет отправлен снова.

Постоянный таймер:

Timed-Wait:

  • После освобождения соединения один из хостов ждет времени с пометкой времени, чтобы полностью завершить соединение.
  • Это делается для того, чтобы убедиться, что другой конец получил подтверждение своего запроса о завершении соединения.
  • Выдержка может быть не более 240 секунд (4 минуты).

Восстановление после аварий

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

В предыдущей статье была достаточно подробно рассмотрена логика работы протокола TCP, теперь можем перейти к рассмотрению формату TCP заголовка.

p, blockquote 1,0,0,0,0 -->

Протокол TCP формат заголовка

p, blockquote 2,0,0,0,0 -->

Формат заголовка

p, blockquote 3,0,0,0,0 -->

Поле протокола TCP

p, blockquote 4,0,0,0,0 -->

Порядковый номер

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

p, blockquote 5,0,1,0,0 -->

Порядковый номер в формате заголовка протокола TCP

Например, байт 1000, байт 2460 или 3920. Если мы используем сеть Ethernet, то размер сегмента как правило составляет 1460 байт, чтобы с заголовком TCP и IP можно было поместиться в кадр Ethernet размером 1500 байт.

p, blockquote 6,0,0,0,0 -->

Номер подтверждения

p, blockquote 7,0,0,0,0 -->

Номер подтверждения в формате заголовка протокола TCP

p, blockquote 8,0,0,0,0 -->

Длина заголовка

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

p, blockquote 9,0,0,0,0 -->

Длина заголовка в формате заголовка протокола TCP

p, blockquote 10,0,0,0,0 -->

9 полей флагов

Затем идут три зарезервированных бита, которые сейчас не используется. И 9 полей флагов:

p, blockquote 11,1,0,0,0 -->

Зарезервированные биты и 9 полей флагов в TCP

  • Флаги NS, CWR и ECE используются для управления перегрузкой.
  • Флаг URG указывает на то, что в сегменте содержатся срочные данные, которые необходимо быстро передать приложению. Этот флаг используется совместно с полем указатель на срочные данные, который содержит адрес этих данных. Сейчас этот флаг и поле указатель на срочные данные не используются.
  • Флаг ACK используются, если в поле номер подтверждения записаны осмысленные данным, то есть для подтверждения принятой ранее информации.
  • Флаг PSH указывает, что полученные данные необходимо полностью сразу передать приложение без промежуточной записи в буфер, также как и флаг URG этот флаг сейчас не используется.
  • Флаги RST и FIN используются для разрыва соединений, а флаг SYN синхронизация, используется для установки соединения.

Размер окна

Следующее поле размер окна, в этом поле получатель указывает сколько данных он может принять. Поле используется для управления потоком.

p, blockquote 13,0,0,0,0 -->

Контрольная сумма

Затем идет контрольная сумма, которая используется для проверки правильности доставки данных, если контрольная сумма рассчитанная получателем не совпадает с контрольной суммой в заголовке TCP, то этот сегмент отбрасывается.

p, blockquote 14,0,0,0,0 -->

Указатель на срочные данные

Поле указатель на срочные данные, которую мы рассмотрели, завершают обязательную часть заголовка TCP.

p, blockquote 15,0,0,0,0 -->

Параметры

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

p, blockquote 16,0,0,1,0 -->

Рассмотрим некоторые примеры параметров:

p, blockquote 17,0,0,0,0 -->

Параметры (Maximum Segment Size, MSS) максимальный размер сегмента, говорит о том сегмент какого размера может принять получатель, если используется Ethernet, то максимальный размер сегмента 1460 байт. Максимальный размер сегмента, задается отправителем и получателем при установке соединения.

p, blockquote 18,0,0,0,0 -->

Другой важный параметр это масштаб окна, поле размер окна в заголовке TCP позволяет указать максимальный размер доступных для получения байт 65535, но это маленький объем для современных высокоскоростных и территориально протяженных каналов. Если использовать размер окна такого размера то, скорость передачи данных будет низкая. Параметр масштаб окна позволяет увеличить размер окна до 1 ГБ.

p, blockquote 19,0,0,0,0 -->

Другой полезный параметр это выборочное подтверждение, позволяет получить подтверждение диапазонов принятых байт, а не всех данных до определенного байта. Выборочное подтверждение полезно, если потерян всего лишь один сегмент или небольшая порция в большом потоке данных.

p, blockquote 20,0,0,0,0 -->

p, blockquote 21,0,0,0,0 --> p, blockquote 22,0,0,0,1 -->

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

Протокол TCP

TCP - это протокол транспортного уровня, предоставляющий транспортировку (передачу) потока данных, с необходимостью предварительного установления соединения, благодаря чему гарантирует уверенность в целостности получаемых данных, также выполняет повторный запрос данных в случае потери данных или искажения. Помимо этого протокол TCP отслеживает дублирование пакетов и в случае обнаружения - уничтожает дублирующиеся пакеты. TCP - это аббревиатура от Transmission Control Protocol (Протокол Управления Передачей) - является обязательным протоколом стандарт TCP/IP, определенный в стандарте RFC 793, "Transmission Control Protocol (TCP)".

В отличие от протокола UDP гарантирует целостность передаваемых данных и подтверждения отправителя о результатах передачи. Используется при передаче файлов, где потеря одного пакета может привести к искажению всего файла.

TCP обеспечивает свою надежность благодаря следующему:

  • Данные от приложения разбиваются на блоки определенного размера, которые будут отправлены.
  • Когда TCP посылает сегмент, он устанавливает таймер, ожидая, что с удаленного конца придет подтверждение на этот сегмент. Если подтверждение не получено по истечении времени, сегмент передается повторно.
  • Когда TCP принимает данные от удаленной стороны соединения, он отправляет подтверждение. Это подтверждение не отправляется немедленно, а обычно задерживается на доли секунды
  • TCP осуществляет расчет контрольной суммы для своего заголовка и данных. Это контрольная сумма, рассчитываемая на концах соединения, целью которой является выявить любое изменение данных в процессе передачи. Если сегмент прибывает с неверной контрольной суммой, TCP отбрасывает его и подтверждение не генерируется. (Ожидается, что отправитель отработает тайм-аут и осуществит повторную передачу.)
  • Так как TCP сегменты передаются в виде IP датаграмм, а IP датаграммы могут прибывать беспорядочно, также беспорядочно могут прибывать и TCP сегменты. После получения данных TCP может по необходимости изменить их последовательность, в результате приложение получает данные в правильном порядке.
  • Так как IP датаграмма может быть продублирована, принимающий TCP должен отбрасывать продублированные данные.
  • TCP осуществляет контроль потока данных. Каждая сторона TCP соединения имеет определенное пространство буфера. TCP на принимающей стороне позволяет удаленной стороне посылать данные только в том случае, если получатель может поместить их в буфер. Это предотвращает от переполнения буферов медленных хостов быстрыми хостами.

Заголовок TCP



  • Порядковый номер выполняет две задачи:
    • Если установлен флаг SYN, то это начальное значение номера последовательности — ISN (Initial Sequence Number), и первый байт данных, которые будут переданы в следующем пакете, будет иметь номер последовательности, равный ISN + 1.
    • В противном случае, если SYN не установлен, первый байт данных, передаваемый в данном пакете, имеет этот номер последовательности.

    Рассмотрим структуру заголовка TCP с помощью сетевого анализатора Wireshark:


    TCP порты

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

    Номер порта — это условное 16-битное число от 1 до 65535, указывающее, какой программе предназначается пакет.

    Каждый отдельный порт сервера TCP может предложить общий доступ к нескольким соединениям, потому что все TCP соединения идентифицируются двумя значениями: IP-адресом и TCP портом (сокет).

    Номера портов UDP и TCP не пересекаются.

    TCP программы используют зарезервированные или хорошо известные номера портов, как показано на следующем рисунке.


    Установление соединения TCP

    • Запрашивающая сторона (которая, как правило, называется клиент) отправляет SYN сегмент, указывая номер порта сервера, к которому клиент хочет подсоединиться, и исходный номер последовательности клиента (ISN).
    • Сервер отвечает своим сегментом SYN, содержащим исходный номер последовательности сервера. Сервер также подтверждает приход SYN клиента с использованием ACK (ISN + 1). На SYN используется один номер последовательности.
    • Клиент должен подтвердить приход SYN от сервера своим сегментов SYN, содержащий исходный номер последовательности клиента (ISN+1) и с использованием ACK (ISN+1). Бит SYN установлен в 0, так как соединение установлено.


    После установления соединения TCP, эти два хоста могут передавать данные друг другу, так как TCP-соединение является полнодуплексным, они могут передавать данные одновременно.

    Читайте также: