предисловие
Давайте поговорим об этом сегодня Во время интервью интервьюер часто спрашивает о трехстороннем рукопожатии TCP и четырех взмахах рук.ПредыдущийЯ дал вам краткое введение в пятиуровневую архитектуру компьютерных сетей, поэтому давайте сегодня поговорим о трехстороннем рукопожатии и четырехсторонней волне протокола TCP на транспортном уровне.
Почему три рукопожатия и четыре волны?
Некоторым может быть интересно, что такое трехстороннее рукопожатие TCP и четырехсторонняя волна? Почему три рукопожатия и четыре волны?
Когда протокол TCP передает данные, клиент (Клиент) и сервер (Сервер) установят соединение, затем сегментируют файлы для передачи и обеспечат надежную передачу и управление потоком.После завершения передачи данных текущий сеанс также отключить, чтобы не тратить ресурсы. По сути, трехстороннее рукопожатие TCP — это процесс установления соединения, а четырехстороннее — процесс отключения.
Трехстороннее рукопожатие TCP
Как лучше понять процесс трехэтапного рукопожатия TCP — это как моя исповедь моей богине.
Я: "Богиня, ты мне давно нравишься, ты меня слышишь?"
Богиня: «Я слышу, ты мне тоже нравишься, ты слышишь?»
Я: «Я тоже слышу, тогда давай будем вместе».
Тогда я был доволен моей богиней (.jpg). Давайте следуем этой картину, что случилось каждый раз.
Давайте сначала введем некоторые поля на рисунке:
SYN: Серийный номер синхронизации — это сигнал квитирования, используемый для установления соединения.
ack: порядковый номер подтверждения, когда ACK равен 1, подтверждение действительно, когда ACK равно 0, подтверждение недействительно.
seq: порядковый номер.
ACK: Подтвердите, что серийный номер действителен.
FIN: флаг окончания, используемый для обозначения отключения.
В начале и клиент, и сервер находятся в состоянии Closed (закрыт), перед подготовкой к отправке запроса на соединение сервер перейдет в состояние LISTEN (прослушивание).
- Первое рукопожатие:Клиент (Client) отправляет сегмент запроса на сервер (Server) и указывает порядковый номер синхронизации SYN = 1, ACK = 0, начальный порядковый номер seq = x, (seq — порядковый номер байта), и TCP Процесс клиента переходит в состояние SYN-SENT.
- Второе рукопожатие:После того, как сервер получит сообщение запроса SYN, отправленное клиентом, он отправит клиенту сообщение SYN в качестве ответа, указывающее, что он согласен установить соединение.seq = y, чтобы представить один из его собственных начальных порядковых номеров, и также сообщить клиенту, с чего начать отправку следующего порядкового номера подтверждения.Поскольку начальный порядковый номер seq = x, отправленный клиентом, порядковый номер подтверждения ack = x + 1, в это время TCP-сервер входит в SYN-RCVD (синхронный прием).
- Третье рукопожатие:После того, как клиент получит подтверждающее сообщение от сервера, он снова отправит подтверждающее сообщение на сервер, указывая, что он его получил. Итак, ACK = 1, seq = x + 1, ack = y + 1. TCP-соединение установлено, и клиент и сервер переходят в состояние ESTAB-LISTEND (состояние установления соединения).
Почему можно пожать руку три раза, два или четыре раза?
Благодаря описанному выше трехстороннему рукопожатию мы можем четко знать, какова цель каждого рукопожатия.
первое рукопожатие
Клиент отправляет сегмент запроса на установление соединения, а сервер его получает, чтобы сервер мог сделать вывод об отсутствии проблем с отправкой клиента и его собственным получением.
второе рукопожатие
Сервер также отправляет сегмент запроса, указывающий, что он получил сегмент запроса на установление соединения от клиента, и клиент также получает этот сегмент в ответ от сервера, так что клиент может получить передачу от сервера и свою собственную. проблем с приемом нет, но сервер не знает, есть ли проблема с приемом клиента (это знает только клиент), поэтому для информирования сервера требуется третье рукопожатие.
третье рукопожатие
Затем клиент отправляет сегмент запроса, указывая, что он получил информацию подтверждения от сервера, после чего сервер получает ее в обычном режиме. С тех пор рукопожатие закончилось, и можно сказать, что передача и прием обеих сторон проходят нормально.
Если бы были проведены только первые два рукопожатия, каковы были бы последствия? В первый раз клиент отправляет сегмент запроса на сервер для установления соединения. Он может застрять из-за сетевых причин. Клиент решит, что запрос недействителен, и повторно отправит запрос на соединение с сервером, и тогда сервер будет нормально работать.Отвечать на соединения. Через определенный промежуток времени запрос на подключение, отправленный в первый раз, доходит до сервера.Если не будет третьего подтверждения рукопожатия, то сервер ошибочно посчитает, что клиент отправил новый запрос на подключение и ответит снова.Клиент, клиент получает ответный запрос, обнаруживает, что запрос только что был отправлен, а также получает ответ от сервера и игнорирует запрос, но в это время сервер все еще ждет ответа от клиента, что приведет к потерям ресурсов.
Что, если мы пожали друг другу руки четыре раза? Третье рукопожатие, после того, как сервер в последний раз получит ответный запрос клиента, если в это время выполняется четвертое рукопожатие, то сервер должен ответить на только что полученный запрос.Неудача или успех этого запроса, значение Не большое . Потому что после трехстороннего рукопожатия и клиент, и сервер уже знают, что отправка и получение обеих сторон в норме, и передача данных возможна, поэтому нет необходимости повторно отправлять запрос на подтверждение, и связь полностью надежна. протокола не существует.
ПТС махнул четыре раза
Позвольте мне привести вам еще один пример. A и B - пара, однажды A сказал B
А: «Давай расстанемся».
Б (в шоке): «Хм».
...молчание...
Б: «Тогда давай расстанемся».
А: «Эм».
Тогда A и B разделены. Таким же образом, если TCP отключен, он также должен пройти через процесс размахивания четырех раз.
- Первая волна:Клиент активно отключается и отправляет на сервер сегмент FIN, то есть сегмент освобождения соединения (FIN=1, порядковый номер seq=u), и статус изменяется на FIN-WAIT-1 (ожидание завершения 1).
- Вторая волна:Сервер получает сегмент FIN клиента, отвечает на запрос, а также отправляет клиенту ACK = 1, seq = y, ack = u + 1 (seq и ack были объяснены на этапе трехстороннего рукопожатия, и вы может переписать, если вы его не понимаете. Посмотрите еще раз), чтобы указать, что он получил сообщение с запросом на отключение от клиента, и в то же время меняет свое состояние на CLOSE-WAIT (ожидание закрытия).
После того, как клиент получит вторую волну сообщения, он также изменит свое состояние на FIN-WAIT-2 (ожидание выключения) В это время клиент отключился от сервера, то есть клиент не более данные могут быть отправлены на сервер, но сервер не отключился, он еще должен отправить недоработанные данные клиенту, то есть TCP находится в полузакрытом состоянии, из-за чего ему приходится махать четыре раза.
- Третья волна:Подождав некоторое время, когда сервер отправил оставшиеся данные, он также отправит клиенту сегмент FIN=1, где seq=w, ack=u+1, ACK=1, и в то же время , он переходит в состояние LAST-ACK (последнее подтверждение) для ожидания ACK от клиента.
- Четвертая волна:Клиент получает от сервера сегмент разъединения FIN, а также отвечает на него, отправляет в служебный сегмент сегмент ACK=1, seq=u+1, ack=w+1, а сам входит в TIME-WAIT. Через некоторое время сервер получает ответное сообщение от клиента и меняет свое состояние на Закрыто.После того как клиент ждет время TIME-WAIT, он также переходит в состояние Закрыто. После четырехкратного взмаха руками клиент и сервер отключаются.
Почему клиент переходит в состояние TIME-WAIT для последней волны?
Если сервер не получает сообщение с запросом на подтверждение, отправленное волной клиента в последний раз, сервер будет думать, что это связано с тем, что сегмент FIN, отправленный им самим, не был отправлен, в результате чего клиент не получит его, а клиент не Если он получен, он не отправит ему сообщение с запросом на подтверждение, поэтому сервер снова отправит сегмент FIN, поэтому время ожидания составляет 2MSL.
Суммировать
Переход состояния в середине TCP-это очень сложный процесс.Я просто разбираюсь, что я могу понять для вашей справки.Если что-то не так, пожалуйста, оставьте сообщение.