Используйте HTTP Keep-Alive для сервера, чтобы общаться с клиентом - PullRequest
17 голосов
/ 04 января 2009

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

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

Ответы [ 3 ]

9 голосов
/ 04 января 2009

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

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

8 голосов
/ 04 января 2009

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

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

При проведении «длинного опроса» для устранения необходимости повторного опроса может потребоваться поддержка активности TCP.

5 голосов
/ 04 января 2009

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

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

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

...