- •Глава 1. Понятие «сетевой протокол»………………………………….......3
- •Глава 2. Мобильный протокол mTproto в Telegram………………………7
- •Глава 1. Понятие «сетевой протокол»
- •1.1 Сетевой протокол
- •1.2 Примеры сетевых протоколов.
- •Глава 2. Мобильный протокол mTproto в Telegram.
- •2.1 Общее описание
- •2.2 Краткий обзор компонент
- •2.3 Запрос состояния сообщений
- •2.4 Авторизация и криптография
- •2.4 Мобильный протокол: подробное описание
Глава 2. Мобильный протокол mTproto в Telegram.
2.1 Общее описание
Протокол предназначен для доступа к серверному API с приложений, запущенных на мобильных устройствах. Подчеркнем, что интернет-браузер не считается таким приложением.
Протокол разбит на три почти независимых части:
высокоуровневая часть (язык запросов к API) — определяет, каким образом запросы к API и ответы на эти запросы преобразуются в двоичные сообщения.
криптографическая (авторизационная) прослойка — определяет, каким образом сообщения шифруются перед передачей через транспортный протокол.
транспортная часть — определяет, каким образом передаются сообщения между клиентом и сервером поверх какого-либо другого существующего сетевого протокола (например, http, https, tcp, udp).
2.2 Краткий обзор компонент
Высокоуровневая часть (язык RPC-запросов/API)
С точки зрения высокоуровневой части, клиент и сервер обмениваются сообщениями в рамках некоторой сессии. Сессия привязана к клиентскому устройству (вернее, приложению), но не к конкретному http/https/tcp-соединению. Кроме того, каждая сессия привязана к идентификатору пользовательского ключа, по которому фактически производится авторизация.
Может быть открыто несколько соединений к серверу; сообщения в ту или иную сторону могут идти по любому из них (ответ на запрос не обязан прийти по тому же соединению, по которому был отправлен сам запрос, хотя чаще всего это так; однако ни в коем случае сообщение не может быть возвращено в соединении, принадлежащем другой сессии). При использовании UDP-протокола может случиться, что ответ на запрос приходит не с того IP, на который был отправлен запрос.
Сообщения бывают нескольких типов:
RPC-вызовы (от клиента к серверу) — обращения к методам API
RPC-результаты (от сервера к клиенту) — результаты RPC-вызовов, подтверждение приема сообщений (вернее, уведомление о состоянии набора сообщений)
2.3 Запрос состояния сообщений
Составное сообщение или контейнер (контейнер, содержащий несколько сообщений; нужен, например, чтобы по HTTP-соединению можно было отправить несколько RPC-вызовов сразу; кроме того, контейнер может поддерживать gzip).
С точки зрения протоколов более низкого уровня, сообщение - это поток двоичных данных, выровненный по границе 4 или 16 байтов. Первые несколько полей сообщения фиксированы и используются системой криптографии/авторизации.
Каждое сообщение, отдельное или внутри контейнера, состоит из идентификатора сообщения (64 бита; см. ниже), порядкового номера сообщения в сессии (32 бита), длины (тела в байтах; 32 бита) и тела (любой размер, кратный 4 байтам). Кроме того, при отправке контейнера или одиночного сообщения, в его начало дописывается внутренний заголовок (см. ниже), после чего все это шифруется, и в начало зашифрованного сообщения добавляется внешний заголовок (64-битный идентификатор ключа и 128-битный ключ сообщения).
Тело сообщения обычно состоит из 32-битного типа сообщения, за которым следуют параметры, зависящие от типа. В частности, каждой RPC-функции соответствует свой тип сообщения. Более подробно см. Двоичная сериализация данных, Мобильный протокол: служебные сообщения.
Все числа записываются как little-endian. Однако очень большие числа (2048-битные), используемые в RSA и DH, записываются как big-endian, потому что так делает библиотека OpenSSL.
