Подтвердить что ты не робот

Использовать HTTP Keep-Alive для взаимодействия сервера с клиентом

Недавно в интервью мне задали вопрос, как я буду обращаться к клиентскому приложению онлайн-чата. Я прошел стандартное решение "опрос", но был отрезан, потому что интервьюер искал метод "HTTP 1.1 keep-alive". Некоторое время, используя HTTP, и помня, что весь смысл был "без гражданства", мне это никогда не приходило в голову (также не говоря уже о том, что keep-alive не выполняется последовательно).

Мой вопрос: возможно ли, чтобы веб-сервер транслировал и/или отправлял информацию клиенту, когда был установлен заголовок "keep-alive"?

4b9b3361

Ответ 1

Keep-alive просто держит сокет TCP открытым, поэтому каждый раз, когда вы проводите опрос, вы сохраняете накладные расходы на пакеты установки TCP/Teardown, но вам все равно нужно опросить.

Однако, "длительный опрос" - это стратегия для веб-сервера для передачи уведомлений клиенту. По сути, клиент выдает запрос GET, но вместо немедленного ответа веб-сервер ждет, пока у него не будет уведомления для отправки, и в этот момент они ответят на запрос GET. Это устраняет необходимость в том, чтобы пакеты проходили через провод для целей опроса и сохраняли соединение безстоящим, что, как вы правильно говорите, является одной из целей протокола.

Ответ 2

С HTTP 1.1, keep-alive - это поведение по умолчанию. (В HTTP 1.0 поведение по умолчанию заключалось в том, чтобы закрыть соединение.) Сервер должен отправить заголовок "Соединение: закрыть", чтобы завершить соединение с первым ответом. Таким образом, все еще есть TCP-сокет, доступный для передачи данных, но просто нажатие данных с сервера будет нарушать протокол HTTP в основном. Даже используя keep-alive, клиенту все равно придется опросить сервер.

Важно различать HTTP Keepalive и TCP Keepalive. HTTP keepalive предотвращает закрытие соединения с сервером или клиентом. TCP keepalive используется, когда соединение может простаивать в течение длительного периода времени и может быть отключено прокси-сервером NAT или брандмауэром. TCP keepalive активируется на основе каждого сокета вызовами setsockopt().

При выполнении "длительного опроса", чтобы устранить необходимость повторного опроса, может потребоваться TCP keepalive.

Ответ 3

Вы можете прочитать больше о Comet серверах. Это звучит в основном как подход, о котором спрашивал интервьюер. Их эффективность оспаривается некоторыми, но она использовалась в нескольких подобных ситуациях.

Например, я считаю, что gmail использует кометные технологии для некоторых вещей (но не цитируйте меня на нем).

Другим примером, который кажется уместным, является BOSH, который является протоколом для передачи информации чата с использованием HTTP и XMPP. Но я не верю, что использование keep-alive связано с этим.