Какой SIP-сервер выбрать: SER, OpenSER, Kamailio, OpenSIPS? Что в них общего и в чем разница? / Хабрахабр

У многих администраторов voip-сетей, сталкивающихся с sip-серверами слова ser, openser, kamailio, opensips вызывают по меньшей мере головокружение. Почему их так много? Почему так похожи? Какие активно развиваются, а какие уже нет? Какой в конце-концов выбрать?
 
Давайте обратимся к истории.
 
1995 год. Берлин, Германия. Группа бывших студентов профессора Henning Schulzrinne, одного из авторов технологии SIP, занимается исследованиями в области VoIP в рамках Fraunhofer Fokus, независимоой исследовательской организации в области телекоммуникаций при университете Fraunhofer. Рабочая группы во главе с Dorgham Sisalem публикует научные статьи, описывающие экспериментальную реализацию SIP и рекомендации для первых промышленных разработчиков этой технологии.
 
1996 год. Henning Schulzrinne и Mark Handley разрабатывают окончательную спецификацию SIP-протокола.
 
Март 1999 года. Первый стандарт sip-протокол принят и опубликован в RFC2543.
 
2001 год. Andrei Pelinescu написал первые строки SIP Express Router (SER). В то время им была реализована функция маршрутизации по принципу первого найденного маршрута в таблице, которая в скором времени была заменена на скриптовый язык SER. Также был добавлен интерфейс поддержки модулей для возможности быстрого добавления новых функций. Результаты были представлены на специально созданном для этих целей сайте iptel.org
 
C 2001 по 2003 год к проекту подключаются новые люди, на тот момент студенты. Разработкой модулей для SER занимаются Alex Hoffmann, Bogdan-Andrei Iancu, Daniel-Constantin Mierla, Jan Janak. Raphael Coeffic, Uli Abend и Stephan Sayer разрабатывают SIP Express Media Server. Nils Ohlmeier разрабатывает утилиту диагностики SIP-протокола SipSak. Karel Kozlik занимается разработкой web-интерфейса.
 
Сентябрь 2002 года. SER выходит в свободное плавание, его выпускают под лицензией GPL.
 
14 июня 2005 года. От проекта отделяется два центральных разработчика — Bogdan-Andrei Iancu и Daniel-Constantin Mierla. Совместно с Elena-Ramona Modroiu они образуют новый проект, OpenSER.
 
28 июля 2008 года проект переименовывается в Kamailio из-за конфликта с торговой маркой.
 
24 августа 2008. В результате конфликта между разработчиками, от Kamailio отделяется Bogdan-Andrei Iancu, который образует новый проект — Opensips.
 
04 ноября 2008. Происходит слияние проекта Kamailio с первоначальным SER.
 
 
 
 
Итак, на сегодня, август 2012 года, мы имеем два активно развивающихся проекта: Kamailio (или SIP router) и OpenSIPS.
 
Для начала давайте сравним некоторые статистические данные:
Параметр Kamailio OpenSIPS
Число коммитов за 2011 год 802 593
Число коммитов за 2012 год (по август включительно) 1199 1015
Последняя (devel) версия 3.4 1.9
Число строк c-кода (без пустых и комментариев) 411940 228301
Количество модулей 145 117
Хочу обратить ваше внимание на то, что больше не значит лучше. А из данной таблицы мы можем сделать вывод о том, что оба проекта активно развиваются.
 
Следующее, что можно сравнить — это модули. Какие-то из них одинаковые, какие-то разные. Модули с одинаковыми названиями зачастую происходят от одних и тех же модулей раннего kamailio, но за столько лет многие функции могут различаться параметрами или названиями. Нижеприведенные данные не могут претендовать на объективность, я лишь попытался поверхностно сравнить то, что есть в одном sip-сервере, и чего нет в другом.
Kamailio общие OpenSIPS
Аккаунтинг и аутентификация
Radius
ACC_RADIUS
 
Accounting module for RADIUS backend
 
AUTH_RADIUS
 
RADIUS-backend authentication module
 
MISC_RADIUS
 
Generic RADIUS functions, replaces avp_radius, uri_radius and group_radius
 
AAA_RADIUS
 
RADIUS backend for the AAA API
 
AUTH_AAA
 
AAA-backend authentication module
 
Diameter
CDP
 
C Diameter Peer — core communication engine
 
