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

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

Это 4-й день моего участия в августовском испытании обновлений, проверьте подробности события, проверьте подробности события: Испытание августовского обновления

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

2 рукопожатия дважды (случай 1)

2 рукопожатия дважды (случай 2)

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

PS: В протоколе TCP сторона, которая активно инициирует запрос, называется «клиентом», а сторона, которая пассивно подключена, называется «сервером». Будь то клиент или сервер, после установления TCP-соединения он может отправлять и получать данные.

Изначально и сервер, и клиент находятся в состоянии ЗАКРЫТ. Перед началом связи обе стороны должны создать свой собственный блок управления передачей (TCB). После того, как сервер создал TCB, он переходит в состояние LISTEN и готов принять запрос на соединение от клиента.

первое рукопожатие

Клиент отправляет сегмент запроса на соединение на сервер. В заголовке этого сегмента SYN=1, ACK=0 и seq=x. После отправки запроса клиент переходит в состояние SYN-SENT.

  • PS1: SYN=1, ACK=0 указывает, что сегмент представляет собой сообщение с запросом на соединение.
  • PS2: x — это начальный порядковый номер потока байтов этой связи TCP. TCP предусматривает, что сегмент с SYN=1 не может иметь часть данных, но должен использоваться порядковый номер.

второе рукопожатие

После того, как сервер получит сегмент запроса на подключение, если он согласен на подключение, он отправит ответ: SYN=1, ACK=1, seq=y, ack=x+1. Состояние SYN-RCVD вводится после отправки ответа.

  • PS1: SYN=1, ACK=1 указывает, что сегмент является ответным сообщением для согласия на соединение.
  • PS2: seq=y указывает начальный порядковый номер отправленного потока байтов, когда сервер действует как отправитель.
  • PS3: ack=x+1 указывает, что сервер хочет отправить следующую дейтаграмму на байт, порядковый номер которого начинается с x+1.

третье рукопожатие

Когда клиент получает ответ о согласии на подключение, он также отправляет на сервер сегмент подтверждения, указывающий, что ответ о согласии на подключение, отправленный сервером, был успешно получен. Заголовок этого сегмента: ACK=1, seq=x+1, ack=y+1. После того, как клиент отправляет этот сегмент, он переходит в состояние ESTABLISHED, в состояние ESTABLISHED входит и сервер после получения ответа На этом установление соединения завершено!

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

Предотвращает получение сервером недопустимых сегментов запросов на подключение, что приводит к ошибкам.

PS: Неверный запрос на подключение: если запрос на подключение, отправленный клиентом на сервер, потерян, клиент снова отправит запрос на подключение после ожидания ответа. В это время предыдущий запрос на подключение является «недействительным».

Если для установления соединения нужно всего два рукопожатия, клиент сильно не меняется, и ему по-прежнему нужно получить ответ от сервера перед переходом в состояние ESTABLISHED, а сервер переходит в состояние ESTABLISHED после получения запроса на соединение. В это время, если сеть перегружена и запрос на подключение, отправленный клиентом, слишком поздно поступает на сервер, клиент со временем повторно отправит запрос.Если сервер правильно получит и подтвердит ответ, связь будет прервана. start, и соединение будет разорвано после завершения связи. В этот момент, если на сервер поступает недопустимый запрос на соединение, поскольку есть только два рукопожатия, сервер перейдет в состояние ESTABLISHED после получения запроса, ожидая отправки данных или активно отправляя данные. Однако клиент в это время уже перешел в состояние ЗАКРЫТО, и сервер будет долго ждать, что тратит впустую ресурсы соединения сервера.

4 волны TCP четыре раза

Для освобождения соединения TCP требуется всего четыре шага, поэтому это называется «четыре волны».

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

4.1 Первая волна

Если A считает, что передача данных завершена, ему необходимо отправить запрос на освобождение соединения B. Этот запрос имеет только заголовок сообщения, и основные параметры, передаваемые в заголовке, следующие: FIN=1, seq=u. В этот момент A перейдет в состояние FIN-WAIT-1.

  • PS1: FIN=1 указывает, что сегмент представляет собой запрос на освобождение соединения.
  • PS2: seq=u, u-1 — порядковый номер последнего байта, отправленного от A к B.

4.2 Вторая волна

После того, как B получит запрос на освобождение соединения, он уведомит соответствующее приложение, сообщив ему, что соединение между A и B было разорвано. В это время B переходит в состояние CLOSE-WAIT и отправляет A ответ об освобождении соединения, чей заголовок сообщения содержит: ACK=1, seq=v, ack=u+1.

  • PS1: ACK=1: за исключением сегмента запроса TCP-соединения, ACK всех дейтаграмм в процессе связи TCP равен 1, что указывает на ответ.
  • PS2: seq=v, v-1 — порядковый номер последнего байта, отправленного B в A.
  • PS3: ack=u+1 указывает, что он ожидает получить сегмент, начинающийся с u+1-го байта, и успешно получил первые u байтов.

A получает ответ, переходит в состояние FIN-WAIT-2 и ждет, пока B отправит запрос на освобождение соединения.

После завершения второй волны соединение от A к B было разорвано, B больше не будет получать данные, а A больше не будет отправлять данные. Но соединение от B к A все еще существует, и B может продолжать отправлять данные в A.

4.3 Третья волна

Когда B отправляет все данные в A, он отправляет запрос на освобождение соединения в A, заголовок запроса: FIN=1, ACK=1, seq=w, ack=u+1. B переходит в состояние LAST-ACK.

4.4 Четвертая волна

После получения запроса на освобождение A отправляет ответ с подтверждением B, и в это время A переходит в состояние TIME-WAIT. Это состояние будет длиться в течение времени 2MSL.Если в течение этого периода времени от B не будет запроса на повторную передачу, он перейдет в состояние CLOSED и отменит TCB. Когда B получает подтверждающий ответ, он также переходит в состояние CLOSED и отзывает TCB.

5 Почему A сначала входит в состояние TIME-WAIT и ждет 2MSL, прежде чем войти в состояние CLOSED?

Чтобы гарантировать, что B может получить подтверждающий ответ от A. Если A напрямую входит в состояние CLOSED после отправки ответа подтверждения, то, если ответ потерян, B повторно отправит запрос на освобождение соединения после ожидания тайм-аута, но в это время A был закрыт и не будет отвечать, поэтому B никогда не сможет нормально закрываться..