SIP协议在VoIP中的应用(三)
一、什么是SIP协议
SIP协议又名会话发起协议,它是一个基于文本的应用层控制协议,用于创建、修改和释放一个或多个参与者的会话。SIP协议是应VoIP语音电话的产生而产生的,SIP协议的作用如下:
- 用户定位:确定参加通信的终端用户的位置,定位方式是SIP URL。
- 用户通信能力协商:确定通信的媒体类型和参数,封装SDP信息。
- 用户意愿交互:确定被叫是否乐意参加某个通信。
- 建立呼叫:包括向被叫“振铃”,确定主叫和被叫的呼叫参数。
- 呼叫处理和控制:包括呼叫重定向、呼叫转移、终止呼叫等等。
SIP协议可以应用于IP网中实现基本的语音通信增值业务,也是IMS通信网络的核心协议。SIP协议与其它相关协议的关系图如下:
SIP协议主要是为VoIP服务的,VoIP的通话模式有PC2PC、PC2PHONE、PHONR2PHONE、PHONE2PC四种,要实现VOIP语音电话,需要信令协议、媒体传输协议、其它支撑协议等三类协议的支持。以下是IP电话的协议族,其中H323、SIP、RTSP属于信令协议,RSVP、RTCP、RTP属于媒体传输协议。
二、SIP网络基本架构
要充分理解SIP协议的作用和功能,先看看如下SIP网络的分布式架构,图中可以看到SIP协议穿梭于不同的服务器之间。
- UserAgent:是一个软终端或者是一个支持SIP协议的电话,对接收到的行为进行代理,发送到SIP网络中。它包含UserAgentClients和UserAgentServer两个实体,前者用于发起SIP事务请求,将动作转换为invite消息(比如拨号),后者用于接收SIP事务请求,将invite消息转换为动作(比电话振铃)。
- ProxyServer:用于转发SIP消息。
- LocationServer:是一个数据库,用于存放终端用户当前的位置信息,向RedirectServer或者ProxyServer提供被叫用户位置信息。
- RedirectServer:将用户新的位置信息返回给呼叫方,呼叫方可根据新的位置重新发起呼叫。
- RegisterServer:提供注册请求,完成用户地址的注册、用户鉴权。
三、SIP协议地址
SIP网络采用了英特网的URL,支持IP地址和PSTN地址。一般的地址格式为:name@domain。举例:
- 姓名@域名:sip:name@wcom.com
- 昵称<sip:姓名@域名>:sip:nicename<sip:name@zs.com>
- 电话号码@电话运营商域名:sip:+1-613-555-1212@wcom.com;user=phone
四、SIP协议的消息结构
SIP协议的消息类型主要有以下几种:
- SIP请求消息:
- INVITE:发起会话请求。
- ACK:对INVITE请求的响应消息的确认。
- BYE:结束会话。
- CANCEL:取消尚未完成的请求。
- REGISTER:注册。
- OPTIONS:查询服务器的能力。
- INFO:用于传送 mid-call 信令信息,同一时刻只能有一个 INFO 事务存在。
- PRACK:临时响应(Provisional Response)确认。用于确认收到了临时响应。
- NOTIFY:事件通知,具体的事件包括、业务状态的改变、用户状态的改变等等。
- SUBSCRIBE:订阅/取消(Expires=0)事件通知。
- PUBLISH:发布事件状态。
- MESSAGE:针对即时消息 (IM)的扩展,用于传送即时消息。
- REFER:指示接收者 (Request-URI所标识的) 应该使用请求中提供的信息联系第三方。
- SIP响应消息:响应消息是对请求的回应,类型有如下几种:
- 1xx:提供信息性消息。
- 2xx:报告请求成功。
- 3xx:报告重定向。
- 4xx:表示请求错误。
- 5xx:通知服务器错误。
- 6xx:报告一般错误。
SIP中常用的响应状态码:100(试呼叫)、180(振铃)、181(呼叫前转)、182(排队)、183(可靠性临时响应)。
SIP请求消息的结构如下:
Session Initiation Protocol (INVITE) //表示一个SIP协议请求,消息类型为INVITE Request-Line: INVITE sip:1052@10.20.14.18:57106;ob SIP/2.0 //请求行:包含了请求方式、请求地址、协议版本 Message Header //消息头 Via: SIP/2.0/UDP 10.20.14.15;rport;branch=z9hG4bK16Ft7BFNa3D8c //标识请求路径,防止环路 Max-Forwards: 70 //到达目的经过的中转站的最大值,网络每经过一跳都会自减一,如果值为0,则终止请求 From: "90005_018076175750" <sip:90005_018076175750@10.20.14.15>;tag=87e0c69U7DS6m //发起方地址 To: <sip:1052@10.20.14.18:57106;ob> //接收方地址 Call-ID: 10e221cd-de61-123b-0f8b-f4b5200b7502 //标识一个INVITE [Generated Call-ID: 10e221cd-de61-123b-0f8b-f4b5200b7502] CSeq: 59641416 INVITE //用于匹配请求和响应消息 Contact: <sip:mod_sofia@10.20.14.15:5060> //给出后续直接通信的地址,给出后可以不用via里的地址 User-Agent: FreeSWITCH-mod_sofia/1.10.7-release+git~20220830T085235Z~cda9d15f48~64bit //包含发出请求的用户信息 Allow: INVITE, ACK, BYE, CANCEL, OPTIONS, MESSAGE, INFO, UPDATE, REGISTER, REFER, NOTIFY, PUBLISH, SUBSCRIBE //标识代理服务器支持的请求类型 Supported: timer, path, replaces Allow-Events: talk, hold, conference, presence, as-feature-event, dialog, line-seize, call-info, sla, include-session-description, presence.winfo, message-summary, refer Content-Type: application/sdp //消息体类型 Content-Disposition: session Content-Length: 420 //消息体长度 X-FS-Support: update_display,send_info Remote-Party-ID: "90005_018076175750" <sip:90005_018076175750@10.20.14.15>;party=calling;screen=yes;privacy=off Message Body //消息体 Session Description Protocol //表示是一个sdp协议文本,下面是sdp协议内容 Session Description Protocol Version (v): 0 Owner/Creator, Session Id (o): FreeSWITCH 1668365019 1668365020 IN IP4 10.20.14.15 Session Name (s): FreeSWITCH Connection Information (c): IN IP4 10.20.14.15 Time Description, active time (t): 0 0 Media Description, name and address (m): audio 25398 RTP/AVP 9 0 8 101 Media Attribute (a): rtpmap:9 G722/8000 Media Attribute (a): rtpmap:0 PCMU/8000 Media Attribute (a): rtpmap:8 PCMA/8000 Media Attribute (a): rtpmap:101 telephone-event/8000 Media Attribute (a): fmtp:101 0-15 Media Attribute (a): ptime:20 Media Description, name and address (m): video 16624 RTP/AVP 102 Bandwidth Information (b): AS:3072 Media Attribute (a): rtpmap:102 VP8/90000 Media Attribute (a): rtcp-fb:102 ccm fir Media Attribute (a): rtcp-fb:102 ccm tmmbr Media Attribute (a): rtcp-fb:102 nack Media Attribute (a): rtcp-fb:102 nack pli [Generated Call-ID: 10e221cd-de61-123b-0f8b-f4b5200b7502]
SIP响应消息的结构如下:
Session Initiation Protocol (200) //表示一个SIP协议响应,响应类型是200 Status-Line: SIP/2.0 200 OK //请求行:包含了请求方式、请求地址、协议版本 Message Header Via: SIP/2.0/UDP 10.2.1.166:5060;branch=z9hG4bK218159826 From: <sip:90005_018076175750@10.2.1.166>;tag=1739940613 To: <sip:96138_952138@10.20.14.15:5080>;tag=raXecm9vtQ87B Call-ID: 4179317446@10.2.1.166 [Generated Call-ID: 4179317446@10.2.1.166] CSeq: 20 INVITE Contact: <sip:96138_952138@10.20.14.15:5080;transport=udp> User-Agent: FreeSWITCH-mod_sofia/1.10.7-release+git~20220830T085235Z~cda9d15f48~64bit Accept: application/sdp Allow: INVITE, ACK, BYE, CANCEL, OPTIONS, MESSAGE, INFO, UPDATE, REGISTER, REFER, NOTIFY Supported: timer, path, replaces Allow-Events: talk, hold, conference, refer Content-Type: application/sdp Content-Disposition: session Content-Length: 218 Remote-Party-ID: "96138_952138" <sip:96138_952138@10.20.14.15>;party=calling;privacy=off;screen=no Message Body //消息体,内容为空
五、SIP协议建立呼叫流程
1、用户注册:注册就是SIP客户端主动告诉软交换设备SIP客户端自己的地址,当有其他用户想要呼叫自己的时候能够顺利通知到自己。用户每次开机都需要向服务器注册,当SIP客户端的地址发生改变后也需要重新注册。注册信息必须定时刷新。
- 用户开机首次发起注册:此时没有鉴权信息,服务器鉴权失败将返回401错误码。
- 再次注册:客户端输入鉴权信息,再次发起REGISTER请求,服务器鉴权成功后返回200状态码,并返回注册成功的消息。
2、通话建立:通话方式有普通方式和TLS连接方式,这相当于http和https的关系。
- 终端A创建INVITE请求:该请求携带sdp协议内容到达网关服务器,网关会返回100 Trying的响应来告知终端A网关正在尝试连接被呼叫终端B。
- 网关向终端B转发INVITE请求:请求到达终端B后会返回100 Trying的响应来告诉网关它已经接收到消息,正在进行处理,随后又向网关发送180 Ringing的请求表示它已经在"振铃"了。
- 网关向终端A转发180Ringing请求:通知终端A被叫端B正在振铃,同时A在收到信息后播放回铃音。
- 终端B在用户接听后向网关发送200 OK消息:此消息将携带sdp协议内容,网关在收到该消息后转发给终端A。
- 终端A发送ACK请求:终端A在收到B的200OK消息后,向网关发送ACK请求,网关转发到终端B,B在收到ACK请求后,开始建立RTP(媒体传输)连接,通话正式开始。
- 客户端挂机:任何一个终端主动挂机,都会向网关发送Bye请求,网关转发给对端。
- 挂机确认:对端在收到Bye请求后响应200OK消息,表示挂机正常。
六、TLS安全传输协议
TLS(Transport Layer Security Protocol),即安全传输层协议,用于在两个通信应用程序之间提供保密性和数据完整性,从而保证安全和可靠的传输。
TLS连接在TCP链路建立之后、SIP会话开始之前建立。建立TLS连接之后,通信双方后续的数据传输就是在安全的通道中传输。
SIP会话结束的时候,可以释放或保留TLS连接,如果连接被保留,称为TLS长连接,在配置TLS加密的时候需要选择是否保留长连接。由于每次连接建立过程会比较消耗CPU性能,因此,一般一对多的通信采用TLS短连接,固定两点之间的连接,建议使用TLS长连接,如SIP中继。
七、RTP、SRTP媒体传输协议与媒体协商
在前面的SIP通话建立过程中看到,SIP会话建立后,两个通话终端之间就可以开始传输RTP媒体流,媒体流的传输同样有普通方式(RTP)和加密传输方式传输(SRTP),双方通信时采用RTP协议还是采用SRTP协议,由通信双方协商确定。只有两端同时支持SRTP加密时,才能传输SRTP媒体流。
SRTP使用AES算法对数据流进行加密,为了数据流的完整性和正确性,防止黑客破坏、伪造或重传过去的数据,SRTP还提供了消息认证、完整性保护和重放保护。
双方协商媒体传输的过程称为媒体协商,媒体协商通过一种叫做SDP会话描述协议的协议来约束,是在SIP发起会话的时候进行的,前面提到在创建INVITE请求时就携带了SDP信息,SDP消息的示例如下:
v=0 o=jdoe 2890844526 2890842807 IN IP4 10.47.16.5 s=SDP Seminar i=A Seminar on the session description protocol u=http://www.example.com/seminars/sdp.pdf e=j.doe@example.com (Jane Doe) c=IN IP4 161.44.17.12/127 t=2873397496 2873404696 m=aideo 49170 RTP/AVP 0 //传输的媒体 m=aideo 51372 RTP/SAVP 0 a=crypto:1 AES_CM_128_HMAC_SHA1_80 //加密算法 inline:d0RmdmcmVCspeEc3QGZiNWpVLFJhQX1cfHAwJSoj|2^20|1:32 //密钥信息 a=orient: portrait
具体参数请参阅SDP格式描述相关资料,下图是媒体协商的过程描述:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库