CDP_AVP
 
C Diameter Peer — application extensions
 
AUTH_DIAMETER
 
DIAMETER-backend authentication module
 
Поддержка скриптов на других языках
Kamailio общие OpenSIPS
APP_LUA
 
Execute embedded Lua scripts
 
APP_MONO
 
Execute embedded managed code — C#, VisualBasic.NET, Java, Java Script
 
APP_PYTHON
 
Execute embedded Python scripts
 
PERL
 
embed execution of Perl function
 
CPL-C
 
CPL interpreter module
 
LUA
 
Call LUA scripts from OpenSIPS cfg
 
PYTHON
 
Python scripting support
 
Базы данных, включая nosql
Kamailio общие OpenSIPS
DB_CASSANDRA
 
Cassandra database server connector
 
DB_CLUSTER
 
Generic database connectors clustering
 
DB_SQLITE
 
SQLITE-backend for database API module
 
HTABLE
 
Generich Hash Table container in shared memory
 
MATRIX
 
Matrix operations
 
MEMCACHED
 
Memcached connector module
 
NDB_REDIS
 
Connector to REDIS NoSQL Database engine
 
DB_BERKELEY
 
Berkeley DB driver for DB API
 
DB_FLATSTORE
 
Fast writing-only text-backend for database module
 
DB_MYSQL
 
MYSQL-backend for database API module
 
DB_ORACLE
 
ORACLE-backend for database API module
 
DB_POSTGRES
 
POSTGRES-backend for database API module
 
DB_TEXT
 
Text-backend for database API module
 
DB_UNIXODBC
 
unixODBC driver module
 
LDAP
 
LDAP connector
 
PERLVDB
 
Perl Virtual Database engine
 
CACHEDB_CASSANDRA
 
Cassandra Implementation of CacheDB
 
CACHEDB_LOCAL
 
Local Implementation of CacheDB
 
CACHEDB_MEMCACHED
 
Memcached Implementation of CacheDB
 
CACHEDB_REDIS
 
Redis Implementation of CacheDB
 
DB_HTTP
 
HTTP-backend for DB API
 
DB_VIRTUAL
 
Middle-layer DB mixer
 
* в opensips помимо DB API добавился CACHEDB API, что систематизирует работу с nosql-бэкэндами.
Поддержка черных списков
Kamailio общие
BLST
 
Blacklisting API for config
 
USERBLACKLIST
 
User black/white listing
 
Механизмы management interface
Kamailio общие OpenSIPS
MI_RPC
 
RPC support for Management Interface
 
MI_DATAGRAM
 
DATAGRAM (unix and network) support for Management Interface
 
MI_FIFO
 
FIFO support for Management Interface
 
MI_XMLRPC
 
XMLRPC support for Management Interface
 
MI_HTTP — HTTP support for Management Interface
 
Механизм PRESENCE
Kamailio общие OpenSIPS
PRESENCE_CONFERENCE
 
Extension to Presence server for conference events handling
 
PRESENCE_PROFILE
 
Presence server module — user profile extensions — RFC6080
 
PRESENCE_REGINFO
 
Extension to Presence server for registration info replication (RFC3680)
 
PUA_REGINFO
 
Extension to PUA server for registration info replication (RFC3680)
 
PRESENCE
 
Presence server module — common API
 
PRESENCE_DIALOGINFO
 
Extension to Presence server for Dialog Info
 
PRESENCE_MWI
 
Extension to Presence server for Message Waiting Indication
 
PRESENCE_XML
 
Presence server module — presence & watcher info and XCAP
 
PUA
 
Common API for presence user agent client
 
PUA_BLA
 
BLA extension for PUA
 
PUA_DIALOGINFO
 
Dialog-Info extension for PUA
 
PUA_MI
 
MI extension for PUA
 
PUA_USRLOC
 
USRLOC extension for PUA
 
PUA_XMPP
 
XMPP extension for PUA (SIMPLE-XMPP presence gateway)
 
PRESENCE_CALLINFO
 
Extension to Presence server for Call-Info
 
PRESENCE_XCAPDIFF
 
Extension to Presence server for XCAP-DIFF event
 
Поддержка XCAP
Kamailio общие
XCAP_SERVER
 
XCAP server implementation
 
XCAP_CLIENT
 
XCAP client implementation
 
