Длина сообщения и управление подключением - это две разные вещи, которые на самом деле не имеют ничего общего друг с другом (за исключением одного случая, когда длина сообщения полностью неизвестна и закрытие соединения является единственным возможным способом обозначить EOF, но это случается редко, и это не твоя ситуация).
Разделение на части применяется только к длине сообщения, где фрагмент нулевой длины обозначает EOF. Если соединение преждевременно закрывается до достижения EOF, сообщение является неполным, и получатель может решить, сохранять / обрабатывать его или нет.
Заголовок Connection
используется клиентом, чтобы указать, хочет ли он, чтобы сервер закрыл соединение или оставил его открытым после отправки своего ответа. Тот же заголовок используется сервером, чтобы указать, закрывается ли соединение или остается открытым после отправки ответа.
Должен ли быть добавлен заголовок «Соединение» (или установлен для поддержания активности, что то же самое, что мы говорим о HTTP 1.1), или это авторизовано, чтобы установить его в Connection: close
Это не имеет ничего общего с разбиением на части. Независимо от формата сообщения, клиент и сервер всегда должны указывать свои намерения в отношении текущего соединения, следует ли его закрыть или оставить открытым. Это достигается за счет наличия или отсутствия заголовка Connection
, в зависимости от версии HTTP:
Если используется HTTP 1.0, поведение по умолчанию - close
, если Connection: keep-alive
не отправлено явно.
Если используется HTTP 1.1+, поведение по умолчанию - keep-alive
, если Connection: close
не отправлено явно.
Если клиент запрашивает подтверждение активности, сервер решает, соблюдать его или нет. Сервер может либо оставить соединение открытым, либо закрыть соединение.
Если клиент запрашивает закрытие, сервер ДОЛЖЕН соблюдать его и закрыть соединение.
Отправка пустого чанка означает конец передачи, но означает ли это конец соединения?
Нет. Только заголовок Connection
делает это. Таким образом, особенно в сценарии keep-alive
, соединение остается открытым, чтобы клиент мог повторно использовать существующее соединение для отправки нового запроса после завершения передачи предыдущего ответа.
Я думал, что мне нужно добавить Connection: close, когда я намерен закрыть соединение после отправки пустого фрагмента
Верно, особенно в HTTP 1.1+, где keep-alive
- поведение по умолчанию.
где, если я не добавлю заголовок подключения, он останется открытым
Значение пропущенного заголовка Connection
зависит от используемой версии HTTP, как описано выше.
person
Remy Lebeau
schedule
01.05.2018