HTTP: каковы отношения между конвейерной передачей, поддержкой активности и событиями, отправленными сервером?
Я пытаюсь понять, что такое HTTP-конвейерная связь и HTTP-поддержка активности, и пытаюсь установить связь между этими двумя темами и технологией событий отправки сервера.
Насколько я понимаю,HTTP keep-alive соединение является стандартным в HTTP 1.1 способом использования TCP, когда установленное разовое TCP-соединение используется для отправки нескольких HTTP-запросов один за другим.HTTP конвейерная передача - это возможность клиента отправлять запросы на сервер, в то время как ответы на предыдущие запросы еще не были получены с использованием того же TCP-соединения, как правило, не используемого в браузерах по умолчанию.
Мои вопросы:
1) если возможно отправить несколько запросов на сервер один за другим, используя одно TCP-соединение - как клиент может различить ответы? Я предполагаю, что клиент использует FIFO порядок отправки ответов сервером?
2) Почему неидемпотентные запросы, такие как запросы POST, не должны передаваться по конвейеру (согласно википедии)?
3) Как насчет ограничений веб-сервера: ограничено ли количество возможных открытых TCP-соединений? Если да, то если какое-то количество клиентов поддерживает соединения keep-alive, другие не могут установить соединения, и это может привести к проблеме, верно?
4) Отправленные сервером события используют соединение keep-alive, но, насколько я понимаю, SSE не использует конвейерную обработку. Вместо этого им удается обработать несколько ответов на один запрос или, может быть, они просто отправляют другой запрос, когда приходит следующий ответ с событием. Какое предположение верно?
5) Одно TCP соединение означает один сокет? Один сокет означает одно TCP-соединение? Закрытие / открытие сокета означает закрытие / открытие TCP-соединения?
1 ответ
Да, ФИФО. TCP/IP гарантирует доставку данных в порядке, поэтому ответы не могут поступать в другом порядке (если сервер / прокси-сервер глючит и отправляет ответы в неправильном порядке, значит, вы полностью облажались).
Я не помню никаких причин для HTTP-спецификации. Это может быть просто предостережением, потому что конвейерная обработка плохо реализована в некоторых прокси / серверах.
Спецификация HTTP предполагает 2 соединения на сервер, браузеры установили 6-8 соединений на сервер, но нет фиксированного ограничения. Истощение соединений является реальной проблемой для Apache, а для ситуаций высокой нагрузки рекомендуется отключить KeepAlive в Apache и использовать прокси-сервер (например, HAProxy), который может дешево предоставлять функциональность Keep-Alive клиентам.
Преимущество прокси-сервера в том, что один прокси-сервер может распределять соединения на несколько серверов (помогает масштабировать) или может изменять трафик (например, gzip сжимает все, даже если серверное программное обеспечение этого не делает).SSE не полагается на Keep-Alive. Это не использование нескольких ответов. Это единственный ответ, который требует "загрузки" навсегда, поэтому конвейерная обработка или поддержание в памяти не имеют значения для SSE. Соединение TCP / IP не может возвращать больше ответов во время отправки ответа SSE.
SSE будет поддерживать работу сервера до тех пор, пока соединение открыто (так обычно для каждого пользователя). Вот почему лучше использовать SSE с Node.js/Tornado, который может обрабатывать сотни тысяч соединений, а не PHP/Apache, который рассчитан на несколько соединений одновременно.Сокеты являются интерфейсом программирования для соединений TCP / IP. Как правило, да, один разъем - это одно соединение.