Одноранговые короткие сообщения - Википедия - Short Message Peer-to-Peer

Одноранговая передача коротких сообщений (SMPP) в телекоммуникационной отрасли - это открытый отраслевой стандартный протокол, предназначенный для обеспечения гибкого интерфейса передачи данных для передачи короткое сообщение[1] данные между Внешние объекты обмена короткими сообщениями (ESME), объекты маршрутизации (RE) и SMSC.[2]

SMPP часто используется, чтобы позволить третьим сторонам (например, поставщики дополнительных услуг например, новостные организации) для отправки сообщений, часто массово, но его также можно использовать для пиринга по SMS. SMPP может нести короткие сообщения включая EMS, голосовая почта уведомления, Сотовые трансляции, WAP сообщения, включая WAP Push сообщения (используется для доставки MMS уведомления), USSD сообщения и другие. Благодаря своей универсальности и поддержке не-GSM SMS-протоколы, например UMTS, ИС-95 (CDMA), CDMA2000, ANSI-136 (TDMA) и iDEN, SMPP - наиболее часто используемый протокол для обмена короткими сообщениями за пределами SS7 сети.

История

SMPP (Short Message Peer-to-Peer) был первоначально разработан Aldiscon, маленький Ирландский компания, которая позже была приобретена Логика (с 2016 г., после ряда изменений Mavenir ). Первоначально протокол был создан разработчиком Яном Дж. Чемберсом для тестирования функциональности SMSC без использования испытательного оборудования SS7 для отправки сообщений. В 1999 году Logica официально передала SMPP Форуму разработчиков SMPP, который позже был переименован в SMS Forum, а сейчас распущен. Спецификации протокола SMPP по-прежнему доступны через веб-сайт, на котором также есть уведомление о том, что он будет удален в конце 2007 года. В соответствии с первоначальными условиями передачи права собственности на SMPP теперь вернулись к Mavenir из-за расформирования SMS. Форум.

На сегодняшний день развитие SMPP приостановлено, а SMS Forum расформирован. С сайта SMS-форума:

31 июля 2007 г. - SMS Forum, некоммерческая организация, миссия которой заключается в разработке, продвижении и продвижении SMS (службы коротких сообщений) на благо глобальной беспроводной индустрии, распускается к 27 июля 2007 г.

В пресс-релизе, приложенном к новости, также предупреждается, что работа сайта скоро будет приостановлена. Несмотря на это, сайт по-прежнему в основном функционирует, и спецификации все еще можно загрузить (по состоянию на 31 января 2012 г.).

Операция

Вопреки своему названию, SMPP использует клиент-серверная модель операции. В Центр обслуживания коротких сообщений (SMSC) обычно действует как сервер, ожидая соединений от ESME. Когда SMPP используется для пиринга SMS, отправляющий MC обычно действует как клиент.

Протокол основан на парах PDU запроса / ответа (блоки данных протокола, или пакеты) обменивались OSI слой 4 (TCP сессия или X.25 SVC3) соединения. В известный порт назначенный IANA для СМПП при эксплуатации TCP - 2775, но в средах обмена сообщениями часто используются несколько произвольных номеров портов.

Перед обменом какими-либо сообщениями необходимо отправить и подтвердить команду привязки. Команда bind определяет, в каком направлении можно будет отправлять сообщения; bind_transmitter только позволяет клиенту отправлять сообщения на сервер, bind_receiver означает, что клиент будет только получать сообщения, а bind_transceiver (представленный в SMPP 3.4) разрешает передачу сообщений в обоих направлениях. В команде bind ESME идентифицирует себя с помощью system_id, system_type и пароля; поле address_range, предназначенное для хранения адреса ESME, обычно остается пустым. Команда bind содержит параметр interface_version, чтобы указать, какая версия протокола SMPP будет использоваться.

Обмен сообщениями может быть синхронным, когда каждый одноранговый узел ожидает ответа для каждого отправляемого PDU, или асинхронным, когда несколько запросов могут быть отправлены без ожидания и подтверждены в асинхронном порядке другим одноранговым узлом; количество неподтвержденных запросов называется окно; для лучшей производительности обе стороны связи должны быть настроены с одинаковым размером окна.

Версии

