IP Multimedia Subsystem
---
title: Architecture
---
architecture-beta
service test(server)[test]
service smf(server)[SMF]
service upf(server)[UPF]
service hss(server)[HSS]
service pcrf(server)[PCRF]
service pcscf(server)[PCSCF]
service icscf(server)[ICSCF]
service scscf(server)[SCSCF]
service rtp(server)[rtpengine]
service ocs(server)[OCS]
junction Mw
test:T -- L:smf
test:R -- L:upf
smf:B -- T:upf
smf:R -- L:pcrf
pcrf:B -- T:pcscf
upf:R -- L:pcscf
upf:B -- L:rtp
icscf:R -- L:hss
scscf:T -- B:hss
scscf:R -- L:ocs
pcscf:R -- L:Mw
icscf:B -- T:Mw
scscf:L -- R:Mw
scscf:B -- R:rtp
Why the setup?
- provide entirely software based playground for testing
- delve a bit deeper into the open source components configuration and documenting the process
- make simple and clean solution utilizing compose features like interpolation
- create helm charts for Kubernetes installation
As the setup loads and uses kernel module, best to test in VM
docker compose --profile test up -d
For always up to date commands, check out CI configuration
To swap the HSS (and the mongo / subscriber-seed / DRA machinery behind it) for the
pro2call Cx emulator — no provisioning, any IMSI, so load lands on the
CSCF chain instead — point $CORE at stub.yml
CORE=stub.yml docker compose up -d --remove-orphans
To observe the packets
wireshark -i any --display-filter 'gtpv2 or sip or diameter.cmd.code != 280'
To capture instead, with the container and process behind every packet recorded in the file, and to browse the result without leaving the browser
docker compose --profile debug up -d pcap webshark
docker compose stop pcap
webshark carries a Lua plugin that relates SIP to Diameter by subscriber, so one display filter covers a registration and the Cx exchange behind it
ims.id == "001010000000001"
and, because the plugin learns each subscriber's IMPI/IMPU binding out of the
registration, the same frames come back under any of that subscriber's names —
ims.impi == "001010000000001" and ims.impu == "359000000001" alike
and its Flow button draws that filtered set as Wireshark's flow graph — the
whole registration as one sequence diagram, UE to HSS. Rows are coloured by the
reference point they are on, Gm and Mw through Cx, Rx, Gx and Ro, with a failure
in red over the top of it. Gm is included even though
IPsec protects it: the ESP keys of every registration are in the capture, so
webshark takes them out of it and reads the protected traffic as the SIP it is.
See Tracing for what each of those gives you.
- SIP RFC 3261
- SDP RFC 8866
- RTP RFC 1889
- IMS
- Diameter Cx / SBA N70 TS 29.562
- Diameter Rx TS 29.214 / SBA N5 TS 29.514
- Diameter Ro/Rf
- SMS TS 24.341
- Emergency TS 23.167
- IMS (compose.yml)
- CSCF
- Proxy
- Interrogating
- Serving
- DB
- rtpengine
- DNS
- ENUM — a dialled number translated to a SIP URI, off-range numbers broken out to a trunk (session flow)
- CSCF
- Core Network (core.yml)
- Billing (billing.yml)
- Monitoring (monitor.yml)
- Fluent Bit
- Loki
- cAdvisor
- Prometheus
- Alertmanager
- Grafana
- Capture (monitor.yml,
debugprofile, doc)- tcpdump
- webshark
-
ims.lua— SIP and Diameter under one filter
- Testing (compose.yml,
testprofile)- pro2call — S5/S8 attach, IMS-AKA registration, calls, SMS