Ключевые тайны TCP-соединений сетевого пакетного брокера: демистификация необходимости тройного рукопожатия

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

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

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

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

Давайте подробнее рассмотрим TCP-пакеты, отправляемые в каждом соединении.

Изначально и клиент, и сервер ЗАКРЫТЫ. Сначала сервер активно прослушивает порт и находится в состоянии LISTEN, что означает, что сервер должен быть запущен. Затем клиент готов начать доступ к веб-странице. Ему необходимо установить соединение с сервером. Формат первого пакета соединения следующий:

 Пакет SYN

Когда клиент инициирует соединение, он генерирует случайный начальный порядковый номер (client_isn) и помещает его в поле «Порядковый номер» заголовка TCP. В то же время клиент устанавливает позицию флага SYN на 1, чтобы указать, что исходящий пакет является пакетом SYN. ​​Клиент указывает, что он хочет установить соединение с сервером, отправляя первый пакет SYN на сервер. Этот пакет не содержит данных прикладного уровня (то есть отправленных данных). В этот момент статус клиента помечается как SYN-SENT.

Пакет SYN+ACK

Когда сервер получает пакет SYN от клиента, он случайным образом инициализирует свой собственный серийный номер (server_isn), а затем помещает этот номер в поле «Серийный номер» заголовка TCP. Затем сервер вводит client_isn + 1 в поле «Номер подтверждения» и устанавливает биты SYN и ACK в 1. Наконец, сервер отправляет клиенту пакет, который не содержит данных прикладного уровня (и данных для отправки сервером). В это время сервер находится в состоянии SYN-RCVD.

Пакет ACK

После того, как клиент получает пакет от сервера, ему необходимо выполнить следующие оптимизации для ответа на окончательный ответный пакет: во-первых, клиент устанавливает бит ACK заголовка TCP ответного пакета в 1; во-вторых, клиент вводит значение server_isn + 1 в поле «Подтвердить номер ответа»; наконец, клиент отправляет пакет на сервер. Этот пакет может переносить данные от клиента на сервер. После завершения этих операций клиент перейдет в состояние ESTABLISHED.

Как только сервер получает ответный пакет от клиента, он также переходит в состояние ESTABLISHED.

Как вы можете видеть из вышеприведенного процесса, при выполнении трехстороннего рукопожатия третьему рукопожатию разрешено передавать данные, но первым двум рукопожатиям — нет. Это вопрос, который часто задают в интервью. После завершения трехстороннего рукопожатия обе стороны переходят в состояние ESTABLISHED, что означает, что соединение успешно установлено, и в этот момент клиент и сервер могут начать отправлять данные друг другу.

Почему три рукопожатия? Не два, а четыре?
Обычный ответ: «Потому что трехстороннее рукопожатие гарантирует возможность получать и отправлять». Этот ответ правильный, но это лишь поверхностная причина, не выдвигающая главную причину. Далее я проанализирую причины тройного рукопожатия с трех сторон, чтобы углубить наше понимание этого вопроса.

Трехстороннее рукопожатие может эффективно избежать инициализации исторически повторяющихся соединений (главная причина)
Трехстороннее рукопожатие гарантирует, что обе стороны получили надежный начальный порядковый номер.
Трехстороннее рукопожатие позволяет избежать траты ресурсов.

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

трехстороннее рукопожатие позволяет избежать исторических дублирующих соединений

Когда клиент отправляет несколько пакетов установления SYN-соединения подряд, в таких ситуациях, как перегрузка сети, может произойти следующее:

1- Старые SYN-пакеты поступают на сервер раньше последних SYN-пакетов.
2- Сервер ответит клиенту пакетом SYN + ACK после получения старого пакета SYN.
3- Когда клиент получает пакет SYN + ACK, он определяет, что соединение является историческим соединением (истек порядковый номер или истекло время ожидания) в соответствии со своим собственным контекстом, а затем отправляет пакет RST на сервер, чтобы прервать соединение.

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

1- Если это историческое соединение (истек порядковый номер или истекло время ожидания), пакет, отправленный третьим рукопожатием, является пакетом RST для прерывания исторического соединения.
2- Если это не историческое соединение, пакет, отправленный в третий раз, является пакетом ACK, и две взаимодействующие стороны успешно устанавливают соединение.

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

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

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

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

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

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

Синхронизируйте начальные серийные номера обеих сторон.

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

Причина 3: Избегайте траты ресурсов впустую
Если есть только "двойное рукопожатие", когда запрос SYN клиента блокируется в сети, клиент не может получить пакет ACK, отправленный сервером, поэтому SYN будет отправлен повторно. Однако, поскольку нет третьего рукопожатия, сервер не может определить, получил ли клиент подтверждение ACK для установления соединения. Поэтому сервер может только проактивно устанавливать соединение после получения каждого запроса SYN. ​​Это приводит к следующему:

Пустая трата ресурсов: если запрос SYN клиента блокируется, что приводит к повторной передаче нескольких пакетов SYN, сервер установит несколько избыточных недействительных соединений после получения запроса. Это приводит к ненужной трате ресурсов сервера.

Удержание сообщения: Из-за отсутствия третьего рукопожатия сервер не может узнать, правильно ли клиент получил подтверждение ACK для установления соединения. В результате, если сообщения застревают в сети, клиент будет продолжать отправлять запросы SYN снова и снова, заставляя сервер постоянно устанавливать новые соединения. Это увеличит перегрузку сети и задержку и отрицательно скажется на общей производительности сети.

Избегайте траты ресурсов

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

Краткое содержание
TheСетевой брокер пакетовУстановление TCP-соединения выполняется с помощью трехстороннего рукопожатия. Во время трехстороннего рукопожатия клиент сначала отправляет пакет с флагом SYN на сервер, указывая, что он хочет установить соединение. Получив запрос от клиента, сервер отвечает клиенту пакетом с флагами SYN и ACK, указывая, что запрос на соединение принят, и отправляет свой собственный начальный порядковый номер. Наконец, клиент отвечает серверу флагом ACK, указывая, что соединение успешно установлено. Таким образом, обе стороны находятся в состоянии ESTABLISHED и могут начать отправлять данные друг другу.

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


Время публикации: 08.01.2025