SIP协议分析
“?音視頻通話控制協議SIP介紹。”
SIP(Session Initiation Protocol),即會話發起協議,在RFC2543、RFC3261等中被定義,是一個VOIP信令協議,其目的是在IP網絡中實現電話功能,即軟電話功能。
在互聯網基礎期,SIP協議常在硬件電話終端中,隨著網絡的發展,越來越多的軟件也使用SIP來作為語音視頻通話的控制協議。因此,SIP在協議還原領域從未缺位,并且地位相當重要。
SIP協議是純文本協議,通常為UDP承載,使用端口5060,本文對SIP協議的流程作簡單描述,然后對格式進行分析。
注意:網絡流量中SIP協議還會使用TCP承載,也會使用其它端口。
01
—
SIP流程
一個標準的SIP通話流程如下:
1、 A向B發送一個INVITE消息,邀請B通話。
2、B振鈴,向A回復一個RING消息,通知A振鈴中,A等待。
3、B提機,向A發一個OK消息, ?通知A可以通話,并進行雙方協商,協商信息常用SDP協議承載,SDP信息作為SIP報文的一部分。
4、A向B回復一個回應ACK消息,根據協商的結果正式啟動通話。
5、雙方通話,通話過程通常在另一條會話中進行,常見的是RTP承載。
6、B掛機,向A發一個BYE消息,通知A通話結束。
7、A向B回復一個OK消息,通話結束。
SIP的整個協議里,除上圖中的消息外,還有REGISTER等消息。
但是,在音視頻IM軟件中,SIP作為控制協議并不完全遵循于這個流程,需要具體情況具體分析,一般處理關鍵的SIP消息報文即可。
進行通話協商一般是使用SDP承載,但并不局限于SDP,通話過程則很多情況下是使用RTP、RTCP等,也有可能使用私有協議或者RTP的修改版本。
02
—
SIP格式
SIP消息分為Request和Response兩種,通常Request消息有六種方法:
REGISTER,INVITE,ACK,CANCEL,BYE,OPTIONS。而Response則為狀態碼和狀態內容,如100 Trying,180 Ringing, 200 OK,401 Unauthorized等。
一個完整的SIP消息由一系列行組成,每行以\r\n結束,這些行分成4個部分:
1、起始行(start line)。2、消息頭部(message header),內含多個頭部字段(head field),每個頭部字段為一行。3、空行(empty line),僅包含一個\r\n,表示頭部的結束。4、消息體(message body),可有可無。可以看出,SIP的消息和HTTP類似,因為它們是同一個組織IETF制定的。
下面將以幾個實例來體會消息的格式。
REGISTER消息:
REGISTER sip:sip.cybercity.dk SIP/2.0
Via: SIP/2.0/UDP 192.168.1.2;branch=z9hG4bKnp151248737-46ea715e192.168.1.2;rport
From: <sip:voi18063@sip.cybercity.dk>;tag=903df0a
To: <sip:voi18063@sip.cybercity.dk>
Call-ID: 578222729-4665d775@578222732-4665d772
Contact: ?<sip:voi18063@192.168.1.2:5060;line=9c7d2dbd8822013c>;expires=1200;q=0.500
Expires: 1200
CSeq: 68 REGISTER
Content-Length: 0
Max-Forwards: 70
User-Agent: Nero SIPPS IP Phone Version 2.0.51.16?
終端向代理服務器sip.cybercity.dk發起注冊消息。第一行即為起始行,它的格式為:method request-uri sip-version\r\n其中method為請求的方法,即前文中的六種方法,request-uri為請求的用戶或服務器,sip-version為SIP版本號,三者間為空格,結束為\r\n。
之后為消息頭部,消息頭部一般要包括Via, From,?To,?CSeq, Caller-ID, Max-Forwards等字段,每個字段的格式為:name: value;value;value\r\n。name即字段名,value為一個或多個,每個之間為“;”,結束為\r\n。每個value內部可包含多段,消息頭的最后一行為空行,僅含\r\n。
對協議還原,在消息頭部需要關注的是提取?From,?To字段內的發送者接收者等標識用戶的信息,當然,對REGISTER方法,目的地址為服務器,則From、To字段內的用戶信息是相同的,Via字段內的IP、端口信息,如果有其它字段,如User-Agent,可提取終端信息,Contact則是綁定的聯系地址。另外,如果存在Content-Length字段,值非0,則表示帶有消息體,需要對消息體進行解析。
Response 100 Trying消息:
SIP/2.0 100 Trying
Call-ID: 578222729-4665d775@578222732-4665d772
CSeq: 69 REGISTER
From: <sip:voi18063@sip.cybercity.dk>;tag=8e948b0
To: <sip:voi18063@sip.cybercity.dk>
Via: SIP/2.0/UDP 192.168.1.2;received=80.230.219.70;rport=5060;branch=z9hG4bKnp149505178-438c528b192.168.1.2
Content-Length: 0
Response消息是對請求的六個消息的響應,第一行同樣為起始行,它的格式為:sip-version status-code reason-phrase\r\n其中sip-version為SIP版本號;status-code為三位數字組成的返回狀態碼,其中第一個數字表示狀態的類型,如1xx表示中間狀態,收到的消息正在處理,2xx表示某個階段的成功,另外還有3xx,4xx,5xx,6xx等,分別表示不同含義,如跳轉,失敗,錯誤等;reason-phrase為對狀態碼的描述;三者間為空格,結束為\r\n。
之后的消息頭部與請求一致。同樣,響應消息也可以帶有消息體,由消息頭部的相關字段確定。
INVITE消息:
INVITE sip:0097239287044@sip.cybercity.dk SIP/2.0
Via: SIP/2.0/UDP 192.168.1.2:5060;branch=z9hG4bKnp85213694-430aa1de192.168.1.2;rport
From: "arik" <sip:voi18062@sip.cybercity.dk>;tag=51449dc
To: <sip:0097239287044@sip.cybercity.dk>
Call-ID: 85216695-42dcdb1d@192.168.1.2
CSeq: 1 INVITE
User-Agent: Nero SIPPS IP Phone Version 2.0.51.16
Expires: 120
Accept: application/sdp
Content-Type: application/sdp
Content-Length: 270
Contact: <sip:voi18062@192.168.1.2>
Max-Forwards: 70
Allow: INVITE, ACK, CANCEL, BYE, REFER, OPTIONS, NOTIFY, INFO
v=0
o=SIPPS 85214742 85214739 IN IP4 192.168.1.2
s=SIP call
c=IN IP4 192.168.1.2
t=0 0
m=audio 30000 RTP/AVP 0 8 97 2 3
a=rtpmap:0 pcmu/8000
a=rtpmap:8 pcma/8000
a=rtpmap:97 iLBC/8000
a=rtpmap:2 G726-32/8000
a=rtpmap:3 GSM/8000
a=fmtp:97 mode=20
a=sendrecv
終端向代理服務器sip.cybercity.dk發起請求通話的消息,服務器收到消息后會向目的終端發起通話消息。
在INVITE消息的消息頭部,從From、To字段內就能夠提取到通話雙方的賬號信息,以及昵稱。在這個消息中,Content-Length非0,說明帶有消息體,長度為270,Content-Type字段,描述了消息體的類型,消息體可以有很多中類型,此處為SDP。
根據SDP協議的格式,可以提取到通話內容使用的IP、端口、承載協議、可使用的語音編碼相關信息。如上述消息中,提取的本端可連IP為192.168.1.2,端口為30000,內容承載協議為RTP/AVP,可選語音編碼分別為pcmu、pcma、iLBC、G726-32、GSM等,采樣頻率均為8000,傳輸中對應的編號為0,8,97,2,3。
ACK消息:
ACK sip:0097239287044@sip.cybercity.dk SIP/2.0
From: "arik" <sip:voi18062@sip.cybercity.dk>;tag=51449dc
Call-ID: 85216695-42dcdb1d@192.168.1.2
Via: SIP/2.0/UDP 192.168.1.2:5060;branch=z9hG4bKnp85213694-430aa1de192.168.1.2;rport
To: <sip:0097239287044@sip.cybercity.dk>;tag=00-04073-1701b482-069239f90
CSeq: 1 ACK
Content-Length: 0?
CANCEL消息和BYE消息:
CANCEL sip:97239287044@voip.brujula.net SIP/2.0
Via: SIP/2.0/UDP 192.168.1.2;branch=z9hG4bKnp104984053-44ce4a41192.168.1.2;rport
From: "arik" <sip:816666@voip.brurjula.net>;tag=6433ef9
To: <sip:97239287044@voip.brujula.net>
Call-ID: 105090259-446faf7a@192.168.1.2
CSeq: 1 CANCEL
Content-Length: 0
Max-Forwards: 70
User-Agent: Nero SIPPS IP Phone Version 2.0.51.16?
CANCEL消息和BYE消息使用在不同的場景,按理解,CANCEL消息為取消的意思,而BYE消息則為結束的意思。在一次通話請求的過程中,CANCEL一般為拒絕通話,使通話結束,而BYE則是通話正常結束,對語音的控制消息的處理,二者稍有差異,但本質上是相同的。
另外,在使用SIP協議的APP中,常常會使用SIP協議進行文本聊天,文件傳輸等功能的實現,這樣,一般是承載在消息體內的,根據具體消息格式進行解析即可。
如果覺得本文有價值,請關注我,come on~
長按進行關注。
總結
- 上一篇: Windows下的DNS命令用法
- 下一篇: 使用Fiddler进行HTTP流量分析