• <strike id="fdgpu"><input id="fdgpu"></input></strike>
    <label id="fdgpu"></label>
    <s id="fdgpu"><code id="fdgpu"></code></s>

  • <label id="fdgpu"></label>
  • <span id="fdgpu"><u id="fdgpu"></u></span>

    <s id="fdgpu"><sub id="fdgpu"></sub></s>

    《FreeSWITCH: VoIP實(shí)戰》:SIP 協(xié)議

    2012-08-14 13:51:18   作者:杜金房    來(lái)源:FreeSWITCH    評論:0  點(diǎn)擊:


    SIP 的概念和相關(guān)元素

    會(huì )話(huà)初始協(xié)議(Session Initiation Protocol)是一個(gè)控制發(fā)起、修改和終結交互式多媒體會(huì )話(huà)的信令協(xié)議。它是由 IETF(Internet Engineering Task Force,Internet工程任務(wù)組)在 RFC 2543 中定義的。最早發(fā)布于 1999 年 3 月,后來(lái)在 2002 年 6 月又發(fā)布了一個(gè)新的標準 RFC 2361。

    SIP 是一個(gè)基于文本的協(xié)議,在這一點(diǎn)上與 HTTP 和 SMTP 相似。我們來(lái)對比一個(gè)簡(jiǎn)單的 SIP 請求與 HTTP 請求:

    GET /index.html HTTP/1.1

    INVITE sip:seven@freeswitch.org.cn SIP/2.0

    請求由三部分組成。在 HTTP 中, GET 指明一個(gè)獲取資源(文件)的動(dòng)作,而 /index.html 則是資源的地址,最后是協(xié)議版本號。而在 SIP 中,INVITE 表示發(fā)起一次請求,seven@freeswitch.org.cn 為請求的地址,稱(chēng)為 SIP URI,最后也是版本號。其中,SIP URI很類(lèi)似一個(gè)電子郵件,其格式為“協(xié)議:名稱(chēng)@主機”。與 HTTP 和 HTTPS 相對應,有 SIP 和 SIPS,后者是加密的;名稱(chēng)可以是一串數字的電話(huà)號碼,也可以是字母表示的名稱(chēng);而主機可以是一個(gè)域名,也可以是一個(gè)IP地址。

    SIP 是一個(gè)對等的協(xié)議,類(lèi)似 P2P。不像傳統電話(huà)那樣必須有一個(gè)中心的交換機,它可以在不需要服務(wù)器的情況下進(jìn)行通信,只要通信雙方都彼此知道對方地址(或者,只有一方知道另一方地址),如下圖,bob 給 alice 發(fā)送一個(gè) INVITE 請求,說(shuō)“Hi, 一起吃飯吧...”,alice 說(shuō)"好的,OK",電話(huà)就通了。

    在 SIP 網(wǎng)絡(luò )中,alice 和 bob 都叫做用戶(hù)代理(UA, User Agent)。UA 是在 SIP 網(wǎng)絡(luò )中發(fā)起或響應 SIP 處理的邏輯功能。UA是有狀態(tài)的,也就是說(shuō),它維護會(huì )話(huà)(或稱(chēng)對話(huà))的狀態(tài)。UA 有兩種功能:一種是 UAC(UA Client用戶(hù)代理客戶(hù)端),它是發(fā)起 SIP 請求的一方,如上圖的 bob。另一種是 UAS(UA Server),它是接受請求并發(fā)送響應的一方,如上圖中的 alice。由于 SIP 是對等的,如果 alice 呼叫 bob 時(shí)(有時(shí)候 alice 也主動(dòng)叫 bob 一起吃飯),alice 就稱(chēng)為 UAC,而 bob 則執行 UAS的功能。一般來(lái)說(shuō),UA 都會(huì )實(shí)現上述兩種功能。

    設想 bob 和 alice 是經(jīng)人介紹認識的,而他們還不熟悉,bob 想請 alice 吃飯就需要一個(gè)中間人(M)傳話(huà),而這個(gè)中間人就叫代理服務(wù)器(Proxy Server)。還有另一種中間人叫做重定向服務(wù)器(Redirect Server),它類(lèi)似于這樣的方式工作──中間人 M 告訴 bob,我也不知道 alice 在哪里,但我老婆知道,要不然我告訴你我老婆的電話(huà),你直接問(wèn)她吧,我老婆叫 W。這樣,M 就成了一個(gè)重定向服務(wù)器,而他老婆 W 則是真正的代理服務(wù)器。這兩種服務(wù)器都是 UAS,它們主要是提供一對欲通話(huà)的 UA 之間的路由選擇功能。具有這種功能的設備通常稱(chēng)為邊界會(huì )話(huà)控制器(SBC,Session Border Controller)。

    還有一種 UAS 叫做注冊服務(wù)器。試想這樣一種情況,alice 還是個(gè)學(xué)生,沒(méi)有自己的手機,但它又希望 bob 能隨時(shí)找到她,于是當她在學(xué)校時(shí)就告訴中間人 M 說(shuō)她在學(xué)校,如果有事打她可以打宿舍的電話(huà);而當她回家時(shí)也通知 M 說(shuō)有事打家里電話(huà)。只要 alice 換一個(gè)新的位置,它就要向 M 重新“注冊”新位置的電話(huà),以讓 M 能隨時(shí)找到她,這時(shí)候 M 就是一個(gè)注冊服務(wù)器。

    最后一種叫做背靠背用戶(hù)代理(B2BUA,Back-to-Back UA)。需要指出,其實(shí) RFC 3261 并沒(méi)有定義 B2BUA的功能,它只是一對 UAS 和 UAC的串聯(lián)。FreeSWITCH 就是一個(gè)典型的 B2BUA,事實(shí)上,B2BUA 的概念會(huì )貫穿本書(shū)始終,所以,在此我們需要多花一點(diǎn)筆墨來(lái)解釋。

    我們來(lái)看上述故事的另一個(gè)版本:M 和 W 是一對恩愛(ài)夫妻。M 認識 bob 而 W 認識 alice。M 和 W 有意搓合兩個(gè)年輕人,但見(jiàn)面時(shí)由于兩人太靦腆而互相沒(méi)留電話(huà)號碼。事后 bob 相知道 alice 對他感覺(jué)如何,于是打電話(huà)問(wèn) M,M 不認識 alice,就轉身問(wèn)老婆 W (注意這次 M 沒(méi)有直接把 W 電話(huà)給 bob),W 接著(zhù)打電話(huà)給 alice,alice 說(shuō)印象還不錯,W 就把這句話(huà)告訴 M, M 又轉過(guò)身告訴 bob。 M 和 W 一個(gè)面向 bob,一個(gè)對著(zhù) alice,他們兩個(gè)合在一起,稱(chēng)作 B2BUA。在這里,bob 是 UAC,因為他發(fā)起請求;M 是 UAS,因為他接受 bob 的請求并為他服務(wù);我們把 M 和 W 看做一個(gè)整體,他們背靠著(zhù)背(站著(zhù)坐著(zhù)躺著(zhù)都行),W 是 UAC,因為她又向 alice 發(fā)起了請求,最后 alice 是 UAS。其實(shí)這里UAC 和 UAS 的概念也不是那么重要,重要的是要理解這個(gè)背靠背的用戶(hù)代理。因為事情還沒(méi)有完,bob 一聽(tīng)說(shuō) alice 對他印象還不錯,心花怒放,便想請 alice 吃飯,他告訴 M, M 告訴 W, W 又告訴 alice,alice 問(wèn)去哪吃,W 又只好問(wèn) M, M 再問(wèn) bob…… 在這對年輕人掛斷電話(huà)這前, M 和 W 只能“背對背”的工作。

    從上圖可以看出,四個(gè)人其實(shí)全是 UA。從上面故事可以看出,雖然 FreeSWITCH 是 B2BUA,但也可以經(jīng)過(guò)特殊的配置,實(shí)現一些代理服務(wù)器和重定向服務(wù)器的功能,甚至也可以從中間劈開(kāi),兩邊分別作為一個(gè)普通的 UA 來(lái)工作。這沒(méi)有什么奇怪的,在 SIP 世界中,所有 UA 都是平等的。具體到實(shí)物,則 M 和 W 就組成了實(shí)現軟交換功能的交換機,它們對外說(shuō)的語(yǔ)言是 SIP,而在內部,它們則使用自己家的語(yǔ)言溝通。bob 和 alice 就分別成了我們常見(jiàn)的軟電話(huà),或者硬件的 SIP 電話(huà)。

    SIP 注冊

    不像普通的固定電話(huà)網(wǎng)中,電話(huà)的地址都是固定的。因特網(wǎng)是開(kāi)放的,alice 的 UA 可能在家也可能在學(xué)校,或者,在世界是任何角落,只要能上網(wǎng),它就能與世界通信。為了讓我們的 FreeSWITCH 服務(wù)器能找到它,它必須向服務(wù)器進(jìn)行注冊。通常的注冊流程是:

    Alice                          FreeSWITCH
      |                                |
      |           REGISTER             |
      |------------------------------->|
      |   SIP/2.0 401 Unauthorized     |
      |<-------------------------------|
      |           REGISTER             |
      |------------------------------->|
      |   SIP/2.0 200 OK               |
      |                                |

    我們用真正的注冊流程進(jìn)行說(shuō)明。下面的 SIP 消息是在真正的 FreeSWITCH 中 trace 出來(lái)的。其中 FreeSWITCH 服務(wù)器的 IP 地址是 192.168.4.4,使用默認的端口號 5060,在這里,我們使用的是 UDP 協(xié)議。 alice 使用的 UAC 是 Zoiper,端口號是 5090(在我寫(xiě)作時(shí)它與 FreeSWITCH 在同一臺機器上,所以不能再使用端口 5060)。其中每個(gè)消息短橫線(xiàn)之間的內容都是 FreeSWITCH 中輸出的調試信息,不是 SIP 的一部分。

    ------------------------------------------------------------------------
    recv 584 bytes from udp/[192.168.4.4]:5090 at 12:30:57.916812:
    ------------------------------------------------------------------------
    REGISTER sip:192.168.4.4;transport=UDP SIP/2.0
    Via: SIP/2.0/UDP 192.168.4.4:5090;branch=z9hG4bK-d8754z-d9ed3bbae47e568b-1---d8754z-;rport
    Max-Forwards: 70
    Contact: <sip:alice@192.168.4.4:5090;rinstance=d42207a765c0626b;transport=UDP>
    To: <sip:alice@192.168.4.4;transport=UDP>
    From: <sip:alice@192.168.4.4;transport=UDP>;tag=9c709222
    Call-ID: NmFjNzA3MWY1MDI3NGViMjY1N2QwZDlmZWQ5ZGY2OGE.
    CSeq: 1 REGISTER
    Expires: 3600
    Allow: INVITE, ACK, CANCEL, BYE, NOTIFY, REFER, MESSAGE, OPTIONS, INFO, SUBSCRIBE
    User-Agent: Zoiper rev.5415
    Allow-Events: presence
    Content-Length: 0

    recv 表明 FreeSWITCH 收到來(lái)自 alice 的消息。我們前面已經(jīng)說(shuō)進(jìn),SIP 是純文本的協(xié)議,類(lèi)似 HTTP,所以很容易閱讀。

    第一行的 REGISTER 表示是一條注冊消息。

    Via 是 SIP 的消息路由,如果 SIP 經(jīng)過(guò)好多代理服務(wù)器轉發(fā),則會(huì )有多條 Via 記錄。
    Max-forwards 指出消息最多可以經(jīng)過(guò)多少次轉發(fā),主要是為了防止產(chǎn)生死循環(huán)。
    Contact 是 alice 家的地址,本例中,FreeSWITCH 應該能在 192.168.4.4 這臺機器上的 5090 端口找到她。
    To 和 From 先不管。
    Call-ID 是本次 SIP 會(huì )話(huà)(Session)的標志。
    CSeq 是一個(gè)序號,由于 UDP 是不可靠的協(xié)議,在不可靠的網(wǎng)絡(luò )上可能丟包,所以有些包需要重發(fā),該序號則可以防止重發(fā)引起的消息重復。
    Expires 是說(shuō)明本次注冊的有效期,單位是秒。在本例中,alice 應該在一小時(shí)內再次向 FreeSWITCH 注冊,防止 FreeSWITCH 忘掉她。實(shí)際上,大部分 UA 的實(shí)現都會(huì )在幾十秒內就重新發(fā)一次注冊請求,這在 NAT 的網(wǎng)絡(luò )中有助于保持連接。
    Allow 是說(shuō)明 alice 的 UA 所能支持的功能,某些 UA 功能豐富,而某些 UA 僅有有限的功能。
    User-Agent 是 UA 的型號。
    Allow-Events 則是說(shuō)明她允許哪些事件通知。
    Content-Length 是消息體(Body)的長(cháng)度,在這里,只有消息頭(Header),沒(méi)有消息體,因此長(cháng)度為 0 。

    ------------------------------------------------------------------------
    send 664 bytes to udp/[192.168.4.4]:5090 at 12:30:57.919364:
    ------------------------------------------------------------------------
    SIP/2.0 401 Unauthorized
    Via: SIP/2.0/UDP 192.168.4.4:5090;branch=z9hG4bK-d8754z-d9ed3bbae47e568b-1---d8754z-;rport=5090
    From: <sip:alice@192.168.4.4;transport=UDP>;tag=9c709222
    To: <sip:alice@192.168.4.4;transport=UDP>;tag=QFXyg6gcByvUH
    Call-ID: NmFjNzA3MWY1MDI3NGViMjY1N2QwZDlmZWQ5ZGY2OGE.
    CSeq: 1 REGISTER
    User-Agent: FreeSWITCH-mod_sofia/1.0.trunk-16981M
    Allow: INVITE, ACK, BYE, CANCEL, OPTIONS, MESSAGE, UPDATE, INFO, REGISTER, REFER,
        NOTIFY, PUBLISH, SUBSCRIBE
    Supported: timer, precondition, path, replaces
    WWW-Authenticate: Digest realm="192.168.4.4",
        nonce="62fb812c-71d2-4a36-93d6-e0008e6a63ee", algorithm=MD5, qop="auth"
    Content-Length: 0

    FreeSWITCH 需要驗證 alice 的身分才允許她注冊。在 SIP 中,沒(méi)有發(fā)明新的認證方式,而是使用已有的 HTTP 摘要(Digest)方式來(lái)認證。401 消息表示未認證,它是 FreeSWITCH 對 alice 的響應。同時(shí),它在本端生成一個(gè)認證摘要(WWW-Authenticate),一齊發(fā)送給 alice。

    ------------------------------------------------------------------------
    recv 846 bytes from udp/[192.168.4.4]:5090 at 12:30:57.921011:
    ------------------------------------------------------------------------
    REGISTER sip:192.168.4.4;transport=UDP SIP/2.0
    Via: SIP/2.0/UDP 192.168.4.4:5090;branch=z9hG4bK-d8754z-dae1693be9f8c10d-1---d8754z-;rport
    Max-Forwards: 70
    Contact: <sip:alice@192.168.4.4:5090;rinstance=d42207a765c0626b;transport=UDP>
    To: <sip:alice@192.168.4.4;transport=UDP>
    From: <sip:alice@192.168.4.4;transport=UDP>;tag=9c709222
    Call-ID: NmFjNzA3MWY1MDI3NGViMjY1N2QwZDlmZWQ5ZGY2OGE.
    CSeq: 2 REGISTER
    Expires: 3600
    Allow: INVITE, ACK, CANCEL, BYE, NOTIFY, REFER, MESSAGE, OPTIONS, INFO, SUBSCRIBE
    User-Agent: Zoiper rev.5415
    Authorization: Digest username="alice",realm="192.168.4.4",
        nonce="62fb812c-71d2-4a36-93d6-e0008e6a63ee",
        uri="sip:192.168.4.4;transport=UDP",response="32b5ddaea8647a3becd25cb84346b1c3",
        cnonce="b4c6ac7e57fc76b85df9440994e2ede8",nc=00000001,qop=auth,algorithm=MD5
    Allow-Events: presence
    Content-Length: 0

    alice 收到帶有摘要的 401 后,后新發(fā)起注冊請求,這一次,加上了根據收到的摘要和它自己的密碼生成的認證信息(Authorization)。并且,你可以看到,CSeq 序號變成了 2。

    ------------------------------------------------------------------------
    send 665 bytes to udp/[192.168.4.4]:5090 at 12:30:57.936940:
    ------------------------------------------------------------------------
    SIP/2.0 200 OK
    Via: SIP/2.0/UDP 192.168.4.4:5090;branch=z9hG4bK-d8754z-dae1693be9f8c10d-1---d8754z-;rport=5090
    From: <sip:alice@192.168.4.4;transport=UDP>;tag=9c709222
    To: <sip:alice@192.168.4.4;transport=UDP>;tag=rrpQj11F86jeD
    Call-ID: NmFjNzA3MWY1MDI3NGViMjY1N2QwZDlmZWQ5ZGY2OGE.
    CSeq: 2 REGISTER
    Contact: <sip:alice@192.168.4.4:5090;rinstance=d42207a765c0626b;transport=UDP>;expires=3600
    Date: Tue, 27 Apr 2010 12:30:57 GMT
    User-Agent: FreeSWITCH-mod_sofia/1.0.trunk-16981M
    Allow: INVITE, ACK, BYE, CANCEL, OPTIONS, MESSAGE, UPDATE, INFO, REGISTER, REFER,
        NOTIFY, PUBLISH, SUBSCRIBE
    Supported: timer, precondition, path, replaces
    Content-Length: 0

    FreeSWITCH 收到帶有認證的注冊消息后,核實(shí) alice 身份,認證通過(guò),回應 200 OK。 如果失敗,則回應 403 Forbidden 或其它失敗消息,如下。

    ------------------------------------------------------------------------
    send 542 bytes to udp/[192.168.4.4]:5090 at 13:22:49.195554:
    ------------------------------------------------------------------------
    SIP/2.0 403 Forbidden
    Via: SIP/2.0/UDP 192.168.4.4:5090;branch=z9hG4bK-d8754z-d447f43b66912a1b-1---d8754z-;rport=5090
    From: <sip:alice@192.168.4.4;transport=UDP>;tag=c097e17f
    To: <sip:alice@192.168.4.4;transport=UDP>;tag=yeecX364pvryj
    Call-ID: ZjkxMGJmMjE4Y2ZiNjU5MzM5NDZkMTE5NzMzMzM0Mjc.
    CSeq: 2 REGISTER
    User-Agent: FreeSWITCH-mod_sofia/1.0.trunk-16981M
    Allow: INVITE, ACK, BYE, CANCEL, OPTIONS, MESSAGE, UPDATE, INFO, REGISTER, REFER,
        NOTIFY, PUBLISH, SUBSCRIBE
    Supported: timer, precondition, path, replaces
    Content-Length: 0          

    你可以看到,alice 的密碼是不會(huì )直接在 SIP 中傳送的,因而一定程序上保證了安全(當然還是會(huì )有中間人,重放之類(lèi)的攻擊,我們留到后面討論)。

    SIP 呼叫流程

    UA 間直接呼叫


    上面我們說(shuō)過(guò),SIP 的 UA 是平等的,如果一方知道另一方的地址,就可以通信。我們先來(lái)做一個(gè)實(shí)驗。在筆者的機器上,我啟動(dòng)了兩個(gè)軟電話(huà)(UA), 一個(gè)是 bob 的 X-Lite(左),另一個(gè)是 alice 是 Zoiper。它們的 IP 地址都是 192.168.4.4,而端口號分別是 26000 和 5090,當 bob 呼叫 alice 時(shí),它只需直接呼叫 alice 的 SIP 地址:sip:alice@192.168.4.4:5090。如圖,alice 的電話(huà)正在振鈴:

    詳細的呼叫流程圖為:

    bob               alice
    |                     |
    |    INVITE           |
    |-------------------->|
    |    100 Trying       |
    |<--------------------|
    |    180 Ringing      |
    |<--------------------|
    |    200 OK           |
    |<--------------------|
    |    ACK              |
    |-------------------->|
    |                     |
    |<---RTP------------->|
    |<---RTP------------->|
    |<---RTP------------->|
    |    ...              |
    |                     |
    |    BYE              |
    |<--------------------|
    |    200 OK           |
    |-------------------->|
    |                     |

    首先 bob 向 alice 發(fā)送 INVITE 請求建立 SIP 連接,alice 的 UA 回 100 Trying 說(shuō)我收到你的請求了,先等會(huì ),接著(zhù) alice 的電話(huà)開(kāi)始振鈴,并給對回消息 180 Ringing 說(shuō)我這邊已經(jīng)振鈴了,alice 一會(huì )就過(guò)來(lái)接電話(huà),bob 的 UA 收到該消息后可以播放回鈴音。接著(zhù) alice 接了電話(huà),她發(fā)送 200 OK 消息給 bob,該消息是對 INVITE 消息的最終響應,而先前的 100 和 180 消息都是臨時(shí)狀態(tài),只是表明呼叫進(jìn)展的情況。 bob 收到 200 后向 alice 回 ACK 證實(shí)消息。 INVITE - 200 - ACK 完成三次握手,它們合在一起稱(chēng)作一個(gè)對話(huà)(Dialogue)。這時(shí)候 bob 已經(jīng)在跟 alice 能通話(huà)了,他們通話(huà)的內容(語(yǔ)音數據)是在SIP之外的 RTP 包中傳遞的,我們后面再詳細討論。

    最后,alice 掛斷電話(huà),向 bob 送 BYE 消息,bob 收到 BYE 后回送 200 OK,通話(huà)完畢。其中 BYE 和 200 OK 也是一個(gè)對話(huà),而上面的所有消息,稱(chēng)作一個(gè)會(huì )話(huà)(Session)。

    反過(guò)來(lái)也一樣,alice 可以直接呼叫 bob 的地址: sip:bob@192.168.4.4:26000。

    上面描述了一個(gè)最簡(jiǎn)單的 SIP 呼叫流程。實(shí)際上,SIP 還有其它一些消息,它們大致可分為請求和響應兩類(lèi)。請求由 UAC 發(fā)出,到達 UAS 后, UAS 回送響應消息。某些響應消息需要證實(shí)(ACK),以完成三次握手。其中請求消息包括 INVITE、ACK、OPTIOS、BYE、CANCEL、REGISTER 以及一些擴展 re-INVITE、PRACK、SUBSCRIBE、NOTIFY、UPDATE、MESSAGE、REFER等。而響應消息則都包含一個(gè)狀態(tài)碼。跟 HTTP 響應類(lèi)似,狀態(tài)碼有三位數字組成。其中,1xx 組的響應為臨時(shí)狀態(tài),表明呼叫進(jìn)展的情況;2xx 表明請求已成功處理;3xx 表明 SIP 請求需要轉向到另一個(gè) UAS 處理;4xx 表明請求失敗,這種失敗一般是由客戶(hù)端或網(wǎng)絡(luò )引起的,如密碼錯誤等;5xx 為服務(wù)器內部錯誤;6xx 為更嚴重的錯誤。

    通過(guò) B2BUA 呼叫

    在真實(shí)世界中,bob 和 alice 肯定要經(jīng)常改變位置,那么它們的 SIP 地址也會(huì )相應改變,并且,如果他們之中有一個(gè)或兩個(gè)處于 NAT 的網(wǎng)絡(luò )中時(shí),直接通信就更困難了。所以,他們通常會(huì )借助于一個(gè)服務(wù)器來(lái)相互通信。通過(guò)注冊到服務(wù)器上,他們都可以獲得一個(gè)服務(wù)器上的 SIP 地址。注冊服務(wù)器的地址一般是不變的,因此他們的 SIP 地址就不會(huì )發(fā)生變化,因而,他們總是能夠進(jìn)行通信。

    我們讓他們兩個(gè)都注冊到 FreeSWITCH 上。上面已經(jīng)說(shuō)過(guò),FreeSWITCH 監聽(tīng)的端口是 SIP 默認的端口 5060。bob 和 alice 注冊后,他們分別獲得了一個(gè)服務(wù)器的地址(SIP URI):sip:bob@192.168.4.4 和 sip:alice@192.168.4.4(默認的端口號 5060 可以省略)。

    下面是 bob 呼叫 alice 的流程。需要指出,如果 bob 只是發(fā)起呼叫而不接收呼叫,他并不需要向 FreeSWITCH 注冊(有些軟交換服務(wù)器需要先注冊才能發(fā)起呼叫,但 SIP 是不強制這么做的)。

    ------------------------------------------------------------------------
    recv 1118 bytes from udp/[192.168.4.4]:26000 at 13:31:39.938891:
    ------------------------------------------------------------------------
    INVITE sip:alice@192.168.4.4 SIP/2.0
    Via: SIP/2.0/UDP 192.168.4.4:26000;branch=z9hG4bK-d8754z-56adad736231f024-1---d8754z-;rport
    Max-Forwards: 70
    Contact: <sip:bob@192.168.4.4:26000>
    To: "alice"<sip:alice@192.168.4.4>
    From: "Bob"<sip:bob@192.168.4.4>;tag=15c8325a
    Call-ID: YWEwYjNlZTZjOWZjNDg3ZjU3MjQ3MTA1ZmQ1MDM5YmQ.
    CSeq: 1 INVITE
    Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFO
    Content-Type: application/sdp
    User-Agent: X-Lite release 1014k stamp 47051
    Content-Length: 594

    上面的消息中省略了 SDP 的內容,我們將留到以后再探討。bob 的 UAC 通過(guò) INVITE 消息向 FreeSWITCH 發(fā)起請求。bob 的 UAC 用的是 X-Lite(User-Agent),它運行在端口 26000 上(實(shí)際上,它默認在端口也是 5060,但由于在我的實(shí)驗環(huán)境下它也是跟 FreeSWITCH 運行在一臺機器上,已被占用,因此它需要選擇另一個(gè)端口)。其中,From 為主叫用戶(hù)的地址,To 為被叫用戶(hù)的地址。此時(shí) FreeSWITCH 作為一個(gè) UAS 接受請求并進(jìn)行響應。它得知 bob 要呼叫 alice,需要在自己的數據庫中查找 alice 是否已在服務(wù)器上注冊,好知道應該怎么找到 alice。但在此之前,它先通知 bob 它已經(jīng)收到了他的請求。

    ------------------------------------------------------------------------
    send 345 bytes to udp/[192.168.4.4]:26000 at 13:31:39.940278:
    ------------------------------------------------------------------------
    SIP/2.0 100 Trying
    Via: SIP/2.0/UDP 192.168.4.4:26000;branch=z9hG4bK-d8754z-56adad736231f024-1---d8754z-;rport=26000
    From: "Bob"<sip:bob@192.168.4.4>;tag=15c8325a
    To: "alice"<sip:alice@192.168.4.4>
    Call-ID: YWEwYjNlZTZjOWZjNDg3ZjU3MjQ3MTA1ZmQ1MDM5YmQ.
    CSeq: 1 INVITE
    User-Agent: FreeSWITCH-mod_sofia/1.0.trunk-16981M
    Content-Length: 0       

    FreeSWITCH 通過(guò) 100 Trying 消息告訴 bob “我已經(jīng)收到你的消息了,別著(zhù)急,我正在聯(lián)系 alice 呢...” 該消息稱(chēng)為呼叫進(jìn)展消息。

    ------------------------------------------------------------------------
    send 826 bytes to udp/[192.168.4.4]:26000 at 13:31:39.943392:
    ------------------------------------------------------------------------
    SIP/2.0 407 Proxy Authentication Required
    Via: SIP/2.0/UDP 192.168.4.4:26000;branch=z9hG4bK-d8754z-56adad736231f024-1---d8754z-;rport=26000
    From: "Bob"<sip:bob@192.168.4.4>;tag=15c8325a
    To: "alice" <sip:alice@192.168.4.4>;tag=B4pem31jHgtHS
    Call-ID: YWEwYjNlZTZjOWZjNDg3ZjU3MjQ3MTA1ZmQ1MDM5YmQ.
    CSeq: 1 INVITE
    User-Agent: FreeSWITCH-mod_sofia/1.0.trunk-16981M
    Accept: application/sdp
    Allow: INVITE, ACK, BYE, CANCEL, OPTIONS, MESSAGE, UPDATE, INFO, REGISTER, REFER,
        NOTIFY, PUBLISH, SUBSCRIBE
    Supported: timer, precondition, path, replaces
    Allow-Events: talk, presence, dialog, line-seize, call-info, sla,
        include-session-description, presence.winfo, message-summary, refer
    Proxy-Authenticate: Digest realm="192.168.4.4",
        nonce="31c5c3e0-cc6e-46c8-a661-599b0c7f87d8", algorithm=MD5, qop="auth"
    Content-Length: 0

    但就在此時(shí),FreeSWITCH 發(fā)現 bob 并不是授權用戶(hù),因而它需要確認 bob 的身份。它通過(guò)發(fā)送帶有 Digest 驗證信息的 407 消息來(lái)通知 bob(注意,這里與注冊流程中的 401 不同)。

    ------------------------------------------------------------------------
    recv 319 bytes from udp/[192.168.4.4]:26000 at 13:31:39.945314:
    ------------------------------------------------------------------------
    ACK sip:alice@192.168.4.4 SIP/2.0
    Via: SIP/2.0/UDP 192.168.4.4:26000;branch=z9hG4bK-d8754z-56adad736231f024-1---d8754z-;rport
    To: "alice" <sip:alice@192.168.4.4>;tag=B4pem31jHgtHS
    From: "Bob"<sip:bob@192.168.4.4>;tag=15c8325a
    Call-ID: YWEwYjNlZTZjOWZjNDg3ZjU3MjQ3MTA1ZmQ1MDM5YmQ.
    CSeq: 1 ACK
    Content-Length: 0

    bob 回送 ACK 證實(shí)消息向 FreeSWITCH 證實(shí)已收到認證要求。并重新發(fā)送 INVITE,這次,附帶了驗證信息。

    ------------------------------------------------------------------------
    recv 1376 bytes from udp/[192.168.4.4]:26000 at 13:31:39.945526:
    ------------------------------------------------------------------------
    INVITE sip:alice@192.168.4.4 SIP/2.0
    Via: SIP/2.0/UDP 192.168.4.4:26000;branch=z9hG4bK-d8754z-87d60b47b6627c3a-1---d8754z-;rport
    Max-Forwards: 70
    Contact: <sip:bob@192.168.4.4:26000>
    To: "alice"<sip:alice@192.168.4.4>
    From: "Bob"<sip:bob@192.168.4.4>;tag=15c8325a
    Call-ID: YWEwYjNlZTZjOWZjNDg3ZjU3MjQ3MTA1ZmQ1MDM5YmQ.
    CSeq: 2 INVITE
    Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFO
    Content-Type: application/sdp
    Proxy-Authorization: Digest username="bob",realm="192.168.4.4",
        nonce="31c5c3e0-cc6e-46c8-a661-599b0c7f87d8",
        uri="sip:alice@192.168.4.4",response="327887635344405bcd545da06763c466",
        cnonce="c164b74f625ff2161bd8d47dba3a0ee2",nc=00000001,qop=auth,
        algorithm=MD5
    User-Agent: X-Lite release 1014k stamp 47051
    Content-Length: 594

    這里也省略了 SDP 消息體。

    ------------------------------------------------------------------------
    send 345 bytes to udp/[192.168.4.4]:26000 at 13:31:39.946349:
    ------------------------------------------------------------------------
    SIP/2.0 100 Trying
    Via: SIP/2.0/UDP 192.168.4.4:26000;branch=z9hG4bK-d8754z-87d60b47b6627c3a-1---d8754z-;rport=26000
    From: "Bob"<sip:bob@192.168.4.4>;tag=15c8325a
    To: "alice"<sip:alice@192.168.4.4>
    Call-ID: YWEwYjNlZTZjOWZjNDg3ZjU3MjQ3MTA1ZmQ1MDM5YmQ.
    CSeq: 2 INVITE
    User-Agent: FreeSWITCH-mod_sofia/1.0.trunk-16981M
    Content-Length: 0

    FreeSWITCH 重新回 100 Trying,告訴 bob 呼叫進(jìn)展情況。

    至此,bob 與 FreeSWITCH 之間的通信已經(jīng)初步建立,這種通信的通道稱(chēng)作一個(gè)信道(channel)。該信道是由 bob 的 UA 和 FreeSWITCH 的一個(gè) UA 構成的,我們稱(chēng)它為 FreeSWITCH 的一條腿,叫做 a-leg。

    接下來(lái) FreeSWITCH 要建立另一條腿,稱(chēng)為 b-leg。它通過(guò)查打本地數據庫,得到了 alice 的位置,接著(zhù)啟動(dòng)一個(gè) UA(用作 UAC),向 alice 發(fā)送 INVITE 消息。如下:

    ------------------------------------------------------------------------
    send 1340 bytes to udp/[192.168.4.4]:5090 at 13:31:40.028988:
    ------------------------------------------------------------------------
    INVITE sip:alice@192.168.4.4:5090;rinstance=e7d5364c81f2b879;transport=UDP SIP/2.0
    Via: SIP/2.0/UDP 192.168.4.4;rport;branch=z9hG4bKey90QUyHZQXNN
    Route: <sip:alice@192.168.4.4:5090>;rinstance=e7d5364c81f2b879;transport=UDP
    Max-Forwards: 69
    From: "Bob" <sip:bob@192.168.4.4>;tag=Dp9ZQS3SB26pg
    To: <sip:alice@192.168.4.4:5090;rinstance=e7d5364c81f2b879;transport=UDP>
    Call-ID: 0d74ac35-cca4-122d-81a2-2990e5b2bd3e
    CSeq: 130069214 INVITE
    Contact: <sip:mod_sofia@192.168.4.4:5060>
    User-Agent: FreeSWITCH-mod_sofia/1.0.trunk-16981M
    Allow: INVITE, ACK, BYE, CANCEL, OPTIONS, MESSAGE, UPDATE, INFO, REGISTER, REFER,
        NOTIFY, PUBLISH, SUBSCRIBE
    Supported: timer, precondition, path, replaces
    Allow-Events: talk, presence, dialog, line-seize, call-info, sla,
        include-session-description, presence.winfo, message-summary, refer
    Content-Type: application/sdp
    Content-Disposition: session
    Content-Length: 313
    X-FS-Support: update_display
    Remote-Party-ID: "Bob" <sip:bob@192.168.4.4>;party=calling;screen=yes;privacy=off

    你可以看到,該INVITE 的 Call-ID 與前面的不同,說(shuō)明這是另一個(gè) SIP 會(huì )話(huà)(Session)。另外,它還多了一個(gè) Remote-Party-ID,它主要是用來(lái)支持來(lái)電顯示。因為,在 alice 的話(huà)機上,希望顯示 bob 的號碼,顯示呼叫它的那個(gè) UA(負責 b-leg的那個(gè) UA)沒(méi)什么意義。與普通的 POTS 電話(huà)不同,在 SIP 電話(huà)中,不僅能顯示電話(huà)號碼(這里是 bob),還能顯示一個(gè)可選的名字(“Bob”)。這也說(shuō)明了 FreeSWITCH 這個(gè) B2BUA 本身是一個(gè)整體,它雖然是以一個(gè)單獨的 UA 呼叫 alice,但還是跟負責 bob 的那個(gè) UA 有聯(lián)系--就是這種背靠背的串聯(lián)。

    ------------------------------------------------------------------------
    recv 309 bytes from udp/[192.168.4.4]:5090 at 13:31:40.193634:
    ------------------------------------------------------------------------
    SIP/2.0 100 Trying
    Via: SIP/2.0/UDP 192.168.4.4;rport=5060;branch=z9hG4bKey90QUyHZQXNN
    To: <sip:alice@192.168.4.4:5090;rinstance=e7d5364c81f2b879;transport=UDP>
    From: "Bob" <sip:bob@192.168.4.4>;tag=Dp9ZQS3SB26pg
    Call-ID: 0d74ac35-cca4-122d-81a2-2990e5b2bd3e
    CSeq: 130069214 INVITE
    Content-Length: 0

    跟上面的流程差不多,alice回的呼叫進(jìn)展。此時(shí),alice 的 UA 開(kāi)始振鈴。

    ------------------------------------------------------------------------
    recv 431 bytes from udp/[192.168.4.4]:5090 at 13:31:40.193816:
    ------------------------------------------------------------------------
    SIP/2.0 180 Ringing
    Via: SIP/2.0/UDP 192.168.4.4;rport=5060;branch=z9hG4bKey90QUyHZQXNN
    Contact: <sip:alice@192.168.4.4:5090;rinstance=e7d5364c81f2b879;transport=UDP>
    To: <sip:alice@192.168.4.4:5090;rinstance=e7d5364c81f2b879;transport=UDP>;tag=3813e926
    From: "Bob"<sip:bob@192.168.4.4>;tag=Dp9ZQS3SB26pg
    Call-ID: 0d74ac35-cca4-122d-81a2-2990e5b2bd3e
    CSeq: 130069214 INVITE
    User-Agent: Zoiper rev.5415
    Content-Length: 0

    180也是呼叫進(jìn)展消息,它說(shuō)明,我這邊已經(jīng)準備好了,alice 的電話(huà)已經(jīng)響了,她聽(tīng)到了一會(huì )就會(huì )接聽(tīng)。

    send 1125 bytes to udp/[192.168.4.4]:26000 at 13:31:40.270533:
    ------------------------------------------------------------------------
    SIP/2.0 183 Session Progress
    Via: SIP/2.0/UDP 192.168.4.4:26000;branch=z9hG4bK-d8754z-87d60b47b6627c3a-1---d8754z-;rport=26000
    From: "Bob"<sip:bob@192.168.4.4>;tag=15c8325a
    To: "alice" <sip:alice@192.168.4.4>;tag=cDg7NyjpeSg4m
    Call-ID: YWEwYjNlZTZjOWZjNDg3ZjU3MjQ3MTA1ZmQ1MDM5YmQ.
    CSeq: 2 INVITE
    Contact: <sip:alice@192.168.4.4:5060;transport=udp>
    User-Agent: FreeSWITCH-mod_sofia/1.0.trunk-16981M
    Accept: application/sdp
    Allow: INVITE, ACK, BYE, CANCEL, OPTIONS, MESSAGE, UPDATE, INFO, REGISTER, REFER,
        NOTIFY, PUBLISH, SUBSCRIBE
    Supported: timer, precondition, path, replaces
    Allow-Events: talk, presence, dialog, line-seize, call-info, sla,
        include-session-description, presence.winfo, message-summary, refer
    Content-Type: application/sdp
    Content-Disposition: session
    Content-Length: 267
    Remote-Party-ID: "alice" <sip:alice@192.168.4.4>

    FreeSWITCH 在收到 alice 的 180 Ringing 消息后,便告訴 bob 呼叫進(jìn)展情況,183 與 180 不同的是,它包含 SDP,即接下來(lái)它會(huì )向 bob 發(fā)送 RTP 的媒體流,就是回鈴音。

    ------------------------------------------------------------------------
    recv 768 bytes from udp/[192.168.4.4]:5090 at 13:31:43.251980:
    ------------------------------------------------------------------------
    SIP/2.0 200 OK
    Via: SIP/2.0/UDP 192.168.4.4;rport=5060;branch=z9hG4bKey90QUyHZQXNN
    Contact: <sip:alice@192.168.4.4:5090;rinstance=e7d5364c81f2b879;transport=UDP>
    To: <sip:alice@192.168.4.4:5090;rinstance=e7d5364c81f2b879;transport=UDP>;tag=3813e926
    From: "Bob"<sip:bob@192.168.4.4>;tag=Dp9ZQS3SB26pg
    Call-ID: 0d74ac35-cca4-122d-81a2-2990e5b2bd3e
    CSeq: 130069214 INVITE
    Allow: INVITE, ACK, CANCEL, BYE, NOTIFY, REFER, MESSAGE, OPTIONS, INFO, SUBSCRIBE
    Content-Type: application/sdp
    User-Agent: Zoiper rev.5415
    Content-Length: 226

    alice 接聽(tīng)電話(huà)以后,其 UA 向 FreeSWITCH 送 200 OK,即應答消息。

    ------------------------------------------------------------------------
    send 436 bytes to udp/[192.168.4.4]:5090 at 13:31:43.256692:
    ------------------------------------------------------------------------
    ACK sip:alice@192.168.4.4:5090;rinstance=e7d5364c81f2b879;transport=UDP SIP/2.0
    Via: SIP/2.0/UDP 192.168.4.4;rport;branch=z9hG4bKF72SSpFNv0K8g
    Max-Forwards: 70
    From: "Bob" <sip:bob@192.168.4.4>;tag=Dp9ZQS3SB26pg
    To: <sip:alice@192.168.4.4:5090;rinstance=e7d5364c81f2b879;transport=UDP>;tag=3813e926
    Call-ID: 0d74ac35-cca4-122d-81a2-2990e5b2bd3e
    CSeq: 130069214 ACK
    Contact: <sip:mod_sofia@192.168.4.4:5060>
    Content-Length: 0

    FreeSWITCH 向 alice 回送證實(shí)消息,證實(shí)已經(jīng)知道了。至此,b-leg已經(jīng)完全建立完畢,多半這時(shí) alice 已經(jīng)開(kāi)始說(shuō)話(huà)了:“Hi, bob,你好……”

    ------------------------------------------------------------------------
    send 1135 bytes to udp/[192.168.4.4]:26000 at 13:31:43.293311:
    ------------------------------------------------------------------------
    SIP/2.0 200 OK
    Via: SIP/2.0/UDP 192.168.4.4:26000;branch=z9hG4bK-d8754z-87d60b47b6627c3a-1---d8754z-;rport=26000
    From: "Bob"<sip:bob@192.168.4.4>;tag=15c8325a
    To: "alice" <sip:alice@192.168.4.4>;tag=cDg7NyjpeSg4m
    Call-ID: YWEwYjNlZTZjOWZjNDg3ZjU3MjQ3MTA1ZmQ1MDM5YmQ.
    CSeq: 2 INVITE
    Contact: <sip:alice@192.168.4.4:5060;transport=udp>
    User-Agent: FreeSWITCH-mod_sofia/1.0.trunk-16981M
    Allow: INVITE, ACK, BYE, CANCEL, OPTIONS, MESSAGE, UPDATE, INFO, REGISTER, REFER,
        NOTIFY, PUBLISH, SUBSCRIBE
    Supported: timer, precondition, path, replaces
    Allow-Events: talk, presence, dialog, line-seize, call-info, sla,
        include-session-description, presence.winfo, message-summary, refer
    Session-Expires: 120;refresher=uas
    Min-SE: 120
    Content-Type: application/sdp
    Content-Disposition: session
    Content-Length: 267
    Remote-Party-ID: "alice" <sip:alice@192.168.4.4>

    與此同時(shí),它也給 bob 送應答消息,告訴他電話(huà)已經(jīng)接通了,可以跟 alice 說(shuō)話(huà)了。在需要計費的情況下,應該從此時(shí)開(kāi)始對 bob 的電話(huà)計費。bob 的 UA 收到該消息后啟動(dòng)麥克風(fēng)讓 bob 講話(huà)。

    ------------------------------------------------------------------------
    recv 697 bytes from udp/[192.168.4.4]:26000 at 13:31:43.413025:
    ------------------------------------------------------------------------
    ACK sip:alice@192.168.4.4:5060;transport=udp SIP/2.0
    Via: SIP/2.0/UDP 192.168.4.4:26000;branch=z9hG4bK-d8754z-ef53864320037c04-1---d8754z-;rport
    Max-Forwards: 70
    Contact: <sip:bob@192.168.4.4:26000>
    To: "alice"<sip:alice@192.168.4.4>;tag=cDg7NyjpeSg4m
    From: "Bob"<sip:bob@192.168.4.4>;tag=15c8325a
    Call-ID: YWEwYjNlZTZjOWZjNDg3ZjU3MjQ3MTA1ZmQ1MDM5YmQ.
    CSeq: 2 ACK
    Proxy-Authorization: Digest username="bob",realm="192.168.4.4",
        nonce="31c5c3e0-cc6e-46c8-a661-599b0c7f87d8",
        uri="sip:alice@192.168.4.4",response="327887635344405bcd545da06763c466",
        cnonce="c164b74f625ff2161bd8d47dba3a0ee2",nc=00000001,qop=auth,
        algorithm=MD5
    User-Agent: X-Lite release 1014k stamp 47051
    Content-Length: 0

    bob 在收到應答消息后也需要回送證實(shí)消息。至此 a-leg 也建立完畢。雙方正常通話(huà)。

    [][][][][][] 此處省略 5000 字 [][][][][]

    ------------------------------------------------------------------------
    recv 484 bytes from udp/[192.168.4.4]:5090 at 13:31:49.949240:
    ------------------------------------------------------------------------
    BYE sip:mod_sofia@192.168.4.4:5060 SIP/2.0
    Via: SIP/2.0/UDP 192.168.4.4:5090;branch=z9hG4bK-d8754z-2146ae0ddd113efe-1---d8754z-;rport
    Max-Forwards: 70
    Contact: <sip:alice@192.168.4.4:5090;rinstance=e7d5364c81f2b879;transport=UDP>
    To: "Bob"<sip:bob@192.168.4.4>;tag=Dp9ZQS3SB26pg
    From: <sip:alice@192.168.4.4:5090;rinstance=e7d5364c81f2b879;transport=UDP>;tag=3813e926
    Call-ID: 0d74ac35-cca4-122d-81a2-2990e5b2bd3e
    CSeq: 2 BYE
    User-Agent: Zoiper rev.5415
    Content-Length: 0

    終于聊完了,alice 掛斷電話(huà),發(fā)送 BYE 消息。

    ------------------------------------------------------------------------
    send 543 bytes to udp/[192.168.4.4]:5090 at 13:31:49.950425:
    ------------------------------------------------------------------------
    SIP/2.0 200 OK
    Via: SIP/2.0/UDP 192.168.4.4:5090;branch=z9hG4bK-d8754z-2146ae0ddd113efe-1---d8754z-;rport=5090
    From: <sip:alice@192.168.4.4:5090;rinstance=e7d5364c81f2b879;transport=UDP>;tag=3813e926
    To: "Bob"<sip:bob@192.168.4.4>;tag=Dp9ZQS3SB26pg
    Call-ID: 0d74ac35-cca4-122d-81a2-2990e5b2bd3e
    CSeq: 2 BYE
    User-Agent: FreeSWITCH-mod_sofia/1.0.trunk-16981M
    Allow: INVITE, ACK, BYE, CANCEL, OPTIONS, MESSAGE, UPDATE, INFO, REGISTER, REFER,
        NOTIFY, PUBLISH, SUBSCRIBE
    Supported: timer, precondition, path, replaces
    Content-Length: 0

    FreeSWITCH 返回 OK,b-leg 釋放完畢。

    ------------------------------------------------------------------------
    send 630 bytes to udp/[192.168.4.4]:26000 at 13:31:50.003165:
    ------------------------------------------------------------------------
    BYE sip:bob@192.168.4.4:26000 SIP/2.0
    Via: SIP/2.0/UDP 192.168.4.4;rport;branch=z9hG4bKggvjUH0rS99tc
    Max-Forwards: 70
    From: "alice" <sip:alice@192.168.4.4>;tag=cDg7NyjpeSg4m
    To: "Bob" <sip:bob@192.168.4.4>;tag=15c8325a
    Call-ID: YWEwYjNlZTZjOWZjNDg3ZjU3MjQ3MTA1ZmQ1MDM5YmQ.
    CSeq: 130069219 BYE
    Contact: <sip:alice@192.168.4.4:5060;transport=udp>
    User-Agent: FreeSWITCH-mod_sofia/1.0.trunk-16981M
    Allow: INVITE, ACK, BYE, CANCEL, OPTIONS, MESSAGE, UPDATE, INFO, REGISTER, REFER,
        NOTIFY, PUBLISH, SUBSCRIBE
    Supported: timer, precondition, path, replaces
    Reason: Q.850;cause=16;text="NORMAL_CLEARING"
    Content-Length: 0

    接下來(lái) FreeSWITCH 給 bob 發(fā)送 BYE,通知要拆線(xiàn)了。出于對 bob 負責,它包含了掛機原因(Hangup Cause),此處 NOMAL_CLEARING 表示正常釋放。

    ------------------------------------------------------------------------
    recv 367 bytes from udp/[192.168.4.4]:26000 at 13:31:50.111765:
    ------------------------------------------------------------------------
    SIP/2.0 200 OK
    Via: SIP/2.0/UDP 192.168.4.4;rport=5060;branch=z9hG4bKggvjUH0rS99tc
    Contact: <sip:bob@192.168.4.4:26000>
    To: "Bob"<sip:bob@192.168.4.4>;tag=15c8325a
    From: "alice"<sip:alice@192.168.4.4>;tag=cDg7NyjpeSg4m
    Call-ID: YWEwYjNlZTZjOWZjNDg3ZjU3MjQ3MTA1ZmQ1MDM5YmQ.
    CSeq: 130069219 BYE
    User-Agent: X-Lite release 1014k stamp 47051
    Content-Length: 0

    bob 回送 OK,a-leg 釋放完畢,通話(huà)結束。從下圖可以很形象地看出 FreeSWITCH 的兩條“腿”-- a-leg 和 b-leg。 

    整個(gè)呼叫流程圖示如下:

    bob (UAC)           [ UAS-UAC ]          (UAS) alice
     |                     |   |                     |
     |   INVITE            |   |                     |
     |-------------------->|   |                     |
     |   100 Trying        |   |                     |
     |<--------------------|   |                     |
     |   407 Authentication Required                 |
     |<--------------------|   |                     |
     |   ACK               |   |                     |
     |-------------------->|   |                     |
     |   INVITE            |   |                     |
     |-------------------->|   |                     |
     |   100 Trying        |   |    INVITE           |
     |<--------------------<   >-------------------->|
     |                     |   |    100 Trying       |
     |                     |   |<--------------------|
     |   183 Progress      |   |    180 Ringing      |
     |<--------------------<   |<--------------------|
     |                     |   |    200 OK           |
     |                     |   |<--------------------|
     |   200 OK            |   |    ACK              |
     |<--------------------<   >-------------------->|
     |   ACK               |   |                     |
     |-------------------->|   |                     |
     |                                               |
     |                Call Connected                 |
     |                                               |
     |                     |   |     BYE             |
     |                     |   |<--------------------|
     |   BYE               |   |    200 OK           |
     |<--------------------<   >-------------------->|
     |   200 OK            |   |                     |
     |-------------------->|   |                     |
     |                     |   |                     |

    從流程圖可以看出,右半部分跟上一節“UA間直接呼叫”一樣,而左半部分也類(lèi)似。這就更好的說(shuō)明了實(shí)際上有 4 個(gè) UA (兩對)參與到了通信中,并且,有兩個(gè) Session。

    再論 SIP URI

    上面我們介紹了一些 FreeSWITCH 的基本概念,并通過(guò)一個(gè)真正的呼叫流程講解了一下 SIP。由于實(shí)驗中所有 UA 都 運行在一臺機器上,這可能會(huì )引起迷惑,如果我們有三臺服務(wù)器,那么情況可能是:

                        /---------------\
                        |  FreeSWITCH   |
                        |  192.168.0.1  |
                        \ --------------/
    sip:bob@192.168.0.1    /          \     sip:alice@192.168.0.1
                          /            \
                         /              \
      /-----------------\               /-----------------\
      |  bob            |               |  alice          |
      |  192.168.0.100  |               |  192.168.0.200  |
      \-----------------/               \-----------------/

      sip:bob@192.168.0.100                sip:alice@192.168.0.200

    alice 注冊到 FreeSWITCH,bob呼叫她時(shí),使用她的服務(wù)器地址,即 sip:alice@192.168.0.1,FreeSWITCH 接到請求后,查找本地數據庫,發(fā)現 alice 的實(shí)際地址是 sip:alice@192.168.0.200,便可以建立呼叫。

    SIP URI 除使用 IP 地址外,也可以使用域名,如 sip:alice@freeswitch.org.cn。更高級也更復雜的配置則需要 DNS 的 SRV 記錄,在此就不做討論了。 

    分享到: 收藏

    專(zhuān)題

    亚洲精品网站在线观看不卡无广告,国产a不卡片精品免费观看,欧美亚洲一区二区三区在线,国产一区二区三区日韩 浦县| 阆中市| 府谷县| 昌黎县| 绥德县| 平湖市| 丰镇市| 盐亭县| 峡江县| 定西市| 镇沅| 容城县| 神池县| 荣成市| 丘北县| 汉中市| 绵竹市| 舞阳县| 平阳县| 凤冈县| 余江县| 江达县| 南宫市| 吐鲁番市| 泽普县| 砚山县| 平乐县| 桐梓县| 论坛| 井研县| 宿州市| 海阳市| 鄂尔多斯市| 禄丰县| 长沙市| 西盟| 拜泉县| 四子王旗| 哈巴河县| 洛宁县| 冷水江市| http://444 http://444 http://444 http://444 http://444 http://444