Может кто поделиться информацией как со стороны сервера должны организовываться постоянные соединения по HTTP/1.0, HTTP/1.1?
Читаю RFC 7230 - Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing [каюсь, бегло] и не могу понять при каких условиях сервер должен поддерживать постоянные соединения.
Пример, Request от браузера:
GET / HTTP/1.1
User-Agent: ...
Host: 192.168.25.148:28950
Accept: ...
Accept-Language: ...
Accept-Encoding: gzip, deflate
Cache-Control: no-cache
Connection: Keep-Alive
DNT: 1
Что я должен сделать со стороны сервера, чтобы создать персистентое соединение? Я его создаю, т.е. не закрываю сокет. В коде html проставляется только хидер Content-Type. При Connection: close со стороны сервера я должен после отправки тела сразу закрыть соединения, это я понял.
Дальше что? Висит соединение, сервер если что не мой, допиливаю, у него таймаут на прием данных при открытом (ESTABLISHED) соединение почему-то 5 секунд. Должен ли я увеличить этот таймаут?
И главный вопрос: кто посылает эти самые keep-alive пакеты? Сервер или клиент? И в каком они виде обычно? Ну, либо спец. сформированный TCP пакет, который надо как-то парсить (тут бы не помешал линк на RFC) или как обычно: GET request с какими-то параметрами (тоже неплохо RFC на это).
Хочется по-быстрому решить этот вопрос без детального вникания, хотя рано или поздно, знаю, прочту все эти RFC.
Вобщем, желательно объяснить на пальцах и с примерами. Так мне будет проще.
Спасибо.
---
Заметки [для себя].
nginx + SO_KEEPALIVE
Используется в случаях:
- http_proxy
- http_fastcgi
- http_memcached
Ref.:
- src/http/modules/ngx_http_memcached_module.c
- src/http/modules/ngx_http_fastcgi_module.c
- src/http/modules/ngx_http_proxy_module.c
nginx server + keepalive
По умолчанию:
- запрет keepalive для msie6 и младше (keepalive_disable msie6;)
- максимум запросов в рамках одного keepalive-соединения 100 (keepalive_requests 100;)
- keepalive_timeout 75s;
- хидер Keep-Alive: timeout=время для Mozilla и Konqueror
- MSIE сам закрывает keep-alive соединение примерно через 60 секунд.
Ref.:
- http://nginx.org/ru/docs/http/ngx_http_core_module.html#keepalive_disable
- http://nginx.org/ru/docs/http/ngx_http_core_module.html#keepalive_timeout
---
Выводы.
SO_KEEPALIVE
- Выставляется только на listen-сокет
- OS-dependent: можно включать или не включать совсем
- Можно использовать вместе с TCP_KEEPCNT, TCP_KEEPIDLE, TCP_KEEPINTVL
- Работает независимо от псевдо-реализации HTTP «Keep-Alive»
Ref.:
1. http://nginx.org/ru/docs/http/ngx_http_core_module.html#listen
2. http://www.tldp.org/HOWTO/html_single/TCP-Keepalive-HOWTO/
Keep-Alive в HTTP
- Connection: keep-alive несет лишь информативный характер.
- Сервер/клиент никак не ограничены держать или закрыть соединение при любых обстоятельствах.
- Дополнительные плюшки для бразуеров: Connection: keep-alive + Keep-Alive: timeout=ВРЕМЯ
Взято из nginx, src/http/ngx_http_header_filter_module.c
- MSIE and Opera ignore the «Keep-Alive: timeout=<N>» header.
- MSIE keeps the connection alive for about 60-65 seconds.
- Opera keeps the connection alive very long.
- Mozilla keeps the connection alive for N plus about 1-10 seconds.
- Konqueror keeps the connection alive for about N seconds.
Ref.: