AFAIK, в HTTP 1 сервер не может отправить ответ обратно клиенту, если этот клиент не отправил запрос первым. Это может показаться неуместным для вашего вопроса, но терпите меня.
Заголовок Connection: keep-alive
сообщает клиенту, что он can
повторно использует соединение, если он этого хочет, а не must
. Клиент может решить закрыть его в любое время, все зависит от реализации клиентской библиотеки, и у вас нет никаких гарантий.
Единственный способ заставить клиента не закрывать соединение - не завершить ответ. Единственный способ сделать это - отправить ответ с Transfer-Encoding: chunked
и никогда не отправлять окончательный фрагмент (это имеет некоторые серьезные предостережения, например переполнение буфера на клиенте ...).
Итак, чтобы ответить на ваши 2 пункта:
- Вы не можете, эта низкоуровневая деталь полностью скрыта (по уважительным причинам) от клиента.
- Нет HTTP-рукопожатия, есть TCP рукопожатие, которое выполняется, когда клиентский сокет соединяется с серверным сокетом. Существует рукопожатие TLS , которое выполняется после соединения TCP и перед выполнением любого запроса. Как только соединение открыто, клиент отправляет http-запросы, а сервер отвечает ресурсами.