NkSIP is an Erlang SIP framework or application server, which greatly facilitates the development of robust and scalable server-side SIP applications like proxy, registrar, redirect or outbound servers, B2BUAs, SBCs or load generators. NkSIP takes care of much of the SIP complexity, while allowing full access to requests and responses.
IMPORTANT - See the ROADMAP UPDATE for information on the future of NkSIP - IMPORTANT
A single NkSIP instance can start any number of SIP Applications or SipApps, each one listening on a specific set of transports (udp, tcp, tls, sctp, ws or wss), ip addresses and ports. Each SipApp must provide a callback module where it can implement a number of callback functions. All of them are optional, having sane defaults in case they are not implemented.
NkSIP also includes a powerful plugin mechanism, that can be used to modify its behaviour without having to fully understand or modify the core engine, and with virtually zero overhead, even if the SipApp uses a large number of plugins.
NkSIP is very stable and robust. Thanks to its Erlang roots it can perform many actions while running: starting and stopping SipApps, hot code upgrades, configuration changes and even updating your application behavior, used plugins and function callbacks on the fly.
NkSIP scales automatically using all of the available cores on the machine. Using common hardware (4-core i7 MacMini), it is easy to get more than 3.000 call cycles (INVITE-ACK-BYE) or 10.000 registrations per second. On the roadmap there is a fully distributed version, based on Riak Core, that will allow you to add and remove nodes while running, scale as much as needed and offer a very high availability, all of it without changing your application.
- Full support for all curently defined SIP methods: INVITE, ACK, REGISTER, OPTIONS, INFO, UPDATE, PRACK, SUBSCRIBE, NOTIFY, REFER, PUBLISH and MESSAGE, as an UAC, an UAS or a Proxy.
- Can be used to develop very easily any possible SIP application: endpoints, stateful proxies with serial and parallel forking, stateless proxies, B2BUAs, application servers, registrars, SBCs, load generators, etc.
- Transports UDP, TCP, TLS, SCTP, WS and WSS (websockets) are available, all of them capable of handling thousands of simultaneous sessions.
- Full SIP Event support.
- A written from scratch, fully typed 100% Erlang code with few external dependencies.
- Robust and highly scalable, using all available processor cores automatically.
- More than 150 tests covering nearly all of the functionality.
- Sophisticated plugin mechanism, that adds very low overhead to the core.
- Hot, on-the-fly core and application configuration and code upgrades.
- IPv6 support and IPv4 <-> IPv6 bridge.
- Full support for NAPTR and SRV location, including priority and weights.
- Dialog and SDP processing utility functions, including media start and stop detection.
- Digest Authentication.
- Registrar Server and Automatic Registrations.
- Event State Compositor.
- Reliable provisional responses.
- Session Timers
- SIP REFER.
- Outbound and GRUU.
- Trace and Statistics.
1. User Guide
2. Reference Guide
3. API Guide
4. Standard Plugins
5. Cookbook
6. Sample Applications
7. Advanced Concepts
8. Roadmap
9. Changelog
10. Presentations
NkSIP has been tested on OSX and Linux, using Erlang R15B03, R16B03 and 17.1
> git clone https://github.com/kalta/nksip
> cd nksip
> make
> make tests
Now you can start a simple SipApp using the included default callback module:
> make shell
1> nksip:start(test1, nksip_sipapp, [], []).
{ok,b746wle}
2> nksip_uac:options(test1, "sip:sip2sip.info", []).
{ok,200,[]}
From this point you can read the tutorial or start hacking with the included nksip_pbx application:
> make pbx
1> nksip_pbx:start().
You could also perform a heavy-load test using the included application nksip_loadtest:
> make loadtest
1> nksip_loadtest:full().
Please contribute with code, bug fixes, documentation fixes, testing with SIP devices or any other form. Use GitHub Issues and Pull Requests, forking this repository.