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消息由一系列行組成,每行以
結束,這些行分成4個部分:
1、起始行(start line)。
2、消息頭部(message header),內含多個頭部欄位(head field),每個頭部欄位為一行。
3、空行(empty line),僅包含一個
,表示頭部的結束。
4、消息體(message body),可有可無。
可以看出,SIP的消息和HTTP類似,因為它們是同一個組織IETF制定的。
下面將以幾個實例來體會消息的格式。
REGISTER消息:
Expires: 1200
CSeq: 68 REGISTER
Content-Length: 0
Max-Forwards: 70
User-Agent: Nero SIPPS IP Phone Version 2.0.51.16
第一行即為起始行,它的格式為:method request-uri sip-version
其中method為請求的方法,即前文中的六種方法,request-uri為請求的用戶或伺服器,sip-version為SIP版本號,三者間為空格,結束為
。
之後為消息頭部,消息頭部一般要包括Via, From, To, CSeq, Caller-ID, Max-Forwards等欄位,每個欄位的格式為:name: value;value;value
。name即欄位名,value為一個或多個,每個之間為「;」,結束為
。每個value內部可包含多段,消息頭的最後一行為空行,僅含
。
對協議還原,在消息頭部需要關注的是提取From, To欄位內的發送者接收者等標識用戶的信息,當然,對REGISTER方法,目的地址為伺服器,則From、To欄位內的用戶信息是相同的,Via欄位內的IP、埠信息,如果有其它欄位,如User-Agent,可提取終端信息,Contact則是綁定的聯繫地址。另外,如果存在Content-Length欄位,值非0,則表示帶有消息體,需要對消息體進行解析。
Response 100 Trying消息:
SIP/2.0 100 Trying
CSeq: 69 REGISTER
Content-Length: 0
Response消息是對請求的六個消息的響應,
第一行同樣為起始行,它的格式為:sip-version status-code reason-phrase
其中sip-version為SIP版本號;status-code為三位數字組成的返回狀態碼,其中第一個數字表示狀態的類型,如1xx表示中間狀態,收到的消息正在處理,2xx表示某個階段的成功,另外還有3xx,4xx,5xx,6xx等,分別表示不同含義,如跳轉,失敗,錯誤等;reason-phrase為對狀態碼的描述;三者間為空格,結束為
。
之後的消息頭部與請求一致。同樣,響應消息也可以帶有消息體,由消息頭部的相關欄位確定。
INVITE消息:
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
Max-Forwards: 70
Allow: INVITE, ACK, CANCEL, BYE, REFER, OPTIONS, NOTIFY, INFO
v=0
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
在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消息:
CSeq: 1 ACK
Content-Length: 0
ACK消息表示在對端返回Response消息之後對對端的回應,格式內容與其它消息類似。
CANCEL消息和BYE消息:
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~
長按進行關注。
TAG:協議分析與還原 |