Skip to main content

Сетевые протоколы и модель OSI

Image

У нас есть понятие сетевого протокола. Вот скучное определение, но мы все знаем: да, есть разные протоколы HTTP, TCP, веб-сокеты, и они разные.

Протокол передачи данных — набор соглашений, которые определяют обмен данными между различными программами. Эти соглашения задают единообразный способ передачи сообщений и обработки ошибок.

Сетевая модель передачи данных (не углубляясь в её происхождение) показывает, что при любой передаче по сети одновременно задействуется несколько протоколов разного уровня абстракции.

Например, при отправке данных:

  1. Физический уровень — на нём информация передаётся в виде электрических или оптических сигналов («ноликов и единичек»).
  2. Транспортный уровень — здесь работают протоколы TCP и UDP. Они отвечают за передачу логических пакетов по сети, но всё ещё остаются достаточно низкоуровневыми.
  3. Прикладной уровень (седьмой уровень модели OSI) — на нём действуют протоколы, с которыми напрямую работают приложения: HTTP (разных версий), WebSockets и многие другие.

Таким образом, в каждый момент времени данные последовательно проходят через все эти уровни, и на каждом из них используется свой набор протоколов.

В дополнение к семи уровням модели OSI/стека TCP/IP выделяют так называемый «уровень 7+» (уровень над прикладным). На этом уровне находятся протоколы и технологии, которые работают поверх стандартных прикладных протоколов (например, HTTP) и предоставляют более высокоуровневые абстракции.

К «уровню 7+» можно отнести:

  1. Протоколы удалённого вызова процедур (RPC):
    • JSON-RPC — обмен данными в формате JSON.
    • gRPC — современный RPC-фреймворк от Google (работает поверх HTTP/2).
    • SAP (собственный протокол SAP) — используется в экосистеме SAP для общения между компонентами.
  2. Протоколы запросов к данным:
    • GraphQL — язык запросов к API, позволяющий клиенту точно указывать, какие данные нужны.
  3. Протоколы систем обмена сообщениями (message brokers) — располагаются ещё выше:
    • AMQP, MQTT, STOMP и др. — протоколы для асинхронной передачи сообщений через брокеры (RabbitMQ, ActiveMQ, Kafka и т. п.).

Таким образом, на «уровне 7+» собираются все протоколы и технологии, которые либо надстраиваются над HTTP, либо работают поверх него, либо реализуют собственную логику обмена сообщениями на прикладном уровне и выше.

Понятие «транспорт»

Image

В IT-среде есть сленговое понятие «транспорт». Оно не совпадает с формальным «транспортным уровнем» модели OSI, а используется в более широком смысле.

Простая аналогия: отправка письма в Австралию

  1. Письмо — у него есть свои правила: адрес отправителя, адрес получателя, марки, конверт и т. д. Это своего рода протокол верхнего уровня.
  2. Курьер / почтовое отделение — кладёт письмо в коробку. На коробке появляется дополнительная техническая информация. Это протокол уровня ниже.
  3. Коробки складывают в контейнер. Контейнер — ещё один уровень.
  4. Контейнер грузят на корабль, который перемещается по своим правилам. Корабль — это уже протокол сетевого уровня (в терминах аналогии).

Так что же такое «транспорт»?

Транспорт — это протокол или технология, которая находится на уровень ниже того протокола или технологии, о котором мы говорим сейчас.

Если зафиксировать любой уровень в этой «матрешке», транспортом для него будет всё, что находится под ним:

  • Для письма транспортом является коробка.
  • Для коробки транспортом является контейнер.
  • Для контейнера транспортом является кораблик.

В IT этот термин применяется гибко:

  • В контексте брокеров сообщений «транспортом» могут называть технологию, которая физически перемещает данные (например, TCP, HTTP или шину сообщений).
  • Главное — транспорт всегда находится на более низком уровне абстракции по отношению к тому, что обсуждается в данный момент.

Итог: любая передача данных выстраивается как матрешка — каждый уровень «заворачивается» в транспорт следующего, более низкого уровня.