Стандарт SMPP со временем эволюционировал. Наиболее часто используемые версии SMPP:

  • SMPP 3.3 самая старая используемая версия (несмотря на ее ограничения, она все еще широко используется); поддерживает GSM Только. Создает немедленный ответ на каждое отправленное сообщение.
  • SMPP 3.4 добавляет необязательный Tag-Length-Value (TLV), поддержка не-GSM SMS-технологий и трансивер поддержка (одиночные соединения, которые могут отправлять и получать сообщения). Обмен PDU запроса и ответа SMPP между передатчиком ESME и SMSC может происходить синхронно или асинхронно.
  • SMPP 5.0 - последняя версия SMPP; добавляет поддержку сотового вещания, интеллектуальное управление потоком. По состоянию на 2019 год широко не используется.

Применимая версия передается в параметре interface_version команды bind.

Формат PDU (после версии 3.4)

PDU SMPP: двоично закодированный для эффективности. Они начинаются с заголовка, за которым может следовать тело:

SMPP PDU
Заголовок PDU (обязательно)Корпус PDU (дополнительно)
Команда
длина
Команда
Идентификатор
Команда
Положение дел
Последовательность
Число
Корпус PDU
4 октетаДлина = (значение длины команды - 4) октета

Заголовок PDU

Каждый PDU начинается с заголовка. Заголовок состоит из 4 полей, каждое из которых имеет длину 4 октета:

command_length
Общая длина PDU в октетах (включая само поле command_length); должно быть ≥ 16, поскольку каждый PDU должен содержать заголовок из 16 октетов
command_id
Обозначает операцию (или команду) SMPP. Если старший бит очищен, это операция запроса. В противном случае это ответ.
command_status
В запросах всегда имеет значение 0; в ответах несет информацию о результате операции
порядковый номер
Используется для сопоставления запросов и ответов в рамках сеанса SMPP; позволяет асинхронную связь (используя раздвижное окно метод)

Все числовые поля в SMPP используют прямой порядок байтов порядок, что означает, что первый октет является старшим значащим байтом (MSB).

Пример

Это пример двоичного кодирования 60-октета. submit_sm PDU. Данные отображаются в шестнадцатеричном формате. октет значения в виде единого дампа, за которым следует разбивка заголовка и тела этого PDU.

Это лучше всего сравнить с определением PDU submit_sm из спецификации SMPP, чтобы понять, как кодировка соответствует полю по определению поля.

Разбивка значений показана с десятичными числами в скобках и шестнадцатеричными значениями после них. Если вы видите один или несколько добавленных шестнадцатеричных октетов, это связано с тем, что для данного размера поля используется кодирование 1 или более октетов.

Опять же, чтение определения PDU submit_sm из спецификации сделает все это более ясным.

Заголовок PDU

'command_length', (60) ... 00 00 00 3C'command_id ', (4) ... 00 00 00 04'command_status', (0) ... 00 00 00 00'sequence_number ', (5). .. 00 00 00 05

Корпус PDU

'service_type', () ... 00'source_addr_ton ', (2) ... 02'source_addr_npi ', (8) ... 08'source_addr', (555) ... 35 35 35 00'dest_addr_ton ', (1) ... 01'dest_addr_npi ', (1) ... 01'dest_addr', (555555555) ... 35 35 35 35 35 35 35 35 35 00'esm_class ', (0) ... 00'protocol_id', (0) ... 00'priority_flag ', (0) ... 00'schedule_delivery_time', (0) ... 00'validity_period ', (0) ... 00'registered_delivery', (0) ... 00'replace_if_present_flag ', ( 0) ... 00'data_coding ', (3) ... 03'sm_default_msg_id', (0) ... 00'sm_length ', (15) ... 0F'short_message', (Привет, Википедия) ... 48 65 6C 6C 6F 20 57 69 6B 69 70 65 64 69 61

Обратите внимание, что текст в поле short_message должен соответствовать data_coding. Когда data_coding равно 8 (UCS2), текст должен быть в UCS-2BE (или его расширении, UTF-16BE ). Когда data_coding указывает 7-битное кодирование, каждый септет сохраняется в отдельном октете в поле short_message (со старшим битом, установленным в 0). SMPP 3.3 data_coding точно скопировал значения TP-DCS из GSM 03.38, что делает его пригодным только для 7-битного алфавита GSM по умолчанию, UCS2 или двоичных сообщений; SMPP 3.4 представил новый список значений data_coding:

