SIP协议
SIP协议
简介
SIP协议(Session Initiation Protocol)是一个用于建立、更改和终止多媒体会话的应用层控制的协议,其中的会话可以是IP电话、多媒体会话或多媒体会议。
SIP协议支持任何终端(手机,平板电脑,计算机)互相通话,多媒体会议。
SIP工作流程
上述只是一个简单的两方通话流程,这个流程是我们生活中的常用情景,不过除了上述的场景外还有 呼叫转移,多人通话,视频等等场景,SIP都能满足。
SIP URI(电话号码)
两方通话,肯定需要建立PTP(point to point)的连接,所以双方必须都具备一个“电话号码”才能正常通话,而对于SIP协议来说,“电话号码”应该被称为SIP URI
,如下两个例子。
sip:jack@example.com:5060;transport=tcp
sip:alice@192.168.1.31:5060;transport=tcp
jack
和 alice
是用户名,example@com
和192.168.1.31
是主机名,5060
是端口号,transport=tcp
指定了使用TCP作为传输协议。
SIP URI
中的用户名和主机名并不需要对应于实际的 电话号码 和 IP地址 。它们只是用于在SIP网络中标识和路由消息的标识符。实际的电话号码或其他标识符可以在SIP消息的其他部分(如头字段或消息体)中传递。
SIP 架构
SIP 事务
SIP的事务发生在客户端和服务器之间,并由从第1个从客户端发送到服务器的请求开始,直到最后1个响应结束。具体来说,1个SIP事务由1个请求和n个应答组成(n≥1),这些应答包括了n个(n≥0)临时应答以及1个终结应答。
SIP协议是一个事务协议,组件间的交互是由一系列独立的消息交换完成的。在SIP通信中,每一个请求触发Server的操作方法,请求和响应构成1个事务,事务间彼此独立。SIP协议承载在IP网,网络层协议为IP,传输层协议可用TCP或UDP,一般使用比较多的为UDP协议。
SIP 报文
BYE sip:null@192.168.31.131:51971;transport=UDP SIP/2.0
Via: SIP/2.0/UDP 192.168.31.131:50027;rport;branch=z9hG4bKvtPAT0lfO
Max-Forwards: 70
To: <sip:null@null>;tag=Prf3c3Xc
From: <sip:some@192.168.31.131:50027>;tag=AM1g60xRvq
Call-ID: cenXTa4i-1423587756904@appletekiAir
CSeq: 711793880 BYE
起始行(start-line)
BYE
:请求方法——Method(SIP协议规定的Method有六种: INVITE
, ACK
, CANCEL
用于创建对话,BYE
用于结束对话, REGISTER
用于登记,OPTIONS
用于查询服务器能力);
sip:null@192.168.31.131:51971;transport=UDP
SIP URI,上文说过!可以理解成对方的“电话号码”
SIP/2.0
SIP协议版本号
消息头(header)
Via
- SIP/2.0/UDP SIP协议版本+通信协议(UDP)
- 192.168.31.131:50027 发送消息的SIP网元(客户端或Proxy)的主机名或网络地址
- rport: 这是一个参数,用于指示接收方在响应时应该使用哪个端口号,比如:rport=51971;就是告知接收对象向51971端口发响应报文
- branch=z9hG4bKiYblddPPX 一个事务可能包含多个请求和响应,这些请求和响应可能通过不同的路径到达目标。为了正确匹配请求和响应,SIP使用
branch
参数来标识每个消息——一个随机生成的标识符,确保在整个事务中都是唯一的。
Max-Forwards
请求到达UAS(User Agent Server,用户代理服务器)的跳数的限制。它是一个整数,每经过一个中间节点(或称为“跳”)时,这个值就会减去一。
To
消息的接收者,tag
用于唯一标识一个dialog中的事务分支。这个tag通常是由被叫方(User Agent Server,UAS)在生成响应时自动添加的。当UAC(User Agent Client)发送一个请求(如INVITE)时,它并不在TO头域中包含tag。然而,当UAS接收到这个请求并生成响应(如200 OK)时,它会在TO头域中添加一个唯一的tag,这个tag与FROM头域中的tag一起,构成了这个dialog的唯一标识
From
消息的发送者,tag
用于标识发起SIP请求的用户代理客户端(User Agent Client,UAC)的事务分支。在SIP中,一个UAC可能同时参与多个事务,而每个事务都可能包含多个请求和响应。因此,为了区分这些不同的事务,UAC会在每个请求的FROM字段中添加一个唯一的tag。这样,接收方(User Agent Server,UAS)就可以根据这个tag来正确地匹配请求和响应,并将它们关联到同一个事务中
Call-ID
呼叫唯一标识
CSeq
命令序列号,用于区分消息的先后顺序。具体来说,CSeq报头字段用于对对话中的事务进行排序,提供唯一标识事务的方法,并区分新请求和请求重传。CSeq: 711793880 BYE 表示一个BYE事务,序列号为711793880
用抓包软件抓一些SIP报文下来,然后看看结构。
附录
SIP协议状态码
1XX:临时响应
- 100 Trying:表示下一个节点的服务器已经接收到了这个请求并且还没有执行这个请求的特定动作(比如正在打开数据库的时候)。这个应答不会被有状态proxy转发到上行流中。
- 180 Ringing:UA收到INVITE请求并且试图提示给用户。这个应答应当触发一个本地回铃。
- 181 Call Is Being Forwarded:呼叫正在被转发到另一个目的地。
- 182 Queued:呼叫正在排队等待处理。
- 183 Session Progress:会话正在进行中。
2XX:成功响应
- 200 OK:请求已成功被接收、理解和接受。
3XX:重定向响应
- 300 Multiple Choices:请求的资源可以从多个地址获得。
- 301 Moved Permanently:请求的资源已被永久移动到新位置。
- 302 Moved Temporarily:请求的资源已被临时移动到新位置。
- 380 Alternative Service:请求的资源可以通过另一个URI获得。
4XX:客户端错误
- 400 Bad Request:请求包含无法被服务器理解或无法满足的语法错误。
- 401 Unauthorized:请求需要用户认证。
- 402 Payment Required:保留以供将来使用。
- 403 Forbidden:服务器已经理解请求,但是拒绝执行它。
- 404 Not Found:服务器无法找到请求的资源。
- 405 Method Not Allowed:请求中指定的方法不被允许。
- 406 Not Acceptable:请求的资源的内容特性无法满足请求头的接受字段。
- 407 Proxy Authentication Required:此代码与401类似,但指定请求者应当通过代理进行认证。
- 408 Request Timeout:请求在等待被处理时超时。
- 410 Gone:请求的资源已永久删除,且不会再有可用的转发地址。
- 413 Request Entity Too Large:请求的资源的大小超过服务器允许的大小。
- 414 Request-URI Too Long:请求的URI(通常为网址)过长,服务器无法处理。
- 415 Unsupported Media Type:请求的格式不受请求页面的支持。
- 416 Requested Range Not Satisfiable:客户端请求的范围无效。
- 420 Bad Extension:服务器不理解在请求中指定的扩展。
- 421 Extension Required:服务器需要一个特定的扩展来处理请求。
- 423 Interval Too Brief:服务器无法满足客户端在Request-Interval头字段中指定的请求间隔。
- 480 Temporarily Not Available:请求的资源暂时不可用。
- 481 Call/Transaction Does Not Exist:服务器无法识别呼叫或事务。
- 482 Loop Detected:服务器检测到一个循环。
- 483 Too Many Pending Requests:服务器正在处理太多请求,无法处理新的请求。
- 484 Address Incomplete:请求中的地址信息不完整。
- 485 Ambiguous:请求中的地址信息解析为多个地址。
- 486 Busy Here:请求的资源在本地不可用。
- 487 Request Terminated:由于某些原因,请求被服务器终止。
- 488 Not Acceptable Here:请求的资源的质量无法满足请求头中的QoS要求。
- 491 Request Pending:服务器已经有一个请求(可能是INVITE)正在处理中,并且相同的事务标识符的第二个请求不能被接受。
- 493 Undecipherable:服务器无法理解消息的内容。
- 494 Security Agreement Required:服务器需要安全协议来通信。
5XX:服务器错误
- 500 Server Internal Error:服务器内部错误,无法完成请求。
- 501 Not Implemented:服务器不支持请求的功能。
- 502 Bad Gateway:作为网关或代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。
- 503 Service Unavailable:由于过载或系统维护,服务器当前无法处理请求。
- 504 Server Time-Out:网关没有收到及时的响应。
- 513 Message Too Large:消息体量过大
本文来自博客园,作者:勤匠,转载请注明原文链接:https://www.cnblogs.com/JarryShu/articles/18193767