HTTP-клиент пропускает соединения, когда включен keep-alive
Я настроил HTTP-сервер для встроенной системы для связи с известным не вредоносным удаленным клиентским приложением.
Мне пришлось отключить поддержку keep-alive на моем сервере, поскольку приложение удаленного клиента всегда запрашивает keep-alive, но никогда не использует соединение повторно. Вместо этого клиент открывает новое соединение для каждого запроса и оставляет старое открытым на неопределенный срок.
Например:
Клиент отправляет:
POST /my_server_path HTTP/1.1
accept: text/plain, */*; q=0.01
accept-encoding: gzip
connection: keep-alive
content-length: 4
content-type: application/x-www-form-urlencoded;charset=UTF-8
host: some_host:1234
origin: https://the_origin.com
test
Мой сервер отвечает:
HTTP/1.1 200 OK
access-control-allow-headers: post-body
access-control-allow-origin: https://the_origin.com
allow: POST, OPTIONS
connection: keep-alive
content-length: 4
content-type: text/html
date: Mon, 01 Feb 2018 15:00:00 GMT
server: MyServer/1.0
test
Хотя мой HTTP-сервер поддерживает закрытие устаревших соединений, я начал отправлять Connection: closed
за каждый запрос уменьшить нагрузку на систему.
Это нормальное поведение, я что-то упустил или я правильно понимаю, что это ошибка удаленного клиентского приложения?
1 ответ
Хотя это не очень приятно, клиент может закрыть соединение и использовать другое. Конечно, глупо запрашивать подтверждение активности, а затем не использовать его, так что вы можете указать на это как на ошибку, но это все еще может произойти. Это также может быть связано с прокси в пути.
См. RFC 7230 и отметьте "МАЙ":
Клиент МОЖЕТ отправлять дополнительные запросы на постоянное соединение до тех пор, пока он не отправит или не получит опцию "закрыть", или не получит ответ HTTP/1.0 без опции соединения "keep-alive".
Вот почему сервер не должен хранить слишком много открытых соединений keep-alive в течение слишком долгого времени. Он может сигнализировать свою политику клиенту с Keep-Alive
заголовок.
Увидеть max
а также timeout
Параметр объяснен в https://tools.ietf.org/id/draft-thomson-hybi-http-timeout-01.html