задается вопросом, может ли кто-нибудь дать убедительное объяснение того, является ли HTTP 1.1 полудуплексным или полным дуплексом в контексте конвейерной обработки? Насколько я понимаю, несколько запросов могут отправляться через одно и то же постоянное соединение, прежде чем клиент получит ответ. Значит ли это, что сервер может отвечать за предыдущий запрос, пока клиент отправляет новый запрос?
Является ли HTTP 1.1 Full duplex?
Ответ 1
Посмотрим на стандарт, в данном случае RFC-2616. Там мы находим в пункте 8.1.1, Постоянные соединения:
- HTTP requests and responses can be pipelined on a connection.
Pipelining allows a client to make multiple requests without
waiting for each response, allowing a single TCP connection to
be used much more efficiently, with much lower elapsed time.
и чуть позже в документе:
8.1.2.2 Pipelining
A client that supports persistent connections MAY "pipeline" its
requests (i.e., send multiple requests without waiting for each
response). A server MUST send its responses to those requests in the
same order that the requests were received.
Как и в обоих случаях, четко указано, что клиент может отправлять запросы, не дожидаясь ответа, я считаю безопасным заявить, что HTTP 1.1 поддерживает полный дуплекс.
EDIT: в RFC-7230, часть RFC-набора, который заменяет RFC-2616, будет выглядеть следующим образом:
A client that supports persistent connections MAY "pipeline" its
requests (i.e., send multiple requests without waiting for each
response). A server MAY process a sequence of pipelined requests in
parallel if they all have safe methods (Section 4.2.1 of [RFC7231]),
but it MUST send the corresponding responses in the same order that
the requests were received.
Ответ 2
HTTP - протокол запроса-ответа. Клиент отправляет запрос. Сервер ждет, пока не будет получен полный запрос. Затем отправляет ответ. Клиент и сервер не могут отправлять одновременно.
Полный дуплексный канал подразумевает, что клиент и сервер могут отправлять данные одновременно. Телефонные линии являются примером полного дуплекса. Для обеспечения полного дуплекса в Интернете рекомендуются стандартные сокеты. После установления соединения с веб-соке обе стороны могут обмениваться сообщениями одновременно. Веб-сокеты работают поверх TCP и не используют протокол HTTP.
Ответ 3
Поскольку он использует tcp, это не означает, что каждый протокол приложения на tcp является полнодуплексным.
HTTP использует парадигму запроса-ответа, а не полнодуплексную поточную парадигму. Позвольте мне повторить: HTTP - это протокол запроса-ответа! Это означает, что клиент отправляет запрос, а когда полный запрос отправлен, сервер отправляет ответ. Это имеет место, даже если используется так называемый keep-alive, то есть несколько запросов отправляются по одному и тому же TCP-соединению. Поскольку это поведение является основополагающим для протокола, большинство реализаций делают определенные (допустимые) допущения, которые затрудняют создание полнодуплексного соединения.
Если вы хотите, чтобы полный дуплекс шел для веб-сайтов, которые предназначены для совершенно другой цели.
Ответ 4
Большинство реализаций разрешают полнодуплексный HTTP (для ответов 2xx).
Формальное обсуждение можно найти в