SIP协议是一个基于文本的协议,其消息包括请求和响应。
消息格式
开始行(请求行、状态行) // 请求行(方法 Request-URI 版本)/响应行(版本 状态码 信息)
消息头域空行
(CRLF) //”\r\n”
[消息体]
消息体包含媒体信息,采用SDP协议描述
SIP请求主要方法:
INVITE: 表示请求用户或服务加入一个会话
ACK:用来确认客户已经收到了一个对INVITE请求的最终响应
仅和INVITE请求配套
证实已收到对于INVITE请求的最终响应
成功响应:UAC证实不成功响应:PS或UAC证实
三次握手过程:INVITE-响应-ACK
ACK可含消息体,给出被叫使用的最终会话描述
OPTIONS:用于查询对方用户代理的能力
BYE:用于结束一个会话
CANCEL:用于撤销一个正在等待的请求
REGISTER:用于将自己的地址信息注册到服务器上
其他方法:
INFO, REFER, PRACK, COMET, SUBSCRIBE, UNSUBSCRIBE, NOTIFY, MESSAGE等
SIP响应响应类型:
1XX 进展报告,请求已收到,正在处理.
100:Trying
180:Ringing
181:Call is being forwarded
182:Queued
2XX 请求成功
3XX 重定向,还需进一步操作才能完成请求
Contact: 指示重定向地址
300:Multiple Choices
301:Moved Permanently(UAC更新地址本和cache)
302:Moved Temporarily(可有有效期)
305:Use Proxy
380:Alternative Services(消息体中说明)
4XX 客户端错误,请求包含无效语法,或服务 器不能接受该请求
401: Unauthorized 用户需认证
407: Proxy Authentication Required
403: Forbidden 禁止该请求
404: Not found 域内无此用户
408: Request Timeout
482: Loop detected
483: Too Many Hops
486: Busy Here(可带Retry After 字段)
5XX 服务器端错误
6XX 全局错误
SIP Request-URI: //指示请求的当前目的地地址
指示请求的目的地址
代理服务器基于Request-URI路有请求
当地址被进一步解析的时候,Request-URI可以被修改
SIP tags
Tag是一种伪随机数,被用于From和To头域中,用于唯一标识一个Dialog
任何用户代理或服务器产生一个请求的响应,并在To头域中插入to-tag。如:To: sip:[email protected];tag=35635333
SIP消息头域
需要的头域有To, From, Via, Call-ID, CSeq
可选的头域有Subject, Authorization等
头域介绍:
Contact //指示重定向地址
后续Request将根据Contact头域的内容决定目的地的地址,同时将Contact头域的内容放到Request-URI中。它还可以用来指示没有在Record-Route头域中记录的Proxies的地址。同时它还可以被用在Redirect servers和REGISTER requests 和responses。?
From //指示请求的源地址
Eg: From: “Bob” sips:[email protected]; tag=a48s
From: sip:[email protected]; tag=887s
From: Anonymous sip:[email protected]; tag=hyh8
Ps: SIP URI与sips URI的区别: SIPS是指安全SIP, 是使用TLS作为安全传输协议,要求在传输SIP消息前先建立TLS连接….
类似于 http: 与 https: 的区别。(加入SSL层)
To //指示请求想要抵达的目的地
Eg: Carol
Via //指示请求消息历经的路径,
作用: 可以使响应消息沿原路返回请求发起方
发现路由环路
NAT处理
Via示例:
Via:SIP/2.0/UDP first.example.com:4000;ttl=16;maddr=224.2.0.1;branch=a7c6a8dlze(Example)
Via:发送协议 发送方;生存期参数;多播地址参数;接收标记;分支参数
Branch用来标识由当前请求所建立的事务, 该参数既用在客户端, 也用在服务器端.
NAT处理的例子:
UAC(10.0.0.1:5060)->NAT->Proxy Server(ealang.bell.com)->…
PS接收消息:Via:SIP/2.0/UDP 10.0.0.1:5060
发现:消息源地址!=Via地址(跨越了NAT)
转发消息: Via:SIP/2.0/UDP erlang.bell.com Via:SIP/2.0/UDP 10.0.0.1:5060;
received=199.172.136.3
后续收到响应消息时,就可根据received参数,将其发往199.127.136.3:5060
同样原则处理NAPT
• Call-Id //标识呼叫的全局唯一的标识, 识别多个请求和响应消息属于同一呼叫
在一个会话中,UA发送的所有请求消息和相应消息都必须有同样的Call-ID.
Call-ID:本地标识@host (区分大小写)
Eg: Call-ID:[email protected]
• Cseq //判定响应和请求的对应关系, 判定重复请求
相同Call-ID的请求消息:
--不同请求方法
--不同头部字段
--不同消息体
Cseq ++
请求中的Cseq值复制到响应消息中
初始值任意值
Eg: CSeq: 4711 INVITE
• Subject
• Authorization
• Accept
• Content-Length
• Content-Type
• Encryption
• Expires
• Max-Forwards
• Priority
• Record-Route
• Require
• Retry-After
• Route
• Unsupported
• Warning
SIP消息体
• 消息体可以使任何协议格式
• 常用消息体类型有SDP、ISUP等
SIP Transaction
• 一个SIP事务处理包含一个请求、零个或多个临时响应和一个最终响应。
• 同一个事务处理中,请求和响应的To、From、Call-ID、CSeq等头域的值相同。
• Call-ID用于标识一个会话,在同一时刻全局唯一。
• 事务类型:
INVITE Client Transaction
INVITE Server Transaction
non-INVITE Client Transaction
non-INVITE Server Transaction
SIP Dialog
• Dialog is a peer-to-peer SIP relationship between two user agents that persists for some time
• Dialog有利于对消息进行排序和把请求正确的路由给两侧的用户
• Dialog ID:
Call-Id, 本地tag, 对端tag 组成
• Dialog状态:
由本地请求序列号,对端请求序列号,本地URI,对端URI,secure标志
• Dialog的创建方法:
RFC3261 INVITE
RFC3265 SUBSCRIBE
SIP Transport
• 使用UDP、TCP、TLS等协议传输
• 缺省端口号 :5060(UDP)、5061(TCP)
• 可靠性保证
使用SeqNum保证消息次序
超时重传保证消息可靠发送
• 使用RFC3262的PRACK方法实现临时响应的可靠传输
SIP协议逻辑实体
• User Agent :能够发送和接收请求,如SIP Phone
User Agent Client:初始SIP请求
User Agent Server:返回SIP响应
• Proxy Server:决定请求的下一跳和转发请求
Stateless Proxy:无状态代理服务器 //一旦传送完毕, 忘记所有信息.
Stateful Proxy:有状态代理服务器, //记住他的接收的入请求, 以及回送的响应和它传送的请求.
• Registrar Server :接受客户端的注册(REGISTER) 请求
• Redirect Server:返回下一跳的地址信息给客户端
SIP Phone的特性
• 呼叫响应:发送200 OK 响应
• 呼叫忙:发送483 Busy Here 响应
• 呼叫拒绝:发送603 Declined 响应
• 显示呼叫ID: 显示From头域的主叫信息
• 呼叫保持:发送re-INVITE请求
• 呼叫选择:根据From、Priority、Subject选择呼叫
• 呼叫等待:发送180 Ringing 响应
• 呼叫排队:发送181 Call Queued 响应