Почему для завершения TCP-соединения требуется 4 шага? - PullRequest
0 голосов
/ 22 февраля 2020

Так что, в принципе, мне задали этот вопрос для интервью. Вопрос был:

Почему для завершения TCP-соединения требуется 4 шага?

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

Почему это нельзя сделать вместе?

Ответы [ 2 ]

2 голосов
/ 22 февраля 2020

Почему это нельзя сделать вместе?

Это можно сделать вместе, и это на самом деле распространенный случай на практике, то есть

-> FIN
<- FIN, ACK to FIN
-> ACK to FIN

Но это также можно сделать отдельно, особенно если одноранговый узел не отключается сразу, но все равно отправляет данные:

-> FIN
<- DATA, ACK to FIN
.... <- more DATA (+ again ACK to FIN)
<- FIN (+ again ACK to FIN)
-> ACK to FIN 
0 голосов
/ 24 февраля 2020

Закрыть - это операция, означающая «У меня больше нет данных для отправки». см. RFC793 .

         TCP A                                                TCP B
  1.     ESTABLISHED                                          ESTABLISHED

  2.     (Close)
         FIN-WAIT-1  --> <SEQ=100><ACK=300><CTL=FIN,ACK>  --> CLOSE-WAIT

  3.     FIN-WAIT-2  <-- <SEQ=300><ACK=101><CTL=ACK>      <-- CLOSE-WAIT

  4.                                                          (Close)
         TIME-WAIT   <-- <SEQ=300><ACK=101><CTL=FIN,ACK>  <-- LAST-ACK

  5.     TIME-WAIT   --> <SEQ=101><ACK=301><CTL=ACK>      --> CLOSED

  6.     (2 MSL)
         CLOSED

Таким образом, вы можете видеть, что клиент уже не имел данных для отправки на шаге 2, но у сервера не было данных для отправки до шага 4. Серверу нужен еще один FIN, чтобы сообщить клиенту «У меня нет данных для отправки». Вот почему он не может работать так же, как TCP-соединение в 3 этапа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...