网络协议:SIP
本文更新于2022-05-03。
基本概念
SIP(Session Initiation Protocol),即会话初始协议,是一个控制发起、修改和终结交互式多媒体会话的信令协议。
SIP是一个基于文本的协议,是一个对等的协议。
用户代理(User Agent,UA)是在SIP网络中发起或响应SIP处理的逻辑实体。UA是有状态的。UA有两种:UAC(UA Client)即发起SIP请求的一方,UAS(UA Server)即接受请求并发送响应的一方。
RFC
- RFC 2543:最早标准。https://datatracker.ietf.org/doc/rfc2543。
- RFC 3261:新的标准。https://datatracker.ietf.org/doc/rfc3261。
- RFC 4566:关于SDP。https://datatracker.ietf.org/doc/rfc4566。
- RFC 4579:关于会议。https://datatracker.ietf.org/doc/rfc4579。
SIP承载
任何SIP UA必需同时支持TCP和UDP承载。在需要对SIP加密的情况下,可以使用TLS承载。SIP over WebSocket使用WebSocket承载。
方法
请求消息都包括一个方法:
- ACK:有些响应消息需要确认,以完成三次握手。
- BYE:终止一个会话。
- CANCEL:取消一个等待处理或正在处理的请求。
- INFO:传送消息,如DTMF。
- INVITE:初始化一个会话,可以理解为发起一个呼叫。
- MESSAGE
- NOTIFY
- OPTIONS:查询服务器和能力,也可以用作ping测试。
- PRACK:对1xx消息的确认。
- REFFER:请求协商转。
- re-INVITE:请求盲转,收发传真。
- REGISTER:注册联系信息。
- SUBSCRIBE
- UPDATE
状态码
响应消息都包括一个状态码以及原因短语(Reason Phrase):
- 1xx:呼叫进展消息,临时状态,表示呼叫进展情况。
- 100 Trying:表示被呼方是已收到呼叫请求,需稍等。
- 180 Ringing:表示被呼方已经振铃,主呼方收到此消息后即可播放回铃声。
- 183 Progress:表示被呼方已经振铃,且被叫方会使用RTP发送回铃声给主叫方,即彩铃。
- 2xx:表示请求已被成功收到、理解、接受。
- 200 OK
- 3xx:重定向,表示SIP请求需要转到另一个UAS处理。
- 4xx:请求失败,一般是由客户端或网络引起的,客户端应该修改请求然后重发。
- 488 Not Acceptable Here:找不到兼容的编码。
- 5xx:服务器内部错误,表示服务器出错,不能响应合法的请求。
- 6xx:全局性错误。
- 600 Busy Everywhere
首部
- Allow:UA所能支持的功能。
- Allow-Events:允许的事件通知。
- Call-ID:用于区分不同会话的唯一标志。必需包含。
- Contact:联系地址。当其被叫时往该地址发送消息。
- Content-Length:消息正文的长度。
- CSeq:顺序号,用于在同一会话中区分事务。必需包含。
- Expires:注册的有效期,单位是秒。
- From:请求来源。必需包含。
- Max-Forwards:限制跳跃点数和最大转发次数。主要是为了防止产生死循环。必需包含。
- Reason:挂机原因。NORMAL_CLEARING表示正常释放。
- Refer-To:协商转的目标用户。
- Remote-Party-ID:来电显示的信息。
- To:请求接收方。必需包含。
- User-Agent:UA的型号。
- Via:描述消息经过的路径。如果经过多个代理服务器,则有多个头域。包含以下参数:rport为实际来源端口,received为实际来源IP。必需包含。
- Warning:说明问题原因。
SIP URI
SIP URI或AOR(Address of Record,用户的公开地址),格式为“协议:名称@主机”:
sip|sips:USERNAME@IP|DOMAIN[:PORT]
如:
+---------------------------+
| FreeSWITCH at 192.168.1.9 |
+---------------------------+
SIP URI: sip:Bob@192.168.1.9 | | SIP URI: sip:Alice@192.168.1.9
+----------------+ +-----------------+
| |
+----------------------------------+ +----------------------------------+
| Bob at 192.168.1.100 | | Alice at 192.168.1.200 |
| Contact: sip:Bob@192.168.1.100 | | Contact: sip:Alice@192.168.1.200 |
+----------------------------------+ +----------------------------------+
交互流程
注册
UAC UAS
|---------------REGISTER-------------->|
|<----------401 Unauthorized-----------|
|---------------REGISTER-------------->|
|<---------------200 OK----------------|
认证方式使用HTTP的摘要(Digest)认证。如认证失败,则回复非200的消息(如403 Forbidden)。
UA间直接呼叫
UAC UAS
|--------------INVITE (SDP)----------->|
|<-------------100 Trying--------------|
|<-------------180 Ringing-------------|
|<-------------200 OK (SDP)------------|
|-----------------ACK----------------->|
|*****************RTP******************|
|<----------------BYE------------------|
|----------------200 OK--------------->|
INVITE-1xx-200等消息合在一起称为一个事务,BYE-200也是一个事务。
上面的所有消息称为一个对话(Dialog/Dialogue)。
通过B2BUA呼叫
UAC [UAS UAC] UAS
|--------------INVITE (SDP)----------->| |
|<-------------100 Trying--------------| |
|<--407 Proxy Authentication Required--| |
|-----------------ACK----------------->| |
|--------------INVITE (SDP)----------->| |
|<-------------100 Trying--------------| |
| |--------------INVITE (SDP)----------->|
| |<-------------100 Trying--------------|
| |<-------------180 Ringing-------------|
|<---180 Ringing / 183 Progress (SDP)--| |
| |<-------------200 OK (SDP)------------|
|<-------------200 OK (SDP)------------| |
|-----------------ACK----------------->| |
| |-----------------ACK----------------->|
|*************************************RTP*************************************|
| |<----------------BYE------------------|
|<----------------BYE------------------| |
|----------------200 OK--------------->| |
| |----------------200 OK--------------->|