SIP會話建立小記


1 電話是如何打通的

古時候很遠的兩個人如果想要交流,就要使用飛鴿或者白馬等來送信,那麼在網絡中的兩個人又用什麼送信來實現交流呢。在IP電話中,這個小小的信使叫做信令。SIP信令有兩種,request和response。常用的request有REGISTER 、INVITE、ACK、CANCEL、BYE、OPTIONS。而response一般都是1xx、2xx、3xx、4xx、5xx、6xx。


1.1 信使的行程

下面就是會話建立的一個過程,在這個過程中,Alice想要和Bob通信,小小的信使經過proxy這個驛站後把Alice的想法告訴了Bob,Bob想了想決定同意和Alice通信,小小的信使又原路返回把Bob的決定告訴Alice,然後Alice想要告訴Bob我已經知道你要和我通信的心意了,於是小小的信使又跑到Bob那裏。類似TCP的三次握手,這樣就確定了一個會話。

Alice's softphone           proxy                       Bob's softphone
192.168.126.52:57180        192.168.126.102:5060        192.168.126.52:57181

         |                          |                            |
         |      INVITE F1           |                            |		 
         |------------------------->|                            |
         |		100 Trying F2        |                            |
         |<-------------------------|                            |
         |                          |        INVITE F3           |
		 |                          |--------------------------->|
		 |                          |        180 Ringing F4      |
         |                          |<---------------------------|
         |		180 Ringing F5       |                            |
		 |<-------------------------|                            |
		 |                          |        200 OK F6           |
         |                          |<---------------------------|
		 |      200 OK F7           |                            |
         |<-------------------------|                            |		 
		 |      ACK F8              |                            |
		 |------------------------->|                            |
		 |                          |        ACK F9              |
         |                          |--------------------------->|	
         |                                                       |	
         |                                                       |			 
         |                    Media Session                      |
         |<=====================================================>|	
         |

說明:

F1:Alice打電話給Bob,發送INVITE到proxy。

F2:proxy收到Alice的INVITE後,回覆100 Trying告訴Alice proxy正在處理該請求。

F3:proxy轉發INVITE給Bob。

F4:Bob收到INVITE後回覆180 Ringing,告訴proxy已經收到INVITE。

F5:proxy轉發180 Ringing,告訴Alice Bob已經收到INVITE。

F6:Bob成功接聽電話,發送200 OK給proxy。

F7:proxy轉發200 OK,告訴Alcie Bob已經同意接聽電話。

F8:Alice收到200 OK後發送ACK,告訴proxy Alice已經知道Bob同意了。

F9:proxy轉發ACK給Bob。

整個過程的SIP包在附錄中。


1.2 信封要怎麼寫

像傳統的信封一樣,SIP也需要記錄收信人的姓名、收信人的地址、發信人的姓名以及發信人的地址。在SIP中,它們在這樣的字段中:

From:包含請求發起者的邏輯標誌,用來顯示發信人的姓名。

To:是第一個並且也是最先指定請求的”邏輯”接收地,用來顯示收信人的姓名。

Contact:和傳統信封中發信人的地址類似,提供訪問後續請求的聯繫方法,即是說,在通話建立後,如果想要再發送request,比如INFO,就可以發送到這個地址上。


2 proxy都做了什麼?

2.1 Record-Route:請一定要經過我

如果想要後續操作仍然經過proxy,就要添加Record-Route,這樣會告訴Alice凡是請求都請發給我。注意:Record-Route頭域不用來路由,只是起到傳遞信息的作用。

2.2 Via:信令所走過的路

via標識了信令走過了哪些設備。以INVITE爲例,從Alice到proxy的INVITE F1,從proxy到Bob的INVITE F3,其中關於Via的信息如下:

INVITE F1:
Via: SIP/2.0/TCP 192.168.126.52:57179;branch=z9hG4bK-524287-1---6d8b9b32b1dee257;rport

INVITE F3:
Via: SIP/2.0/TCP 192.168.126.102;branch=z9hG4bK0937.ad1f2488a2e7d2af68a6bcd907094024.1;i=c
Via: SIP/2.0/TCP 192.168.126.52:57179;received=192.168.126.52;branch=z9hG4bK-524287-1---6d8b9b32b1dee257;rport=57180

