Я впервые изучал специалисты по коммуникациям. После окончания учебы мои одноклассники пошли по отдельным способам осуществить свои мечты и путешествовать между строительными площадками всех размеров. Ха -ха, просто шучу, есть также несколько удивительных людей, которые вошли в определенный исследовательский институт, а? Его отец не режиссер, поэтому он не должен быть слишком темным внутри. Я помню, что был курс очень высокого уровня под названием Computer Network (вероятно, это имя). Есть концепция о рукопожатии, и теперь рассмотрим ее.
Давайте сначала рассмотрим схему:
TCP ориентирован на соединение. Независимо от того, в каком направлении другая сторона отправляет данные, между двумя сторонами должно быть установлено соединение. В протоколе TCP/IP протокол TCP предоставляет надежные службы соединения, а соединение инициализируется через три рукопожатия. Цель трехстороннего рукопожатия состоит в том, чтобы синхронизировать серийный номер и номер подтверждения обеих сторон и обмена информацией о размере окна TCP.
1. Первое рукопожатие: установить связь. Клиент отправляет сегмент сообщения запроса подключения, устанавливает позицию SYN на 1, а номер последовательности - x; Затем клиент входит в состояние syn_send и ожидает подтверждения сервера;
2. Второе рукопожатие: сервер получает сегмент сообщения SYN. Когда сервер получает сегмент сообщения SYN от клиента, ему необходимо подтвердить сегмент сообщения SYN и установить номер подтверждения на x+1 (номер последовательности+1); В то же время он также должен отправлять информацию о запросе SYN, установить позицию SYN на 1 и номер последовательности на Y; Сервер помещает всю выше информацию в сегмент пакетов (то есть сегмент сообщений SYN+ACK) и отправляет ее вместе с клиентом. В настоящее время сервер входит в состояние syn_recv;
3. Третье рукопожатие: клиент получает сегмент пакета SYN+ACK сервера. Затем установите номер подтверждения на Y+1 и отправьте на сервер сегмент сообщений ACK. После того, как сегмент сообщений отправлен, как клиент, так и сервер вводят установленное состояние и завершают трикратное рукопожатие TCP.
После завершения трех руководителей клиент и сервер могут начать передачу данных. Выше приведено общее введение в трехкратное рукопожатие TCP.
А как насчет этих четырех волн?
После того, как клиент и сервер установили соединение TCP через три рукопожатия, когда передача данных завершена, соединение TCP должно быть отключено. Тогда здесь есть загадочные «четыре волны» для разрыва TCP.
1. Первая волна: хост 1 (может использоваться в качестве клиента или в качестве сервера), установить номер последовательности и номер подтверждения и отправить сегмент сообщений FIN на хост 2; В настоящее время хост 1 входит в состояние FIN_WAIT_1; Это означает, что хост 1 не имеет данных, которые будут отправлены на хост 2;
2. Вторая волна: хост 2 получил сегмент сообщений FIN, отправленный хостом 1, и вернул сегмент сообщений ACK на хост 1. Номер подтверждения - это номер последовательности плюс 1; Хост 1 входит в состояние FIN_WAIT_2; Хост 2 сообщает Host 1, что у меня нет данных для отправки, поэтому я могу закрыть соединение;
3. Третья волна: хост 2 отправляет сегмент сообщений FIN на хост 1, с просьбой закрыть соединение, и в то же время хост 2 входит в состояние close_wait;
4. Четвертая волна: хост 1 получает сегмент сообщений FIN, отправленный хостом 2, отправляет сегмент сообщений ACK на хост 2, а затем хост 1 входит в состояние Time_Wait; После того, как хост 2 получает сегмент сообщений ACK хоста 1, он закрывает соединение; В настоящее время хост 1 по -прежнему не получает ответа после ожидания 2MSL, он доказывает, что сторона сервера была закрыта нормально, так что все в порядке, хост 1 также может закрыть соединение.
В этот момент четыре волны TCP были завершены счастливо. Когда вы увидите это, у вас будет много вопросов, многие из которых не понимают, и это кажется грязным; Все в порядке, давайте продолжим суммировать.
Зачем вам нужно трижды пожать руку?
Так называемое трехстороннее рукопожатие означает установление соединения TCP, что означает, что при установлении соединения TCP клиент и сервер должны отправлять в общей сложности 3 пакета для подтверждения установления соединения. В программировании сокетов этот процесс запускается клиентом, выполняющим Concept Connect.
Поскольку мы суммировали три рукопожатия TCP, почему мы должны делать три раза? Почему мы думаем, что мы можем завершить его за два раза? Так почему же TCP должен делать три соединения? Это то, что Xie Xiren сказал в «Компьютерной сети»:
Чтобы предотвратить внезапно переданный сегментом проватного запроса на подключение на сервер, возникает ошибка.
В книге пример приведен следующим образом:
Генерация «Неудачного сегмента запроса на подключение» находится в таком случае: первый сегмент запроса на подключение, отправленный клиентом, не потерян.
Вместо этого он остается в определенном сетевом узле в течение длительного времени, что приводит к задержкам до тех пор, пока не будет выпущено подключение до достижения сервера. Это был изначально
Давным -давно неудачный сегмент сообщений. Однако после того, как сервер получил этот сегмент сообщений о неверном запросе подключения, он ошибочно подумал, что он снова отправил клиент.
запрос на соединение. Таким образом, сегмент подтверждения был отправлен клиенту и согласился установить связь. Предполагая, что «трехкратное рукопожатие» не используется, тогда только сервер
Выполните подтверждение, и новое соединение установлено. Поскольку клиент не выпустил запрос на установление подключения, подтверждение сервера не будет игнорировано.
Данные также не будут отправлены на сервер. Но сервер думал, что новое транспортное соединение было установлено, и он ждал, пока клиент отправит данные. так,
Многие из ресурсов сервера потрачены впустую. Приведенное выше явление можно предотвратить, используя «трехкратное рукопожатие». Например, ситуация только сейчас,
Клиент не выпустит подтверждение подтверждению сервера. Поскольку сервер не может получить подтверждение, он знает, что клиент не требует установленного соединения. "
Это очень ясно, что мешает серверу ожидания и тратить ресурсы.
Зачем тебе четыре раза махать?
Почему ты махаешь четыре раза?
Так называемая четырехсторонняя волна должна завершить соединение TCP, что означает, что, когда соединение TCP отключено, клиент и сервер должны отправлять в общей сложности 4 пакета для подтверждения отключения соединения. В программировании сокетов этот процесс запускается либо клиентом, либо сервером, выполняющим закрытие.
Протокол TCP является ориентированным на соединение, надежным протоколом связи на основе байтового потока. TCP является полным дуплексным режимом, что означает, что когда хост 1 отправляет сегмент FIN, это просто означает, что у хоста 1 нет данных для отправки. Хост 1 сообщает Host 2, что его данные отправлены; Однако в настоящее время хост 1 все еще может принимать данные с хоста 2; Когда хост 2 возвращает сегмент ACK, это означает, что он уже знает, что у хоста 1 нет данных, которые нужно отправлять, но хост 2 все еще может отправлять данные на хост 1; Когда хост 2 также отправляет сегмент FIN, это означает, что у хоста 2 нет данных, которые будут отправлены, и он сообщит хост 1, что у меня нет данных, которые меня будут отправлять, а затем друг друга с радостью прервут это соединение TCP. Если вы хотите правильно понять принцип четырех волн, вам необходимо понять изменения в состоянии во время четырех волн.
FIN_WAIT_1: это состояние нужно тщательно объяснить. Фактически, истинное значение состояний FIN_WAIT_1 и FIN_WAIT_2 - это ожидание сообщения FIN другой стороны. Разница между этими двумя состояниями заключается в том, что состояние FIN_WAIT_1 на самом деле, когда сокет находится в установленном состоянии, оно хочет активно закрыть соединение и отправить сообщение FIN другой стороне. В настоящее время сокет входит в состояние FIN_WAIT_1. Когда другая сторона отвечает на сообщение ACK, оно входит в состояние FIN_WAIT_2. Конечно, при реальных нормальных обстоятельствах, независимо от того, в чем находится другая сторона, сообщение ACK должно быть немедленно ответить на сообщение ACK. Следовательно, состояние FIN_WAIT_1, как правило, трудно увидеть, и состояние FIN_WAIT_2 часто можно увидеть с помощью NETSTAT. (Активная вечеринка)
FIN_WAIT_2: это состояние было подробно объяснено выше. Фактически, сокет в состоянии FIN_WAIT_2 означает полусвязь, то есть одна сторона требует тесного соединения, но также говорит другой стороне, что у меня есть некоторые данные, которые будут переданы вам (информация ACK), а затем закрывают соединение позже. (Активная вечеринка)
Close_wait: значение этого состояния на самом деле ждать, чтобы закрыть. Как понять? Когда другая сторона закрывает розетку и отправляет себе сообщение о плавниках, ваша система, несомненно, ответит на сообщение ACK другой стороне, а затем она войдет в состояние close_wait. Далее, вам действительно нужно рассмотреть вопрос о том, есть ли у вас все еще данные для отправки в другую сторону. Если нет, то вы можете закрыть гнездо и отправить сообщения FIN другой стороне, то есть закройте соединение. Поэтому, когда вы находитесь в состоянии close_wait, вам нужно ждать, пока вы закрыли соединение. (Пассивная сторона)
LAST_ACK: это состояние относительно легко понять. Это пассивно закрывает сообщение ACK другой стороны после отправки сообщения FIN. После получения сообщения ACK вы можете ввести в доступное состояние закрытого. (Пассивная сторона)
Time_wait: Это означает, что сообщение о FIN другой стороны было получено, и сообщение ACK было отправлено. Просто подождите, пока 2MSL вернется в доступное состояние закрытого. Если в штате Finwait1, при получении сообщения с другой стороной с флагом FIN и флагом ACK вы можете напрямую ввести состояние времени_wait, не проходя через состояние FIN_WAIT_2. (Активная вечеринка)
Закрыто: указывает, что соединение прерывается.
Суммировать
Выше приведено все содержание этой статьи о принципе и анализе процесса трех рукопожатием и четырех рукопожатия в протоколе TCP/IP. Я надеюсь, что это будет полезно для всех. Если есть какие -либо недостатки, пожалуйста, оставьте сообщение и с нетерпением ждем ваших ценных мнений.