Функции TLS
Kamailio OpenSIPS
TLS
 
TLS operations module
 
TLSOPS
 
TLS operations module
 
Скрытие топологии, поддержка B2B
Kamailio OpenSIPS
TOPOH
 
Topology hiding module
 
B2B_ENTITIES
 
Back-to-Back User Agent Entities
 
B2B_LOGIC
 
Back-to-Back User Agent Logic
 
MANGLER
 
SIP mangler module
 
* kamailio не поддерживает b2b, у opensips функция скрытия топологии встроена в модуль DIALOG
Поддержка RPC
Kamailio
CTL
 
Control connector for RPC interface (fifo, unixsock, tcp, udp)
 
JSONRPC-C
 
JSON-RPC client over netstrings protocol
 
MI_RPC
 
RPC support for Management Interface
 
XHTTP
 
Basic HTTP request handling server
 
XHTTP_RPC
 
RPC commands handling over HTTP
 
XMLRPC
 
XMLRPC connector for RPC interface
 
Маршрутизация звонков, LCR, балансировка
Kamailio общие OpenSIPS
LCR
 
Least Cost Routing module
 
PREFIX_ROUTE
 
Execute config file route blocks based on prefix
 
CARRIERROUTE
 
routing extension suitable for carriers
 
CALL_CONTROL
 
PrePaid application module
 
DIALPLAN
 
Dialplan management
 
DISPATCHER
 
Dispatcher module
 
DROUTING
 
Dynamic Routing / LCR
 
PDT
 
Prefix-to-Domain translator module
 
CLOSEDDIAL
 
PBX-like dialling features
 
LOAD_BALANCER
 
Load Balancer (for calls) module
 
Различные уникальные функции
Kamailio OpenSIPS
ASYNC
 
Asynchronous SIP request handling functions
 
DEBUGGER
 
Interactive config debugger
 
DMQ
 
Distributed Message Queue System using SIP
 
IPTRTPPROXY
 
NAT traversal module using kernel for media relay
 
MQUEUE
 
Message queue system for config file
 
MTREE
 
Generic memory caching system using tree indexes
 
PDB
 
Number portability module
 
P_USRLOC
 
Partitioned and distributed user location services
 
PIPELIMIT
 
Traffic shaping policies
 
PURPLE
 
Multi-protocol gateway using Purple library
 
RTIMER
 
Execute config route blocks on timer basis
 
TMREC
 
Match time recurrences defined based on RFC2445
 
XMLOPS
 
XML operations in config file using XPATH
 
DNS_CACHE
 
Module for caching DNS records that can be used with any Key-Value back-end
 
EVENT_DATAGRAM
 
Event datagram module
 
EVENT_RABBITMQ
 
Event RabbitMQ client module
 
HTTPD
 
Embedded HTTP server
 
IDENTITY
 
SIP Identity implementation
 
OPTIONS
 
OPTIONS server replier module
 
SIGNALING
 
SIP signaling module
 
STUN
 
Built-in STUN server
 
UAC_AUTH
 
UAC Authentication functionality
 
UAC_REGISTRANT
 
SIP Registrant implementation module
 
Модули, дублирующие функционал конкурента или имеющие функции, включенные в ядро
Kamailio OpenSIPS
COUNTERS
 
Internal counter API for config
 
IPOPS
 
IP and DNS related operations for configuration file
 
KEX
 
Kamailio core extensions module
 
PV
 
Module holding Pseudo-Variables
 
SANITY
 
SIP message formatting sanity checks
 
SDPOPS
 
SDP operations
 
SIPUTILS
 
SIP utilities
 
SQLOPS
 
SQL operations
 
TEXTOPSX
 
Extra text operations
 
TMX
 
Transaction management extenstions module
 
URI_DB
 
URI operation with database support module
 
UTILS
 
A set of useful functions
 
GFLAGS
 
Global shared flags module
 
SIPMSGOPS
 
SIP operations module
 
URI
 
Generic URI operation module
 
XLOG
 
Advanced logger module
 
Общие модули (в первую очередь по названию, могут сильно отличаться по функциям)
ALIAS_DB
 
Database SIP aliases module
 
AVPOPS
 
AVP operation module
 
BENCHMARK
 
Config file benchmarking
 
CFGUTILS
 
Different config utilities
 
DIALOG
 
Dialog support module
 
