Может ли постоянный HTTP-клиент отправлять более одного запроса одновременно? - PullRequest
7 голосов
/ 06 ноября 2011

Я пишу прокси-сервер HTTP и заметил, что многие клиенты используют заголовок «Connection: Keep-Alive» для поддержания постоянного соединения.Возможно ли, что клиент отправляет другой HTTP-запрос до того, как сервер обработает первый?

Например, клиент отправляет «GET / HTTP / 1.1», но до того, как у сервера появится возможность ответить, клиент отправляет «GET /favicon.ico HTTP / 1.1 ".Это возможно?Или клиент приостановит ответ перед отправкой второго запроса?

Также, при использовании постоянного соединения, безопасно ли предположить, что все запросы через это соединение будут иметь одинаковый заголовок "Host:"?

Ответы [ 3 ]

5 голосов
/ 07 ноября 2011

"Кроме того, при использовании постоянного соединения безопасно ли предполагать, что все запросы через это соединение будут иметь одинаковый заголовок" Host: "?"

Я так не думаю, см. HTTPbis P1, Раздел 2.2 :

Получатели ДОЛЖНЫ рассматривать каждое сообщение в соединении изолированно; Поскольку HTTP является протоколом без сохранения состояния, нельзя предполагать, что два запроса к одному и тому же соединению поступают от одного и того же клиента или имеют какие-либо другие общие атрибуты. В частности, посредники могут смешивать запросы от разных клиентов в одно соединение с сервером. Обратите внимание, что некоторые существующие расширения HTTP (например, [RFC4559]) нарушают это требование, что потенциально может привести к проблемам взаимодействия и безопасности.

4 голосов
/ 06 ноября 2011

Да, клиент может направлять запросы. (См. http://en.wikipedia.org/wiki/HTTP_pipelining).

Перевернув ваш последний вопрос ... было бы небезопасно для клиента предположить, что запросы к нескольким хостам будут обслуживаться одним конвейером. Возможно, не существует спецификаций, которые напрямую касаются вашего вопроса в заголовке Host :, но можно с уверенностью сказать, что они будут такими же.

1 голос
/ 06 ноября 2011

По первому вопросу:

Возможно ли, чтобы клиент отправил еще один HTTP-запрос до того, как сервер обработает первый?

Я полагаю, что да, это может быть возможно (возможно, я ошибаюсь, я вспомнил, что читал это пару лет назад; окончательный ответ - в спецификациях протокола HTTP). Но я не понимаю, почему вы спрашиваете. Кроме того, клиент может открыть несколько TCP-подключений одновременно к одному и тому же HTTP-серверу. И, конечно, у вас много одновременных клиентов.

О втором вопросе

Также, при использовании постоянного соединения, безопасно ли предположить, что все запросы через это соединение будут иметь одинаковый заголовок "Host:"?

Я полагаю, что это обычно так, но я не буду считать это достоверным. Я мог бы предположить, что некоторые умные клиенты HTTP, распознавая, что два URL с разными заголовками Host: совместно используют один и тот же IP, могут повторно использовать одно и то же соединение.

Но я не понимаю, почему вы спрашиваете. Постоянные соединения HTTP были изобретены для минимизации дорогостоящих соединений TCP, и два вопроса, которые вы задаете, являются крайним моментом в этом отношении. Возможно, немногие клиенты HTTP делают то, что вы описали сегодня.

И вы должны быть строгими в отношении того, что вы отправляете (w.r.t. стандартное соответствие), но гибко в отношении того, что вы принимаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...