1. Alice發送INVITE時,記錄信令來到了192.168.126.52:57179。

2. proxy收到INVITE時,記錄信令來到了192.168.126.102。

這些記錄可以讓response可以原路返回。


2.3 Max-Forwards:防止迷路的計數君

信令可能會經過很多路由,如果路由太多,或者進入了死循環,信令就會遲遲到達不了目的地,而Alice就要傻傻等下去。這時,使用Max-Forwards來限制信令可以走過的最大路由數,如果達到了上限,就回復483給Alice,不會讓Alice一直等下去。

以INVITE爲例,從Alice到proxy的INVITE F1,從proxy到Bob的INVITE F3,其中關於Max-Forwards的信息如下:

INVITE F1:
Max-Forwards: 70

INVITE F3:
Max-Forwards: 69

上述例子中:Max-Forward最大值爲70,當路過proxy後,自動減1,當Max-Forward減爲0且未到目的,則回覆483。

2.4 SDP:請把媒體發送到這裏(使用媒體代理的情況下)

在使用媒體代理的情況下,proxy會修改SDP相關信息,告訴UA之後將媒體流發送到這個新的地方。以INVITE爲例,從Alice到proxy的INVITE F1,從proxy到Bob的INVITE F3,其中關於SDP的信息如下:

INVITE F1:
o=- 13082545712077426 1 IN IP4 192.168.126.52
c=IN IP4 192.168.126.52
m=audio 50150 RTP/AVP 9 8 0 84 101

INVITE F3:
o=- 13082545712077426 1 IN IP4 192.168.126.102
c=IN IP4 192.168.126.102
m=audio 59910 RTP/AVP 9 8 0 84 101
a=nortpproxy:yes

3 響應應該怎樣填寫?

應答中的 From 頭域必須和請求中的 From 頭域相等。

應答中的 Call-ID 頭域必須和請求中的 Call-ID 頭域相等。

應答中的 Cseq 頭域必須和請求中的 Cseq 頭域相等。

應答中的 Via 頭域必須和請求中的 Via 頭域相等,而且順序也必須相等。

如果請求中包含了 To tag,那麼應答中的 To 頭域必須和請求中的 To 頭域相等。

如果請求中的 To 頭域並不包含 Tag, 那麼應答中的 To 頭域的 URI 必須和請求中

的 To 頭域的 URI 相等;此外,UAS 還必須增加一個 Tag 到 To 頭域上(100 Trying除外)。


4 附錄:SIP包

F1

INVITE sip:[email protected] SIP/2.0
Via: SIP/2.0/TCP 192.168.126.52:57179;branch=z9hG4bK-524287-1---6d8b9b32b1dee257;rport
Max-Forwards: 70
Contact: <sip:[email protected]:57180;rinstance=c253e0b1bc382d30;transport=tcp>
To: <sip:[email protected]>
From: "400"<sip:[email protected]>;tag=1425661d
Call-ID: 76589ZjliMDYxMTc3NDcwZDliMjAwNDYyZGZlNzExODgwOWM
CSeq: 1 INVITE
Allow: SUBSCRIBE, NOTIFY, INVITE, ACK, CANCEL, BYE, REFER, INFO, MESSAGE
Content-Type: application/sdp
User-Agent: X-Lite 4.8.4 76589-c909bfce-W6.1
Content-Length: 245

v=0
o=- 13082545712077426 1 IN IP4 192.168.126.52
s=X-Lite release 4.8.4 stamp 76589
c=IN IP4 192.168.126.52
t=0 0
m=audio 50150 RTP/AVP 9 8 0 84 101
a=rtpmap:84 speex/16000
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-15
a=sendrecv

F2

SIP/2.0 100 trying -- your call is important to us
Via: SIP/2.0/TCP 192.168.126.52:57179;branch=z9hG4bK-524287-1---6d8b9b32b1dee257;rport=57180;received=192.168.126.52
To: <sip:[email protected]>
From: "400"<sip:[email protected]>;tag=1425661d
Call-ID: 76589ZjliMDYxMTc3NDcwZDliMjAwNDYyZGZlNzExODgwOWM
CSeq: 1 INVITE
Server: kamailio (4.3.0 (x86_64/linux))
Content-Length: 0

