當前位置:
首頁 > 最新 > SIP協議分析

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:協議分析與還原 |