data_codingСмысл
0Алфавит SMSC по умолчанию (SMPP 3.4) / зависит от MC (SMPP 5.0)
1IA5 (CCITT T.50 )/ASCII (ANSI X3.4)
2Неуказанный октет (8-битный двоичный)
3Латиница 1 (ISO-8859-1 )
4Неуказанный октет (8-битный двоичный)
5JIS (Х 0208-1990 )
6Кириллица (ISO-8859-5 )
7Латинский / иврит (ISO-8859-8 )
8UCS2 (ISO / IEC-10646 )
9Кодирование пиктограмм
10ISO-2022-JP (Музыкальные коды)
11Зарезервированный
12Зарезервированный
13Расширенные кандзи JIS (X 0212-1990)
14KS C 5601
15-191зарезервированный
192-207Управление GSM MWI - см. GSM 03.38
208-223Управление GSM MWI - см. GSM 03.38
224-239зарезервированный
240-255Контроль класса сообщений GSM - см. GSM 03.38

Смысл data_coding = 4 или же 8 то же, что и в SMPP 3.3. Остальные значения в диапазоне 1-15 зарезервированы в SMPP 3.3. К сожалению, в отличие от SMPP 3.3, где data_coding = 0 однозначно был 7-битным алфавитом по умолчанию GSM, для SMPP 3.4 и выше 7-битный алфавит GSM по умолчанию отсутствует в этом списке, и data_coding = 0 может отличаться для разных Центры службы коротких сообщений - это может быть ISO-8859-1, ASCII, 7-битный алфавит GSM по умолчанию, UTF-8 или даже настраиваемый для каждого ESME. Когда используешь data_coding = 0, обе стороны (ESME и SMSC) должны быть уверены, что они считают это одной и той же кодировкой. В противном случае лучше не использовать data_coding = 0. Может быть сложно использовать 7-битный алфавит GSM по умолчанию, некоторые Центры службы коротких сообщений требует data_coding = 0, другие например data_coding = 241.

Причуды

Несмотря на широкое распространение, SMPP имеет ряд проблемных особенностей:

  • Нет data_coding для GSM 7-битный алфавит по умолчанию
  • Нестандартное значение data_coding = 0
  • Непонятная поддержка кодировки Shift-JIS
  • Несовместимость submit_sm_resp между версиями SMPP
  • Использование SMPP 3.3 SMSC Delivery Receipts, особенно формата Message Id в них

Нет data_coding для 7-битного алфавита GSM по умолчанию

Хотя значение data_coding в SMPP 3.3 основано на GSM 03.38, начиная с SMPP 3.4 нет значения data_coding для 7-битного алфавита GSM (GSM 03.38 ). Однако обычно DCS = 0 указывает на 7-битный алфавит GSM, особенно для SMPP-соединений с SMSC в мобильных сетях GSM.

Нестандартное значение data_coding = 0

Согласно SMPP 3.4 и 5.0 data_coding = 0 означает «Алфавит SMSC по умолчанию». Какая это кодировка на самом деле, зависит от типа SMSC и его конфигурации.

Непонятная поддержка кодировки Shift-JIS

Одна из кодировок в стандарте CDMA C.R1001 - Shift-JIS используется для японского языка. SMPP 3.4 и 5.0 определяет три кодировки для японского языка (JIS, ISO-2022-JP и Extended Kanji JIS), но ни одна из них не идентична CDMA MSG_ENCODING 00101. Кажется, что кодировка пиктограммы (data_coding = 9) используется для передачи сообщения в Shift-JIS в SMPP.

Несовместимость submit_sm_resp между версиями SMPP

Когда submit_sm терпит неудачу, SMSC возвращает submit_sm_resp с ненулевым значением command_status и ″ пустым ″ message_id.

  • SMPP 3.3 прямо заявляет о поле message_id ″ В случае отсутствия это поле должно содержать единственный байт NULL ″. Длина PDU составляет не менее 17 октетов.
  • SMPP 3.4 содержит неудачную заметку в SUBMIT_SM_RESP раздел ″ submit_sm_resp PDU Body не возвращается, если command_status поле содержит ненулевое значение. ″ Тогда длина PDU составляет 16 октетов.
  • SMPP 5.0 просто указывает, что message_id является обязательным параметром типа C-Octet string объекта submit_sm_resp сообщение. Согласно разделу 3.1.1 Настройки NULL, ″ NULL string ″ ″ кодируется как 0x00 ″. Длина PDU составляет не менее 17 октетов.

