网络协议: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--------------->|
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步