Что означает «Соединение: закрыть» при использовании в ответном сообщении?

30

Когда клиент использует Connection: closeзаголовок в сообщении запроса, это означает, что он хочет, чтобы сервер закрыл соединение после отправки ответного сообщения.

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

введите описание изображения здесь

Что означает этот заголовок при использовании в ответном сообщении?

Я думаю, что это означает, что сервер закроет соединение после отправки ответа на сообщение (даже если клиент использовал Connection: keep-aliveзаголовок в своем сообщении запроса). Я прав?

user365656
источник

Ответы:

28

Да, это правильно. Сервер может просто сказать: «Я не поддерживаю ваш запрос подтверждения активности и просто закрою соединение, когда я закончу».

Из RFC 2616, раздел 14.10:

HTTP / 1.1 определяет опцию «закрыть» соединение для отправителя, чтобы
сигнализировать, что соединение будет закрыто после завершения
ответа. Например,

   Connection: close

в полях заголовка запроса или ответа указывается, что соединение НЕ СЛЕДУЕТ считать «постоянным» (раздел 8.1)
после завершения текущего запроса / ответа.

Приложения HTTP / 1.1, которые не поддерживают постоянные соединения, ДОЛЖНЫ включать опцию «закрыть» в каждом сообщении.

Свен
источник
3
Странно ИМО, зачем говорить, что соединение будет закрыто, если сервер сможет его просто закрыть? Не должен ли клиент тогда просто увидеть, что соединение было закрыто сервером. Есть идеи, какой смысл в этом заголовке? Я не вижу здесь никакой ценности.
Павел П
1
@Pavel Веб-приложение включает HTTP-заголовок «Connection: close» в ответ в тех случаях, когда требуется сообщить внешнему балансировщику нагрузки о закрытии поддерживающего соединения, если оно используется балансировщиком нагрузки.
Василий
1
@BasilA, чтобы балансировщик нагрузки закрывал соединение с сервером или с клиентом? Балансировщик нагрузки IMO мог видеть, что соединение было закрыто сервером, и знал бы это, не читая никаких заголовков. Также верно обратное: сервер может закрыть соединение без Connection: closeзаголовка
Павел Р
@Pavel Loadbalancer обычно получает несколько соединений от нескольких клиентов и использует одно и то же соединение с бэкендом, используя мультиплексирование через соединение keep-alive. Когда некоторые бэкэнды могут не захотеть быть частью этого мультиплексирования, HTTP-ответ бэкэнда должен содержать «Соединение: закрыть», чтобы сообщить балансировщику нагрузки о закрытии соединения и прекращении мультиплексирования. Это подробно описано в Руководстве по балансировке нагрузки AWS (прокрутите вниз до раздела
Василий А,
2
@BasilA Похоже, ты прав. Интересный. Поле общего заголовка соединения позволяет отправителю указывать параметры, которые требуются для данного конкретного соединения и НЕ ДОЛЖНЫ передаваться через прокси-серверы по дальнейшим соединениям.
Даниэль Ф