WebSocket — закрыть фрейм

Веб-сокет RFC гласит следующее:

Если конечная точка получает кадр закрытия и ранее не отправляла кадр закрытия, конечная точка ДОЛЖНА отправить кадр закрытия в ответ.

Позже также упоминается:

Сервер ДОЛЖЕН немедленно закрыть базовое TCP-соединение;

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

Что должно произойти, когда близкое рукопожатие начинается с клиента? Должен ли клиент повторно отправить какое-то сообщение, чтобы дать указание конечной точке сервера закрыть TCP? или сервер должен закрыть TCP при получении закрытого кадра?


person Kim Byer    schedule 03.02.2016    source источник


Ответы (2)


Должен ли клиент повторно отправить какое-либо сообщение, чтобы указать конечной точке сервера выполнить закрытие TCP?

(а) Это именно то, для чего предназначено сообщение CLOSE FRAME, и (б) нет, сервер должен немедленно закрыть TCP-соединение, как указано в тексте, который вы цитируете.

или сервер должен закрыть TCP при получении закрытого кадра?

Это именно то, что он говорит. Конечно, после отправки CLOSE FRAME клиенту.

person user207421    schedule 03.02.2016

Как вы заметили, RFC говорит:

If an endpoint receives a Close frame and did not previously send a Close frame, the endpoint MUST send a Close frame in response.

Это относится как к серверу, так и к клиенту. Итак, когда Close исходит от клиента, произойдет следующее:

  1. Клиент отправляет Close фрейм
  2. Сервер получает кадр Close и возвращает его клиенту, так как он сам его не отправлял.
  3. Сервер закрывает свое TCP-соединение (он должен сделать это сразу после отправки кадра Close)
  4. Клиент закрывает TCP-соединение. Он может сделать это либо сразу после получения эхо-сигнала Close от сервера, либо подождать, пока сервер не закроет его в конце (он узнает об этом из-за изменения состояния соединения).
person Alcinator    schedule 03.02.2016
comment
Есть ли способ определить, что это за близкая рамка. В соответствии с RFC 6455 кадр закрытия МОЖЕТ содержать тело (часть данных приложения кадра), которое указывает причину закрытия, я пытаюсь понять это в течение некоторого времени. - person user2288650; 21.01.2018