目錄
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