Как клиент HTTP связывает HTTP -ответ с запросом (с Netty) или в целом?

StackOverflow https://stackoverflow.com/questions/7306497

  •  25-10-2019
  •  | 
  •  

Вопрос

Предполагается ли, что конечная точка HTTP отвечает на запросы от конкретного клиента, чтобы их получить?

Как насчет того, если это не имеет смысла в случае запросов, обрабатываемых кластером за прокси или в запросах, обрабатываемых NIO, где один запрос закончен быстрее, чем другой?

Есть ли стандартный способ связать уникальный идентификатор с каждым HTTP -запросом, чтобы связать с ответом? Как это обрабатывается у клиентов, таких как HTTP Componenets HttpClient или Curl?

Вопрос сводится к следующему случаю:

Предположим, я загружаю файл с сервера, и запрос не закончен. Способен ли клиент заполнить другие запросы на то же соединение, которое подключено?

Это было полезно?

Решение

Я не буду переписывать ответ Кодекастера, потому что он очень хорошо сформулирован.

В ответ на ваше редактирование - нет. Нет, это не так. Одно постоянное HTTP -соединение может использоваться только для одного запроса одновременно, или оно будет очень запутанным. Поскольку HTTP не определяет какую -либо форму механизма отслеживания запросов/ответов, это просто невозможно.

Следует отметить, что существуют другие протоколы, которые используют аналогичный формат сообщения (в соответствии с RFC822), которые позволяют это (используя такие механизмы, как Заголовок SIP CSEQ), и было бы возможно реализовать это в пользовательском приложении HTTP, но HTTP не определяет какой -либо стандартный механизм для этого, и, следовательно, ничего не может быть сделано, что можно было бы сработать повсюду. Это также представит проблему с ответом для второго сообщения - вы ждете первого ответа на финиш, прежде чем отправить второй ответ, или попытаться сделать паузу первого ответа во время отправки второго ответа? Как вы сообщаете об этом таким образом, что гарантируют сообщения, не станут поврежденными?

Также обратите внимание, что SIP (обычно) работает над UDP, что не гарантирует заказ пакетов, что делает систему CSEQ более необходимой.

Если вы хотите отправить запрос на сервер, в то время как другая транзакция все еще находится в процессе, вам нужно будет создать новое соединение с сервером и, следовательно, новый TCP -поток.

Facebook провел некоторое исследование этого, когда они строили свой CDN, и они пришли к выводу, что вы можете эффективно иметь 2 или 3 открытых HTTP -потока одновременно, но еще больше, чем это сокращает общее время передачи из -за дополнительной стоимости накладных расходов пакетов. Я бы ссылался на запись в блоге, если бы мог найти ссылку ...

Другие советы

Всякий раз, когда открывается соединение TCP, соединение распознается исходными и назначенными портами и IP -адресами. Поэтому, если я подключаюсь к www.google.com на порт 80 назначения (по умолчанию для HTTP), мне нужен бесплатный источник, который ОС генерирует.

Ответ веб -сервера затем отправляется на исходный порт (и IP). Так также работает NAT, запомнив, какой исходный порт принадлежит какой внутренний IP -адрес (и наоборот для входящих соединений).

Что касается вашего редактирования: нет, одно HTTP -соединение может выполнить одну команду (get/post/etc) одновременно. Если вы отправляете другую команду, пока вы останавливаете данные из ранее выпущенной команды, результаты могут варьироваться в зависимости от реализации клиента и сервера. Я предполагаю, что Apache, например, будет передавать результат второго запроса после отправки данных первого запроса.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top