DIVERSION
 
Diversion header insertion module
 
DOMAIN
 
Multi-domain support module
 
DOMAINPOLICY
 
Policies to connect federations
 
ENUM
 
ENUM lookup module
 
EXEC
 
External exec module
 
GROUP
 
User-groups module with DB-backend
 
H350
 
H350 implementation
 
IMC
 
Instant Messaging Conferencing module
 
JABBER
 
JABBER IM and PRESENCE interconnection module
 
JSON
 
JSON packing function
 
MAXFWD
 
Max-Forward processor module
 
MEDIAPROXY
 
NAT traversal module
 
MSILO
 
SIP message silo module
 
NATHELPER
 
NAT traversal helper module
 
NAT_TRAVERSAL
 
NAT traversal module
 
OSP
 
OSP peering module
 
PATH
 
Path support for SIP frontending
 
PEERING
 
Radius peering module
 
PERMISSIONS
 
Permissions control module
 
PIKE
 
Flood detector module
 
QOS
 
QOS (RTP) module
 
RATELIMIT
 
SIP traffic shaping module
 
REGEX
 
RegExp via PCRE library
 
REGISTRAR
 
SIP Registrar implementation module
 
RLS
 
Resource List Server implementation
 
RR
 
Record-Route and Route module
 
RTPPROXY
 
NAT traversal using RTPProxy module
 
SEAS
 
Sip Express Application Server (interface module)
 
SIPCAPTURE
 
SipCapture module
 
SIPTRACE
 
SipTrace module
 
SL
 
Stateless replier module
 
SMS
 
SIP-to-SMS IM gateway module
 
SNMPStats
 
SNMP interface for statistics module
 
SPEEDDIAL
 
Per-user speed-dial controller module
 
SST
 
SIP Session Timer support
 
STATISTICS
 
Script statistics support
 
TEXTOPS
 
Text operations module
 
TM
 
Transaction (stateful) module
 
UAC
 
UAC functionalies (FROM mangling and UAC auth)
 
UAC_REDIRECT
 
UAC redirection functionality
 
USRLOC
 
User location implementation module
 
XMPP
 
SIP-to-XMPP Gateway (SIP to Jabber/Google Talk)
 
Многие функции дублируются разными модулями, но в каждом сервере есть и свои уникальные черты. Каждый из серверов в той или иной степени может вам больше подойти по каким-то параметрам.
 
А что дальше?
 
kamailio продолжает развитие текущего sip-сервера.
В тоже время opensips работают над версией 2.0, которая будет принципиально отличаться по архитектуре. По мнению разработчиков, старый дизайн не может решить некоторые проблемы. Новый сервер планируется полностью асинхронным, что поможет устранить, к примеру, архитектурный недочёт с блокировками при обработке tcp-соединений.
 
Планируемая архитектура представляет из себя несколько последовательных уровней.
 
Самый низкий уровень — ядро. Оно отвечает за sip-функционал, который может быть выполнен автоматически, без конфигурации.
 
Следующий уровень — маршрутизация. В ней будет реализован функционал, близкий к тому, который сейчас используется для маршрутизации в opensips.

И последний уровень — уровень приложений. С его помощью можно будет выполнять операции на самом высоком уровне, используя языки такие, как python.

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

Первый альфа-релиз OpenSIPS 2.0 уже выпущен и я с нетерпением жду полноценного релиза, т.к. предложенная разработчиками архитектура должна помочь решить некоторые наболевшие проблемы, которые не в состоянии решить ни kamailio, ни opensips сегодня.
 
В данный момент лично я выбираю opensips, т.к. на мой взгляд у разработчиков более системный подход к организации модулей и введению api в случаях, когда это необходимо. А также из-за наличия в opensips cachedb api, B2B и встроенного STUN-сервера.
 

Но повторюсь, это лишь мое личное мнение, оно субъективно и, возможно, для ваших задач больше будет подходить другой сервер. В любом случае, надеюсь, что эта статья хоть немного прольет свет на отличия двух серверов тем, кто не может или не хочет с этим разбираться.

Получите бесплатную консультацию

Мы очень любим общаться и не жалеем на это времени.
Напишите нам - задайте интересующий Вас вопрос, поделитесь идеей.
Мы постараемся ответить Вам как можно быстрее.
Каждое сообщение директор читает лично.