第二章、 文獻探討
2.3 網路電話(VoIP)
2.3.1 SIP/SDP
如前所述,撥打網路電話的第一件工作,是必須在通話雙方之間建立連線。
現行的網路使用 IP(Internet Protocol)位址來做為定址工具,想像在撥打每通 電話之前,你都必須先知道對方的 IP 位址,再進行連線的話,那將會是一種非 常沒有效率的作法。VoIP 發展至今,提出了許多建立連線的協定及架構,例如 在 Windows 的 NetMeeting 軟體中使用 H.323 協定,其它又有如 MGCP 及 SIP 等等。
這些協定目的其實都很類似,就是幫助使用者能夠非常快速、且方便地找到欲連 線的對象。
在目前的諸多協定中,SIP(Session Initialization Protocol)[12]已漸漸 成為主流,它以文字為基礎(Text-based)傳送訊息,訊息內容類似 HTTP 的格式 (下一代的 SIP 採用 XML 格式,提供更強的擴充功能),而且它也像 HTTP 一樣,
使用一些數字代碼表示回應訊息(ex.200 OK、404 page not found…etc)。這種 方式的優點就是簡單、易懂,缺點則是相較於 H.323 這類的二進位(binary)傳輸 模式,會佔用更大的頻寬。目前比較新的網路電話均已採用 SIP。因此我們將在 這個小節裡,簡單介紹 SIP 的基本原理及運作流程。
SIP 被規範於 RFC3261,是一種遵循擴散巴科斯形式(Backus–Naur form)的語法 格式。它不僅止在 VoIP 中被使用,在其它一些關於網路會議、多媒體的應用中 亦可看見它的身影。它定義有六項最基本的型式(SIP Method)如下:
1. REGISTER:用於登記聯繫資訊。
2. INVITE:用於邀請用戶加入對話。
3. ACK:對於收到的訊息作出回應。
4. CANCEL:用於取消未完成的請求 5. BYE:用於終止對話。
6. OPTIONS:用於詢問伺服器的性能(較不常被使用)。
我們實際看一個 INVITE 命令長成什麼樣子,如圖 7 所示:
圖 7 SIP INVITE 命令
我們以表 2 簡敘圖 7 中 SIP 夾帶的重要資訊,完整參數列表請參閱 RFC3261。
表 2 SIP 參數說明表
參數 說明
INVITE 表示這是一個邀請他人加入對話的請求。
From 表示發話端的 SIP URI。
To 表示受話端的 SIP URI。From 和 To 的順序不可更換。
Call-ID
用於標識特定邀請或某個客戶端的註冊請求,每一次呼叫 時會隨機產生一個唯一值,用於識別發話端的來源,若 Call-ID 值相同,那麼 Cseq 值必須各不相同,一個多媒體 會議可產生多個 Call-ID 不同的呼叫。
Cseq
用 於 識 別 伺 服 器 發 出 的 不 同 請 求 , 每 次 呼 叫 有 一 個 Command Sequence 值,以識別目前的回履是針對哪一次呼 叫,如果重新發送 INVITE 時這個值需加大。
via 經過了那些位址,可以有多行,後來的由 Proxy Server 加註在前面。
SIP 命令之後經常還會伴隨 SDP(Session Description Protocol)[13],SDP 被規範在 RFC2327 之中,它的內容包括下列四點:
1. 多媒體的種類,video、audio、etc。
2. 傳輸的協定(RTP/UDP/IP,etc)
3. 多媒體使用的 codec
4. 欲接收該多媒體串流所必須知道的資訊(IP 位址、通訊埠,etc) 一個實際的 SDP 內容就有如圖 8 所示的文字訊息:
圖 8 SDP 參數內容範例
我們同樣以表說明上述 SDP 的各項參數(完整參數列表請參閱 RFC),如表 3 所示:
表 3 SDP 參數說明表
參數 說明
v SDP 的版本,此處表示 SDP version = 0。
o
為 Origin 的縮寫,描述連線的來源訊息。例如此處的 Pingtel 為用戶名稱,後面的兩個 5 為隨機產生的戳 記 , 最 後 表 示 Internet IP Version 4 , 位 址 為 18.10.0.79。
c c 為 Connection Information 的縮寫,內容類似 o。
t
t 定義協定訊息發送後的一段有效期間,表示 Repeat Times and Time Xones 的意思。此處的 t=0 0,是省略 了對時間戳記的描述(但 SDP 規定 t 不可省略)。
m m 是 Media Information 的縮寫,表示多媒體的類型及 使用的通訊埠。
a
a 通常緊跟在 m 後面,表示 Attribute Line 的縮寫。即 是發出此 SDP 訊息的使用者所偏好 codec 的優先順序 (越上面的權限越大)。通話雙方可藉由 a 的值來決定此 通話使用的 codec 為何。
SIP 使用類似 DNS 的機制,將使用者的 SIP 號碼與 IP 位址之間做映射 (mapping)動作。即是使用 SIP 建立連線的用戶,會在開啟 VoIP 軟體的同時,在 背景(background)向 SIP Server 發出『REGISTER』的登錄命令,告訴 SIP Server 說:『如果有人想撥打給我,請到 xxx.xxx.xxx.xxx 這個 IP 位址通知我,我使用 xxxxx 連接埠。』
另一個可能讓初學 SIP 的人混淆的問題是,為何會有 SIP 及 SDP 的分別?其實只 要這樣想就不難了,SIP 就好像信封,而 SDP 則是被包裏在其內的信件。SIP 負 責將 SDP 的參數傳送到適合的人手上。
最後我們用圖 9 展示一個簡單的 SIP 建立連線的流程,它僅需要下列四個參 與者:撥打方(UserA)、Proxy Server、Location Server 以及受話方(UserB),
如下圖所示:
圖 9 SIP Signaling Diagram
1. 使用者 UserA 送出 INVITE 訊息至 SIP Proxy Server
2. SIP Proxy 收到後,詢問 Location Server UserB 的位址。
3. Location Server 回傳 UserB 的位址給 Proxy Server。
4. SIP Proxy Server 收到 Location Server 回傳的位置,送出 INVITE 訊息至 UserB。
5. UserB 收到 INVITE 訊息,如果可以進行通話(UserB 接起話筒)即回傳 200 OK 訊息給 SIP Proxy Server
6. SIP Proxy Server 再將 200 OK 訊息回傳至 UserA。
7. UserA 回傳 ACK 確認進行通話至 SIP Proxy Server。
8. SIP Proxy Server 將最後的 ACK 訊息轉送給 UserB。
完成了連線階段,雙方會對彼此產生某種程度的共識,UserA 與 UserB 接著 便以點對點的方式,將語音資料封裝成 RTP 封包傳遞給對方。值得一提的是,SIP 雖然已成為目前主流的連線建立協定,但也有一些研究[4]提出透過 web
services 之類的 middleware 將連線協定再進一步封裝,藉此達到跨平台、跨協 定的功能。