F3

INVITE sip:[email protected]:57181;transport=TCP;rinstance=7c3f84a3df98f77a SIP/2.0
Record-Route: <sip:192.168.126.102;transport=tcp;lr;nat=yes>
Via: SIP/2.0/TCP 192.168.126.102;branch=z9hG4bK0937.ad1f2488a2e7d2af68a6bcd907094024.1;i=c
Via: SIP/2.0/TCP 192.168.126.52:57179;received=192.168.126.52;branch=z9hG4bK-524287-1---6d8b9b32b1dee257;rport=57180
Max-Forwards: 69
Contact: <sip:[email protected]:57180;rinstance=c253e0b1bc382d30;transport=tcp;alias=192.168.126.52~57180~2>
To: <sip:[email protected]>
From: "400"<sip:[email protected]>;tag=1425661d
Call-ID: 76589ZjliMDYxMTc3NDcwZDliMjAwNDYyZGZlNzExODgwOWM
CSeq: 1 INVITE
Allow: SUBSCRIBE, NOTIFY, INVITE, ACK, CANCEL, BYE, REFER, INFO, MESSAGE
Content-Type: application/sdp
User-Agent: X-Lite 4.8.4 76589-c909bfce-W6.1
Content-Length: 265

v=0
o=- 13082545712077426 1 IN IP4 192.168.126.102
s=X-Lite release 4.8.4 stamp 76589
c=IN IP4 192.168.126.102
t=0 0
m=audio 59910 RTP/AVP 9 8 0 84 101
a=rtpmap:84 speex/16000
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-15
a=sendrecv
a=nortpproxy:yes

F4

SIP/2.0 180 Ringing
Via: SIP/2.0/TCP 192.168.126.102;branch=z9hG4bK0937.ad1f2488a2e7d2af68a6bcd907094024.1;i=c
Via: SIP/2.0/TCP 192.168.126.52:57179;received=192.168.126.52;branch=z9hG4bK-524287-1---6d8b9b32b1dee257;rport=57180
Record-Route: <sip:192.168.126.102;transport=tcp;lr;nat=yes>
Contact: <sip:[email protected]:57181;transport=TCP;rinstance=7c3f84a3df98f77a>
To: <sip:[email protected]>;tag=9c20bb58
From: "400"<sip:[email protected]>;tag=1425661d
Call-ID: 76589ZjliMDYxMTc3NDcwZDliMjAwNDYyZGZlNzExODgwOWM
CSeq: 1 INVITE
User-Agent: eyeBeam release 1003s stamp 31159
Content-Length: 0

F5

SIP/2.0 180 Ringing
Via: SIP/2.0/TCP 192.168.126.52:57179;received=192.168.126.52;branch=z9hG4bK-524287-1---6d8b9b32b1dee257;rport=57180
Record-Route: <sip:192.168.126.102;transport=tcp;lr;nat=yes>
Contact: <sip:[email protected]:57181;transport=TCP;rinstance=7c3f84a3df98f77a;alias=192.168.126.52~57181~2>
To: <sip:[email protected]>;tag=9c20bb58
From: "400"<sip:[email protected]>;tag=1425661d
Call-ID: 76589ZjliMDYxMTc3NDcwZDliMjAwNDYyZGZlNzExODgwOWM
CSeq: 1 INVITE
User-Agent: eyeBeam release 1003s stamp 31159
Content-Length: 0

F6

