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

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

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

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

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

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

Первоначально как клиент, так и сервер закрыты. Во -первых, сервер активно прослушивает порт и находится в состоянии прослушивания, что означает, что сервер должен быть запущен. Затем клиент готов начать доступ к веб -странице. Это необходимо установить соединение с сервером. Формат первого пакета соединения заключается в следующем:

 Syn Packet

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

Syn+ACK Packet

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

ACK Packet

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

Как только сервер получает пакет ответов от клиента, он также переключается на установленное состояние.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Избегайте тратить ресурсы

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

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

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


Время сообщения: январь-08-2025