Как это выглядит на практике (матрешка протоколов)

Image

Рассмотрим, как это работает на практике, на примере обычного HTTP-запроса.

Прикладной уровень (уровень 7 модели OSI)

HTTP-запрос состоит из заголовков (headers) и тела (body) (например, в POST-запросе). Это исходное сообщение — оно находится на прикладном (седьмом) уровне.

Упаковка («заворачивание в матрёшку»)

Чтобы отправить это сообщение по сети, оно последовательно «заворачивается» в протоколы нижележащих уровней:

  1. Транспортный уровень (уровень 4) — добавляются заголовки TCP (или UDP). Теперь исходное сообщение находится внутри TCP-сегмента.
  2. Сетевой уровень (уровень 3) — добавляются заголовки IP (адреса отправителя и получателя).
  3. Канальный уровень (уровень 2) — добавляются заголовки канального протокола (например, Ethernet).
  4. Физический уровень (уровень 1) — данные превращаются в сигналы (биты), которые передаются по среде передачи.

Таким образом, исходный HTTP-запрос оказывается в центре многослойной «матрешки».

Передача через промежуточные узлы

Когда данные путешествуют по сети, они проходят через промежуточные узлы (маршрутизаторы, коммутаторы и т. д.). Каждый такой узел:

  • «Разворачивает» матрешку ровно настолько, чтобы прочитать служебную информацию, необходимую для дальнейшей передачи.
  • Например, маршрутизатор смотрит IP-адрес назначения (уровень 3), но не разворачивает HTTP или TCP — ему это не нужно.
  • Затем снова «заворачивает» данные и отправляет дальше.

Полная распаковка — только у конечного получателя

Полная «распаковка» всей матрешки происходит только на стороне конечного получателя (сервера или клиента, в зависимости от направления):

  • Снимаются заголовки канального, сетевого и транспортного уровней.
  • Извлекается исходное HTTP-сообщение.
  • Затем оно разбирается на заголовки и тело (если это запрос — обрабатывается, если ответ — передаётся приложению).

Суть иерархии протоколов

Именно в этом и заключается суть иерархической модели OSI (и стека TCP/IP):

  • Каждый уровень выполняет свою задачу и «общается» только с соседними уровнями.
  • Нижележащие уровни служат транспортом для вышележащих.
  • Промежуточные узлы работают только с теми уровнями, которые нужны для маршрутизации, и не вникают в содержимое вышележащих протоколов.

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

Транспортный уровень (формальный) vs сленговое «транспорт»

Существует два разных понятия, которые важно не путать:

  1. Транспортный уровень (формальный, модель OSI)

    • Это конкретный уровень 4 модели OSI/стека TCP/IP.
    • На нём работают строго определённые протоколы: TCP и UDP.
    • Их задача — обеспечить передачу данных между приложениями на разных узлах сети.
  2. Сленговое понятие «транспорт» (в IT-среде)

    • Говоря «транспорт» в неформальном контексте, имеют в виду технологию или протокол, который находится уровнем ниже того, о котором сейчас идёт речь.
    • Это может быть любой протокол нижележащего уровня, не обязательно четвёртый.

Иллюстрация на реальных примерах:

Что обсуждаемТранспортом для него является
GraphQLHTTP (прикладной уровень)
HTTPTCP (транспортный уровень, уровень 4)
TCPIP (сетевой уровень, уровень 3)
IPEthernet (канальный уровень, уровень 2)

И так далее — цепочка «матрешки» продолжается вниз.

В рамках дальнейшего обсуждения мы будем в основном оперировать следующими уровнями (в терминах модели OSI):

  • Уровень 4 (транспортный) — TCP, UDP.
  • Уровень 7 (прикладной) — HTTP, WebSocket и другие протоколы, с которыми напрямую работают приложения.
  • Уровень L7+ (над прикладным) — GraphQL, gRPC, JSON-RPC, протоколы брокеров сообщений и т. д.