Вопрос или проблема
Я изучаю справочник по протоколу HTTP от Mozilla, и я не понимаю, что означает следующая часть:
Соединение контролируется на транспортном уровне и, следовательно, в основном находится вне области охвата HTTP. HTTP не требует, чтобы подлежащий транспортный протокол основывался на соединениях; он только требует, чтобы он был надежным или не терял сообщения (как минимум, в таких случаях выдавая ошибку). Из двух самых распространенных транспортных протоколов в Интернете TCP является надежным, а UDP – нет. Поэтому HTTP полагается на стандарт TCP, который основан на соединениях.
Есть несколько утверждений, которые кажутся противоречивыми:
- HTTP не требует, чтобы подлежащий транспортный протокол основывался на соединениях.
- HTTP полагается на стандарт TCP, который основан на соединениях.
Мой вопрос:
Существует ли ситуация, когда нам не нужно устанавливать соединение с сервером по транспортному протоколу, прежде чем отправить HTTP (или любой запрос на прикладном уровне), и что именно означает основанное на соединении?
Во время создания HTTP TCP был основным общедоступным транспортным протоколом для Интернета, который обеспечивал необходимые свойства – использование UDP было возможно, но потребовало бы от самого HTTP обеспечения надежности, RDP (надежный протокол данных) практически не нашел применения, SCTP еще не был изобретен и т.д., в то время как TCP был доступен на почти каждой системе с реализацией IP1.
Поэтому TCP стал естественным выбором для HTTP-серверов и клиентов, и поскольку все реализации должны согласовывать транспорт, на практике HTTP полагается на TCP для обеспечения совместимости.
Тем не менее, HTTP явно не сохраняет никакого состояния на уровне соединения – два HTTP-запроса будут вести себя одинаково, независимо от того, поступили ли они через одно соединение TCP или через разные соединения – следовательно, он не полагается на свойство “основанное на соединении” TCP; он полагается на TCP только за его другие свойства.
(Недавно многие реализации начали поддерживать QUIC как альтернативный транспорт. Это своего рода, но не совсем “HTTP поверх UDP”, поскольку QUIC фактически находится почти на том же уровне, что и TCP с точки зрения свойств, которые он предоставляет прикладному протоколу.)
Существует ли когда-либо ситуация, когда нам не нужно устанавливать соединение с сервером по транспортному протоколу перед тем, как отправить HTTP (или любой запрос на прикладном уровне)
HTTP может работать таким образом; как уже упоминалось, он не хранит никаких состояний на уровне соединения, поэтому он может работать через транспорты, которые не имеют явных соединений или разъединений. (Я видел HTTP поверх UDP, HTTP поверх D-Bus и т.д.)
Существует много прикладных протоколов, которые не используют транспорт на основе соединений; DNS и NTP являются двумя из самых распространенных примеров, оба из которых основаны на одноразовых обменах запросами без каких-либо явных операций соединения/разъединения. (DNS может и часто использует TCP, но UDP остается его основным транспортом для большинства операций.)
1 (На самом деле, причина, по которой не было “IPv2” или “IPv3”, заключалась в том, что он был известен как “TCPv2” и “TCPv3” до разделения на два уровня TCP/IP для версии 4…)
Ответ или решение
Понимание HTTP и транспортных протоколов: Требования к соединениям
Ваша вопрос, касающийся протокола HTTP и необходимости наличия соединения на транспортном уровне, поднимает важные аспекты, которые могут показаться противоречивыми. Рассмотрим это детально, чтобы прояснить ситуацию.
Основные принципы
-
HTTP и транспортные протоколы: Протокол HTTP, как обозначено, действительно не требует, чтобы подлежащий транспортный протокол был соединительным. Это значит, что на уровне HTTP не существует строгого требования к установлению "соединения" между клиентом и сервером таким образом, как это делает, например, TCP.
-
Надежность вместо соединения: Основным требованием HTTP к транспортному протоколу является надежность (то есть, отсутствие потерь сообщений). Это означает, что даже если соединение не устанавливается в традиционном смысле, транспортный уровень должен обеспечивать возможность доставки сообщений с минимальными ошибками. Классическим примером транспортного протокола, который соответствует этим требованиям, является TCP, который является соединительным протоколом, предоставляющим надежность.
-
Возможность использования других протоколов: Как упомянуто в вашем описании, HTTP может работать на других транспортных протоколах, например, на UDP, но в этом случае HTTP должен будет реализовать собственные механизмы надежности. Протокол QUIC, появившийся в последнее время, тоже можно считать альтернативным решением, поскольку он фактически объединяет некоторые свойства TCP и UDP, поддерживая надежную доставку сообщений без необходимости устанавливать TCP-соединение.
Примеры, когда соединение не требуется
Существуют сценарии, когда HTTP может работать без явного установления соединения:
-
HTTP/UDP: Хотя это менее распространено, некоторые реализации HTTP могут работать через UDP, и в таком случае не требуется явное соединение.
-
Другие протоколы: Например, протоколы, такие как DNS и NTP, работают без явного соединения. Они осуществляют обмен запросами и ответами без необходимости поддерживать состояние соединения.
Заключение
Таким образом, HTTP действительно не требует от своего транспортного протокола наличия соединений в полном смысле слова. Его требования касаются более надежной передачи данных. Это объясняет, почему HTTP в практическом использовании обычно опирается на TCP, но технически способен функционировать и на других менее традиционных транспортных протоколах.
С учетом этих деталей, можно утверждать, что в зависимости от реализации и требований, HTTP может работать без обычного "соединения" в тех случаях, когда используется протокол с аналогичной надежностью. Поэтому, когда мы говорим о соединении в контексте HTTP, важно учитывать различия между самим протоколом HTTP и теми свойствами, которые предоставляет его транспортный уровень.