SIP/2.0 200 OK
Via: SIP/2.0/TCP 192.168.126.102;branch=z9hG4bK0937.ad1f2488a2e7d2af68a6bcd907094024.1;i=c
Via: SIP/2.0/TCP 192.168.126.52:57179;received=192.168.126.52;branch=z9hG4bK-524287-1---6d8b9b32b1dee257;rport=57180
Record-Route: <sip:192.168.126.102;transport=tcp;lr;nat=yes>
Contact: <sip:[email protected]:57181;transport=TCP;rinstance=7c3f84a3df98f77a>
To: <sip:[email protected]>;tag=9c20bb58
From: "400"<sip:[email protected]>;tag=1425661d
Call-ID: 76589ZjliMDYxMTc3NDcwZDliMjAwNDYyZGZlNzExODgwOWM
CSeq: 1 INVITE
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFO
Content-Type: application/sdp
User-Agent: eyeBeam release 1003s stamp 31159
Content-Length: 244

v=0
o=- 1 2 IN IP4 192.168.126.52
s=CounterPath eyeBeam 1.5
c=IN IP4 192.168.126.52
t=0 0
m=audio 59554 RTP/AVP 0 84 101
a=fmtp:101 0-15
a=rtpmap:101 telephone-event/8000
a=sendrecv
a=x-rtp-session-id:AECB168AB3C548A8922EB5B93760A965

F7

SIP/2.0 200 OK
Via: SIP/2.0/TCP 192.168.126.52:57179;received=192.168.126.52;branch=z9hG4bK-524287-1---6d8b9b32b1dee257;rport=57180
Record-Route: <sip:192.168.126.102;transport=tcp;lr;nat=yes>
Contact: <sip:[email protected]:57181;transport=TCP;rinstance=7c3f84a3df98f77a;alias=192.168.126.52~57181~2>
To: <sip:[email protected]>;tag=9c20bb58
From: "400"<sip:[email protected]>;tag=1425661d
Call-ID: 76589ZjliMDYxMTc3NDcwZDliMjAwNDYyZGZlNzExODgwOWM
CSeq: 1 INVITE
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFO
Content-Type: application/sdp
User-Agent: eyeBeam release 1003s stamp 31159
Content-Length: 264

v=0
o=- 1 2 IN IP4 192.168.126.102
s=CounterPath eyeBeam 1.5
c=IN IP4 192.168.126.102
t=0 0
m=audio 41922 RTP/AVP 0 84 101
a=fmtp:101 0-15
a=rtpmap:101 telephone-event/8000
a=sendrecv
a=x-rtp-session-id:AECB168AB3C548A8922EB5B93760A965
a=nortpproxy:yes

F8

ACK sip:[email protected]:57181;transport=TCP;rinstance=7c3f84a3df98f77a;alias=192.168.126.52~57181~2 SIP/2.0
Via: SIP/2.0/TCP 192.168.126.52:57179;branch=z9hG4bK-524287-1---a4523b3d055a4a3f;rport
Max-Forwards: 70
Route: <sip:192.168.126.102;transport=tcp;lr;nat=yes>
Contact: <sip:[email protected]:57180;rinstance=c253e0b1bc382d30;transport=tcp>
To: <sip:[email protected]>;tag=9c20bb58
From: "400"<sip:[email protected]>;tag=1425661d
Call-ID: 76589ZjliMDYxMTc3NDcwZDliMjAwNDYyZGZlNzExODgwOWM
CSeq: 1 ACK
User-Agent: X-Lite 4.8.4 76589-c909bfce-W6.1
Content-Length: 0

F9

ACK sip:[email protected]:57181;transport=TCP;rinstance=7c3f84a3df98f77a SIP/2.0
Via: SIP/2.0/TCP 192.168.126.102;branch=z9hG4bK0937.f859752293a9e7cb6a34a63f8b364a4f.0;i=c
Via: SIP/2.0/TCP 192.168.126.52:57179;received=192.168.126.52;branch=z9hG4bK-524287-1---a4523b3d055a4a3f;rport=57180
Max-Forwards: 69
Contact: <sip:[email protected]:57180;rinstance=c253e0b1bc382d30;transport=tcp;alias=192.168.126.52~57180~2>
To: <sip:[email protected]>;tag=9c20bb58
From: "400"<sip:[email protected]>;tag=1425661d
Call-ID: 76589ZjliMDYxMTc3NDcwZDliMjAwNDYyZGZlNzExODgwOWM
CSeq: 1 ACK
User-Agent: X-Lite 4.8.4 76589-c909bfce-W6.1
Content-Length: 0


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章