sip協議是由IETF提出的IP電話信令協議,主要目的是為了解決ip網絡中的信令控制,以及同軟交換通信。
sip協議類似http協議:
報文結構:
start-line message-header CRLF [ message-body ]
1.start-line
分請求行和狀態行
請求行由請求類型、請求目的地址和協議版本號組成
請求類型:INVITE、ACK、OPTIONS、BYE、CANCEL、REGISTER
狀態行:被叫放向主叫方返回的狀態信息,1xx,2xx,3xx,4xx,5xx,6xx
請求類型:
INVITE:用於發起呼叫 INVITE消息包括消息頭和數據區兩部分。INVITE 消息頭包含主、被呼叫的地址,呼叫主題和呼叫優先級等信息。數據區則是關於會話媒體的信息,可由會話描述協議SDP 來實現。
BYE:當一個用戶決定中止會話時,可以使用BYE 來結束會話。
OPTIONS:用於詢問被叫端的能力信息,但OPTIONS 本身並不能發起呼叫。
ACK:對已收到的消息進行確認應答。
ACK:對已收到的消息進行確認應答。
REGISTER:用於用戶向SIP服務器傳送位置信息或地址信息。
CANCEL:取消當前的請求,但它並不能中止已經建立的連接。
狀態類型:
1xx:臨時消息:表示表示請求消息已經收到,后面將繼續處理該請求。
2xx:成功消息:表示請求已經被成功的理解、接受或執行。
3xx:重定向消息:表示為了完成請求還需采取更進一步的動作。
4xx:客戶機錯誤:表示該請求含有語法錯誤或在這個服務器上不能被滿足。
5xx:服務器錯誤:表示該服務器不能處理一個明顯有效的請求。
6xx:全局性故障:表示該請求在任何服務器上都不能被實現。
2.message-header
TO:格式:TO:顯示名<接收者URI>;tag=n;顯示名和tag可選。接收者URI是SIP網絡種唯一標識接收終端的標識符。例:TO:DENNY<SIP:caller@WORK.COM>;TAG=11111 或 TO:sip:caller@work.com
FROM: 消息頭FROM給出標識會話發起者的URI。比如:FROM:sip:caller@work.com;tag=hyh8。tag是必需的。
CALL-ID: 用於全局唯一標識正在建立的會話的標識符。 隨機數加UAC標識信息。
CSeq: 用於標識同一會話中不同事務的序號,通常由一個用作序號的整型數和消息類型組成。整個會話操作過程由不同的事務組成,每一事務所涉及的消息的CSeq序號必須相同。
Via:為響應消息提供傳輸路徑,當請求消息經過每一跳節點時,每一跳節點都把自身的IP地址信息放入頂層Via中。響應消息則沿着請求消息記錄下的傳輸路徑反向傳輸,首先移走指明自身IP地址信息的頂層消息頭
3.message-body
SIP協議一個最主要的作用就是協商媒體信息。媒體信息通過message-body攜帶,基於SDP會話描述協議。
對於PSTN語音編碼格式,主要有G711A、G711U、G729等。
SIP協商中主叫方會帶上自己支持的所有音頻編碼列表到被叫方,被叫方一般在回鈴時從主叫支持的類型中選出一種或多種自己支持的編碼,返回主叫后,雙人按順序選出第一個支持的編碼。
二:舉例:
(1) UAC發起register請求到UAS
(2) UAS如果需要驗證賬號信息,響應一個401 Unauthorized,其中包含用於密碼加密的隨機字符串
(3) UAC收到401后攜帶自己的賬號信息(其中密碼經過md5加密)重新發起一個register請求
(4) 服務器校驗通過后返回200OK
(5) UAC發起invite請求,其中攜帶了主被叫等信息(From、To頭域等)
(6) UAS一般會馬上響應100trying告訴UAC正在嘗試呼叫被叫
(7) 被叫響應后UAS返回180到UAC,其中可能攜帶彩鈴媒體信息到UAC
(8) 被叫接聽后返回200給UAC,其中可能攜帶會話媒體信息到UAC
(9) UAC返回ack到UAS確認收到200
三:重要頭域解釋
對於UAC或UAS來說,Sip協議是一種有狀態的協議,同一個會話的前后相關的信令必須送到相同的UAC或UAS。Sip協議的via、record-route頭域正是用於用來指示路由的字段。
其中幾個相關字段說明如下:
via用於指示response返回的路徑,不會影響后續request。
record-route用於指示同一callid后續請求的路徑。
rport是接收方收到via為內網的請求時,加上 自己看到的發送方的ip(received)和端口(rport),用於NAT。
四。sip測試工具
SIPp是sip協議棧的一個免費開源的測試工具, 它模擬了一些基本的uac和uas功能,並建立和釋放多個調用的INVITE和BYE的方法,可以讀取xml和csv文件生成注冊或呼叫流程,可以動態顯示統計信息和動態調整呼叫速率。
模擬UAS:./sipp -sn uas -i 192.168.1.249 -p 5077 //監聽5077端口
模擬UAC:./sipp -sn uac 192.168.1.249:5077 -i 192.168.1.249 -p 5078 -r 50 -rp 1000 //每1000ms發送50個呼叫
SIPp還支持使用腳本文件來自定義模擬的UAC或UAS的行為,具體可參考官網文檔:http://sipp.sourceforge.net/index.html
五。協議棧
常見協議棧有:
1、pjsip:http://www.pjsip.org/
2、sofia:http://sofia-sip.sourceforge.net/
3、osip:https://www.gnu.org/software/osip/