Трехстороннее рукопожатие TCP и четыре волны

TCP/IP

В каждом интервью будет немного говориться о протоколе TCP/IP, так как же вы понимаете трехстороннее рукопожатие и четырехстороннюю волну?

Что такое «Три рукопожатия, четыре волны»?

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

Протокол одноадресной рассылки обычно относится к протоколу одноадресной маршрутизации, который предназначен для пересылки сообщения в определенное место в Интернете от исходного хоста к целевому хосту через маршрутизатор. Интернет имеет как минимум две сети, соединенные маршрутизаторами. Маршрутизатор — это промежуточная система сетевого уровня, используемая для соединения нескольких сетей вместе в соответствии с общими протоколами сетевого уровня, такими как TCP/IP. Сеть — это часть сетевой инфраструктуры (включая повторители, концентраторы и мосты/коммутаторы уровня 2), которые соединены маршрутизаторами и связаны с одним и тем же адресом сетевого уровня, называемым сетевым адресом или идентификатором сети.

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

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

показано как

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

Можно представить трехстороннее рукопожатие как такую ​​сцену, есть два человека А и Б, А хочет отправить какие-то пакеты В, а Б хочет получить какие-то пакеты, но А боится, что сразу после отправки пакета В , B уходит, а посылка приходит. Она не была получена в будущем, и B боялся, что A просто устно сказал, что он отправит посылку. B ждал здесь долгое время и обнаружил, что его обманули. Таким образом, два человека должны достичь оговорки или соглашения, чтобы обе стороны могли достичь своих целей. Для этого требуется трехстороннее рукопожатие.

Трехстороннее рукопожатие: A говорит B, что я хочу отправить вам несколько пакетов! Б спросил А, что ты действительно хочешь отправить мне посылку! Тогда А ответил, что я очень-очень хочу отправить вам посылку (Б похожа на героиню романтической драмы, Б не верит тому, что А сказал в первый раз, и Б должен сказать это еще раз, чтобы поверить в это). соглашение между А и В. Когда оно достигнуто, А может отправить пакет В.

Это метафора, а реальное исполнение таково:

(1) Первое рукопожатие:

Клиент отправляет пакет синхронизации (syn=x) на сервер и переходит в состояние SYN_SEND, ожидая подтверждения от сервера.

(2) Второе рукопожатие:

Когда сервер получает пакет SYN, он должен подтвердить SYN (ACK = X + 1), и в то же время он также отправляет пакет SYN (SYN = Y), то есть Syn + Ack Packet. В На этот раз сервер входит в состояние SYN_RECV.

(3) Третье рукопожатие:

Клиент получает пакет SYN+ACK от сервера и отправляет на сервер пакет подтверждения ACK (ack=y+1).После отправки пакета клиент и сервер переходят в состояние ESTABLISHED и завершают трехстороннее рукопожатие.

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

Так почему же трехстороннее рукопожатие?

Почему нужно трижды пожимать руку, нельзя ли дважды пожать руку? Я думаю, если я скажу да, то все кончено, не надо лицемерить, какой смысл в третий раз пожимать руку?

Прежде всего, давайте понять, почему нам нужно рукопожатие?

Клиент должен быть подключен до того, как сервер будет передаваться, и действие «Рукопожатие» - доказать, что ** Возможности передачи клиента и возможности приема на стороне сервера являются нормальными, ** Это «рукопожатие» для достижения цели.

第一次握手: клиент отправляет сетевой пакет, а сервер его получает, поэтомуСервис-терминалМожно доказать, что отправляющая способность клиента и приемная способность сервера являются нормальными.

第二次握手:Сервер отправляет пакет, а клиент его получает. такклиентМожно сделать вывод, что прием сервера, пропускная способность, прием клиента в норме и пропускная способность в норме. С точки зрения клиента, я получил ответный пакет, отправленный сервером, что указывает на то, что сервер получил сетевой пакет, который я отправил, когда я впервые встряхиваю, и успешно отправил ответный пакет, что означает, что сервер получает, возможность передачи нормально. С другой стороны, я получил ответный пакет сервера, что означает, что первый раз, когда я отправил его, успешно достиг сервера, поэтому мои собственные возможности передачи и приема в норме.

第三次握手:客户端发包,服务端收到了。 такСерверМожно сделать вывод, что возможности приема и отправки клиента и возможности отправки и получения сервера являются нормальными. После первого и второго рукопожатия сервер не знает, являются ли нормальными возможности клиента по приему и его собственные возможности по отправке. Во время третьего рукопожатия сервер получает ответ клиента на второе рукопожатие. С точки зрения сервера данные ответа, которые я отправил во время второго рукопожатия, были отправлены, и клиент их получил. Итак, моя способность посылать в норме. Принимающая способность клиента также в норме.

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

помахал четыре раза

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

С точки зрения непрофессионала это

Четыре волны:A сказал B: Я хочу отключиться от вас! B сказал: Хорошо, прекрати это! B также сказал A, что я тоже хочу отключиться от вас!

А сказал: Ладно, хватит!

Настоящий процесс

(1) Первая волна рук

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

(2) Вторая волна

После того, как сервер получает пакет FIN, он отправляет клиенту ACK, подтверждая, что порядковый номер равен полученному порядковому номеру + 1 (так же, как SYN, один FIN занимает один порядковый номер).

(3) Третья волна

服务器端发送一个FIN,用来关闭服务器端到客户端的数据传送,也就是告诉客户端,我的数据也发送完了,不会再给你发送数据了! ! !

(4) Четвертая волна

После того, как клиент получает FIN, он отправляет ACK на сервер, чтобы подтвердить, что серийный номер равен полученному серийному номеру + 1. На данный момент завершены четыре волны.

Почему для установления соединения требуется трехстороннее рукопожатие, а для закрытия — четырехстороннее?

Это связано с тем, что сервер находится в состоянии LISTEN, получаяустановить запрос на соединениеПосле сообщения SYN поместите ACK и SYN вСообщениеОтправьте его клиенту. Когда соединение закрыто, когда получено другое плавное сообщение «Другая сторона», только другая сторона больше не отправляет данные, но также может получать данные, независимо от того, теперь закрывается ли канал для самостоятельной отправки данных,приложение верхнего уровнярешение, следовательно, собственные ACK и FIN, как правило, будутОтдельныйОтправить.