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 ответ

Решение
  1. Да, ФИФО. TCP/IP гарантирует доставку данных в порядке, поэтому ответы не могут поступать в другом порядке (если сервер / прокси-сервер глючит и отправляет ответы в неправильном порядке, значит, вы полностью облажались).

  2. Я не помню никаких причин для HTTP-спецификации. Это может быть просто предостережением, потому что конвейерная обработка плохо реализована в некоторых прокси / серверах.

  3. Спецификация HTTP предполагает 2 соединения на сервер, браузеры установили 6-8 соединений на сервер, но нет фиксированного ограничения. Истощение соединений является реальной проблемой для Apache, а для ситуаций высокой нагрузки рекомендуется отключить KeepAlive в Apache и использовать прокси-сервер (например, HAProxy), который может дешево предоставлять функциональность Keep-Alive клиентам.
    Преимущество прокси-сервера в том, что один прокси-сервер может распределять соединения на несколько серверов (помогает масштабировать) или может изменять трафик (например, gzip сжимает все, даже если серверное программное обеспечение этого не делает).

  4. SSE не полагается на Keep-Alive. Это не использование нескольких ответов. Это единственный ответ, который требует "загрузки" навсегда, поэтому конвейерная обработка или поддержание в памяти не имеют значения для SSE. Соединение TCP / IP не может возвращать больше ответов во время отправки ответа SSE.
    SSE будет поддерживать работу сервера до тех пор, пока соединение открыто (так обычно для каждого пользователя). Вот почему лучше использовать SSE с Node.js/Tornado, который может обрабатывать сотни тысяч соединений, а не PHP/Apache, который рассчитан на несколько соединений одновременно.

  5. Сокеты являются интерфейсом программирования для соединений TCP / IP. Как правило, да, один разъем - это одно соединение.

Другие вопросы по тегам