Для лучшей совместимости любая реализация SMPP должна принимать оба варианта отрицательного submit_sm_resp независимо от версии стандарта SMPP, используемого для связи.

Первоначальная цель сценариев ошибок заключалась в том, чтобы в ответ PDU не возвращалось тело. Это стандартное поведение, наблюдаемое на всех SMSC Aldiscon / Logica, а также у большинства других поставщиков. Когда SMPP 3.4 принимался форумом WAP, было запрошено несколько разъяснений относительно того, следует ли включать тело в ответ NACKed, и были приняты меры для разъяснения этого в нескольких местах спецификации, включая submit_sm раздел, а также в bind_transceiver раздел. Что нужно было сделать, так это добавить пояснение, которое мы в конечном итоге добавили в V5.0 ... что тела не должны включаться в сообщения об ошибках. Некоторые поставщики были очень глупыми в своих реализациях, включая тела на отклоненных bind_transmitter ответы, но не на bind_transceiver отзывы и т. д. Рекомендация, которую я бы сделал поставщикам ... как предложено выше ... примите оба варианта. Но также разумно позволить себе выпуск NACKed submit_sm_resp и delivery_sm_resp PDU с пустым корпусом и без него. В случае этих двух PDU это пустое тело будет выглядеть как единственный октет NULL в конце потока. Причина, по которой вам может потребоваться эта возможность для включения того, что я называю фиктивными телами с NACKed-запросами, заключается в том, что другая сторона уравнения может быть неспособна или не желает изменять свою реализацию, чтобы допустить отсутствие тела. (Я работал над тремя версиями спецификации SMPP в Aldiscon / Logica и разработал решение ESME для Openmind Networks)

— Кормак Лонг

Идентификатор сообщения в SMPP 3.3 квитанции о доставке SMSC

Единственный способ передать квитанции о доставке в SMPP 3.3 - это ввести информацию в текстовой форме в короткое сообщение поле; однако формат текста описан в Приложении B SMPP 3.4, хотя SMPP 3.4 может (и должен) использовать accept_message_id и message_state с целью. В то время как SMPP 3.3 утверждает, что идентификатор сообщения является строкой C-октета (Hex) длиной до 8 символов (плюс завершающий ' 0'), SMPP 3.4 утверждает, что поле id в формате квитанции о доставке является строкой C-октета ( Decimal) до 10 знаков. Это разделяет реализации SMPP на 2 группы:

  • Реализации, использующие десятичное представление целочисленного идентификатора сообщения в поле идентификатора тела квитанции о доставке и шестнадцатеричное представление целочисленного идентификатора сообщения в message_id и accept_message_id поля
  • Реализации, использующие одно и то же шестнадцатеричное число (или даже одну и ту же произвольную строку) как в message_id параметр и в поле id тела Delivery Receipt, что, строго говоря, нарушает стандарт SMPP

Расширяемость, совместимость и взаимодействие

С момента введения Tag-Length-Value (TLV) в версии 3.4, SMPP можно рассматривать как расширяемый протокол. Для достижения максимально возможной степени совместимости и совместимость любая реализация должна применяться в Интернете принцип устойчивости: ″ Будьте консервативны в том, что вы отправляете, будьте либеральны в том, что вы принимаете ″. Он должен использовать минимальный набор функций, необходимых для выполнения задачи. И если цель - общение, а не придирки, каждая реализация должна преодолевать незначительные несоответствия стандарту:

  • Ответьте generic_nack с command_status = 3 на любую нераспознанную команду SMPP, но не прекращайте обмен данными.
  • Игнорируйте любые нераспознанные, неожиданные или неподдерживаемые параметры TLV.
  • Границы PDU всегда задаются PDU. command_length поле. Любое поле сообщения не должно превышать конца PDU. Если поле не завершено должным образом, его следует рассматривать как усеченное в конце PDU, и это не должно влиять на дальнейшие PDU.

Информацию, применимую к одной версии SMPP, часто можно найти в другой версии SMPP, например, в случае SMPP 3.4, описывающего единственный механизм получения уведомлений о доставке в SMPP 3.3, описанный выше.

Безопасность

Протокол SMPP разработан на основе двоичного протокола с открытым текстом, который необходимо учитывать при использовании для потенциально конфиденциальной информации, такой как одноразовые пароли через SMS. Однако существуют реализации SMPP через безопасный SSL / TLS, если это необходимо.[3]

Смотрите также

Рекомендации

внешняя ссылка