1. 程式人生 > >android大牛MrJing 活動中心

android大牛MrJing 活動中心

要想做出好的視訊通話軟體,必須瞭解視訊通話的主要技術。下面是總結的一些技術,僅供參考。

1、支援標準SIP協議。

SIP是類似於HTTP的基於文字的協議。SIP可以減少應用特別是高階應用的開發時間。由於基於IP協議的SIP利用了IP網路,固定網運營商也會逐漸認識到SIP技術對於他們的深遠意義。
 SIP(Session Initiation Protocol)是一個應用層的信令控制協議。用於建立、修改和釋放一個或多個參與者的會話。這些會話可以是Internet多媒體會議、IP電話或多媒體分發。會話的參與者可以通過組播(multicast)、網狀單播(unicast)或兩者的混合體進行通訊。   使用 SIP,服務提供商可以隨意選擇標準組件。不論媒體內容和參與方數量,使用者都可以查詢和聯絡對方。SIP 對會話進行協商,以便所有參與方都能夠就會話功能達成一致以及進行修改。它甚至可以新增、刪除或轉移使用者。   SIP它既不是會話描述協議,也不提供會議控制功能。為了描述訊息內容的負載情況和特點,SIP 使用 Internet 的會話描述協議 (SDP) 來描述終端裝置的特點。SIP 自身也不提供服務質量 (QoS),它與負責語音質量的資源預留協議(RSVP) 互操作。它還與若干個其他協議進行協作,包括負責定位的輕型目錄訪問協議(LDAP)、負責身份驗證的遠端身份驗證撥入使用者服務 (RADIUS) 以及負責實時傳輸的 RTP 等多個協議。  
SIP 規定了以下基本的通訊要求:  

 1. 使用者定位服務  

 2. 會話建立  

 3. 會話參與方管理   

   4. 特點的有限確定
SIP 會話使用多達四個主要元件:

SIP 使用者代理、SIP 註冊伺服器、SIP 代理伺服器和 SIP 重定向伺服器。這些系統通過傳輸包括了 SDP 協議(用於定義訊息的內容和特點)的訊息來完成 SIP 會話。下面概括性地介紹各個 SIP 元件及其在此過程中的作用。
3.1、SIP 使用者代理
  SIP 使用者代理(UA) 是終端使用者裝置,如用於建立和管理 SIP 會話的行動電話、多媒體手持裝置、PC、PDA 等。使用者代理客戶機發出訊息。使用者代理伺服器對訊息進行響應。
3.2、SIP 註冊伺服器
  SIP 註冊伺服器是包含域中所有使用者代理的位置的資料庫。在 SIP 通訊中,這些伺服器會檢索參對方的 IP 地址和其他相關資訊,並將其傳送到 SIP 代理伺服器。
3.3、SIP 代理伺服器
  SIP 代理伺服器接受 SIP UA 的會話請求並查詢 SIP 註冊伺服器,獲取收件方 UA 的地址資訊。然後,它將會話邀請資訊直接轉發給收件方 UA(如果它位於同一域中)或代理伺服器(如果 UA 位於另一域中)。
3.4、SIP 重定向伺服器
  SIP 重定向伺服器允許 SIP 代理伺服器將 SIP 會話邀請資訊定向到外部域。SIP 重定向伺服器可以與 SIP 註冊伺服器和 SIP 代理伺服器同在一個硬體上。

 SIP 的一個重要特點是它不定義要建立的會話的型別,而只定義應該如何管理會話。有了這種靈活性,也就意味著SIP可以用於眾多應用和服務中,包括互動式遊戲、音樂和視訊點播以及語音、視訊和 Web 會議。SIP訊息是基於文字的,因而易於讀取和除錯。新服務的程式設計更加簡單,對於設計人員而言更加直觀。SIP如同電子郵件客戶機一樣重用 MIME 型別描述,因此與會話相關的應用程式可以自動啟動。SIP 重用幾個現有的比較成熟的 Internet 服務和協議,如 DNS、RTP、RSVP 等。不必再引入新服務對 SIP 基礎設施提供支援,因為該基礎設施很多部分已經到位或現成可用。   對 SIP 的擴充易於定義,可由服務提供商在新的應用中新增,不會損壞網路。網路中基於 SIP 的舊裝置不會妨礙基於 SIP 的新服務。例如,如果舊 SIP 實施不支援新的 SIP 應用所用的方法/標頭,則會將其忽略。   SIP 獨立於傳輸層。因此,底層傳輸可以是採用 ATM 的 IP。SIP 使用使用者資料報協議(UDP) 以及傳輸控制協議(TCP),將獨立於底層基礎設施的使用者靈活地連線起來。SIP 支援多裝置功能調整和協商。如果服務或會話啟動了視訊和語音,則仍然可以將語音傳輸到不支援視訊的裝置,也可以使用其他裝置功能,如單向視訊流傳輸功能。   通訊提供商及其合作伙伴和使用者越來越渴求新一代基於 IP 的服務。現在有了 SIP(The Session Initiation Protocol 會話啟動協議),一解燃眉之急。SIP 是不到十年前在電腦科學實驗室誕生的一個想法。它是第一個適合各種媒體內容而實現多使用者會話的協議,現在已成了 Internet 工程任務組 (IETF) 的規範。   今天,越來越多的運營商、CLEC(競爭本地運營商)和 ITSP(IP 電話服務商)都在提供基於 SIP 的服務,如市話和長途電話技術、線上資訊和即時訊息、IP Centrex/Hosted PBX、語音簡訊、push-to-talk(按鍵通話)、多媒體會議等等。獨立軟體供應商 (ISV) 正在開發新的開發工具,用來為運營商網路構建基於 SIP 的應用程式以及 SIP 軟體。網路裝置供應商 (NEV) 正在開發支援 SIP 信令和服務的硬體。現在,有眾多 IP 電話、使用者代理、網路代理伺服器、VOIP 閘道器、媒體伺服器和應用伺服器都在使用 SIP。   SIP 從類似的權威協議--如 Web 超文字傳輸協議(HTTP) 格式化協議以及簡單郵件傳輸協議(SMTP) 電子郵件協議--演變而來並且發展成為一個功能強大的新標準。但是,儘管 SIP 使用自己獨特的使用者代理和伺服器,它並非自成一體地封閉工作。SIP 支援提供融合的多媒體服務,與眾多負責身份驗證、位置資訊、語音質量等的現有協議協同工作。   SIP 較為靈活,可擴充套件,而且是開放的。它激發了 Internet 以及固定和移動 IP 網路推出新一代服務的威力。SIP 能夠在多臺 PC 和電話上完成網路訊息,模擬 Internet 建立會話。   與存在已久的國際電信聯盟(ITU) SS7 標準(用於呼叫建立)和 ITU H.323 視訊協議組合標準不同,SIP 獨立工作於底層網路傳輸協議和媒體。它規定一個或多個參與方的終端裝置如何能夠建立、修改和中斷連線,而不論是語音、視訊、資料或基於 Web 的內容。   SIP 大大優於現有的一些協議,如將 PSTN 音訊訊號轉換為 IP 資料包的媒體閘道器控制協議(MGCP)。因為 MGCP 是封閉的純語音標準,所以通過信令功能對其進行增強比較複雜,有時會導致訊息被破壞或丟棄,從而妨礙提供商增加新的服務。而使用 SIP,程式設計人員可以在不影響連線的情況下在訊息中增加少量新資訊。   例如,SIP 服務提供商可以建立包含語音、視訊和聊天內容的全新媒體。如果使用 MGCP、H.323 或 SS7 標準,則提供商必須等待可以支援這種新媒體的協議新版本。而如果使用 SIP,儘管閘道器和裝置可能無法識別該媒體,但在兩個大陸上設有分支機構的公司可以實現媒體傳輸。   而且,因為 SIP 的訊息構建方式類似於 HTTP,開發人員能夠更加方便便捷地使用通用的程式語言(如 Java)來建立應用程式。對於等待了數年希望使用 SS7 和高階智慧網路(AIN) 部署呼叫等待、主叫號碼識別以及其他服務的運營商,現在如果使用 SIP,只需數月時間即可實現高階通訊服務的部署。   這種可擴充套件性已經在越來越多基於 SIP 的服務中取得重大成功。Vonage 是針對使用者和小企業使用者的服務提供商。它使用 SIP 向用戶提供 20,000 多條數字市話、長話及語音郵件線路。Deltathree 為服務提供商提供 Internet 電話技術產品、服務和基礎設施。它提供了基於 SIP 的 PC 至電話解決方案,使 PC 使用者能夠呼叫全球任何一部電話。Denwa Communications 在全球範圍內批發語音服務。它使用 SIP 提供 PC 至 PC 及電話至 PC 的主叫號碼識別、語音郵件,以及電話會議、統一通訊、客戶管理、自配置和基於 Web 的個性化服務。   某些權威人士預計,SIP 與 IP 的關係將發展成為類似 SMTP 和 HTTP 與 Internet 的關係,但也有人說它可能標誌著 AIN 的終結。迄今為止,3G 界已經選擇 SIP 作為下一代行動網路的會話控制機制。Microsoft 已經選擇 SIP 作為其實時通訊策略並在 Microsoft XP、Pocket PC 和 MSN Messenger 中進行了部署。Microsoft 同時宣佈 CE dot net 的下一個版本將使用基於 SIP 的 VoIP 應用介面層,並承諾向用戶 PC 提供基於 SIP 的語音和視訊呼叫。   另外,MCI 正在使用 SIP 向 IP 通訊使用者部署高階電話技術服務。使用者將能夠通知主叫方自己是否有空以及首選的通訊方式,如電子郵件、電話或即時訊息。利用線上資訊,使用者還能夠即時建立聊天會話和召開音訊會議。使用 SIP 將不斷地實現各種功能。


2、DTMF方式支援 RFC2833 或者 SIP INFO
3、語音編碼方式優先順序 G729,G711u,G711a,GSM
4、支援 不加密、VOS加密二種加密方式。
5、支援顯餘額功能
6、支援電話本功能
7、支援通話記錄功能
8、支援讀取手機號碼,設定入sip協議的去電顯示display內
9、支援3G wifi撥打
10、支援NAT穿透

NAT,即Network Address Translation,可譯為網路地址轉換或網路地址翻譯。   

當前的Internet面臨兩大問題,即可用IP地址的短缺和路由表的不斷增大,這使得眾多使用者的接入出現困難。   使用NAT技術可以使一個機構內的所有使用者通過有限的數個(或1個)合法IP地址訪問Internet,從而節省了Internet上的合法IP地址;另一方面,通過地址轉換,可以隱藏內網上主機的真實IP地址,從而提高網路的安全性。   在CCNA階段,主要考察NAT的基本技術,應試者應掌握下述的NAT術語和幾個典型的地址轉換型別。  

 1.NAT術語   在NAT中,有4個地址術語是必須正確理解的,它們是Inside Local、Inside Global、Outside Local和Outside Global   在這些術語中,Inside(內部)是指那些由機構或企業所擁有的內部網路,這些網路上的主機通常分配了私有地址。這些地址不能直接在Internet上進行路由,從而也就不能直接用於對Internet的訪問,必須通過網路地址的轉換,以合法IP的身份來訪問Internet。前者即InsideLocal地址。後者則為Inside Glob動地址。   Local(本地)的地址是不能在Internet上通訊的IP地址;Global(全域性)的地址是能在Internet上通訊的地址。   Outside(外部)是指除了我們考察的內部網路之外的所有網路。主要指Internets   有了對Inside、Outsider Local和Global4個詞的解釋,讓我們來看一看4個地址的定義。   

●Inside Local Address(內部本地地址)   指一個網路內部分配給網上主機的IP地址,此地址通常不是Internet上的合法地址,即不是網路資訊中心 (NIC)或Internet服務提供商(ISP:internet service provider)所分配的IP地址。   

●Inside Global Address(內部全域性地址)   用來代替一個或者多個內部本地IP地址的、對外的、Internet上合法的IP地址。   

●Outside Local Address(外部本地地址)   一個外部主機相對於內部網所用的IP地址。此地址需要是Internet上合法的地址,但是從內部網可以進行路由的地址空間中進行分配的。  

●Outside Global Address(外部全域性地址)   由主機擁有者分配給在外部網上主機的IP地址。此地址是從一個從全域性可路由的地址或網路空間中分配的。   

2.靜態內部源地址轉換   所謂靜態內部源地址轉換是指將一個內部本地的IP地址轉換成為惟一的內部全域性地址,即私有地址和合法地址之間的靜態一一對映。這種轉換通常用在內部網上的主機需要對外提供服務(如Web、E-mail服務等)的情況下。   

3.動態內部源地址轉換   在動態內部源地址轉換的方式下,一組內部本地地址與一個內部全域性地址池之間建立起一種動態的一一對映關係。這種地址轉換形式下,內部主機可以訪問外部網路,外部主機也能對內部網路進行訪問,但必須是在內網IP地址與內部全域性地址之間存在對映關係時才能成功,並且這種對映關係是動態的。   

4.複用內部全域性地址   Cisco路由器可以把內部全域性地址進行復用性的轉換,從而實現內部本地地址對內部全域性地址的多對一的對映。地址複用被啟用時,路由器在高層協議(如TCP或UDP埠號)維持有關的資訊,將全域性地址轉換為本地地址。當多個內部本地地址對映到同一個全域性地址時,埠號將用來區別不同的本地地址。複用內部全域性地址的技術也被稱為PAT(Port AddressTranslation。埠地址轉換)。

一直以來,說起NAT穿透,很多人都會被告知使用UDP打孔這個技術,基本上沒有人會告訴你如何使用TCP協議去穿透(甚至有的人會直接告訴你TCP協議是無法實現穿透的)。但是,眾所周知的是,UDP是一個無連線的資料報協議,使用它就必須自己維護收發資料包的完整性,這常常會大大增加程式的複雜度,而且一些程式由於某些原因,必須使用TCP協議,這樣就常常令一些開發TCP網路程式的人員“談穿透色變”。那麼,使用TCP協議是不是就不能實現穿透呢?答案當然是否定的:TCP協議不僅能實現NAT穿透,而且實現起來比UDP穿透甚至還簡單一些。

要了解如何使用TCP穿透NAT,就要首先看看如何使用UDP穿透NAT。

我們假設在兩個不同的區域網後面分別有2臺客戶機A和 B,AB所在的區域網都分別通過一個路由器接入網際網路。網際網路上有一臺伺服器S。

現在AB是無法直接和對方傳送資訊的,AB都不知道對方在網際網路上真正的IP和埠, AB所在的區域網的路由器只允許內部向外主動傳送的資訊通過。對於B直接傳送給A的路由器的訊息,路由會認為其“不被信任”而直接丟棄。

要實現 AB直接的通訊,就必須進行以下3步:A首先連線網際網路上的伺服器S併發送一條訊息(對於UDP這種無連線的協議其實直接初始會話傳送訊息即可),這樣S就獲取了A在網際網路上的實際終端(傳送訊息的IP和埠號)。接著 B也進行同樣的步驟,S就知道了AB在網際網路上的終端(這就是“打洞”)。接著S分別告訴A和B對方客戶端在網際網路上的實際終端,也即S告訴A客戶B的會話終端,S告訴B客戶A的會話終端。這樣,在AB都知道了對方的實際終端之後,就可以直接通過實際終端傳送訊息了(因為先前雙方都向外發送過訊息,路由上已經有允許資料進出的訊息通道)。

用UDP來實現以上3步不存在什麼理論上的問題,因為UDP是無連線的協議,它允許socket進行“多對一”的通訊(即幾個具有不同IP和埠號的socket向一個接收socket傳送訊息)。但是使用TCP就出現了問題:在一般情況下,TCP socket不允許在已經建立連線的埠上再進行監聽和使用該本地埠。換句話說,當AB連線上伺服器S後,S將AB的實際終端告訴對方,下一步本該是AB利用對方的實際終端進行直連,但這時你會發現對方的實際終端已經被佔用了(就是各自連線到伺服器S的會話佔用了終端),無法同時listen和 connect。於是很多人得出結論:TCP無法實現NAT穿透。

於是問題的關鍵變成了如何複用一個TCP連線的本地終端,這其實不是協議的問題,而是一個API的問題。幸運的是,所有主流作業系統都支援一個特定的TCP套接字選項——SO_REUSEADDR。這個選項允許將多個socket繫結到同一個本地終端。我們建立socket的時候只要加上這麼一行:

setsockopt(socket, SOL_SOCKET, SO_REUSEADDR, &flag, len) ; //C++就這麼做

_Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, True) '這是vb.net 更加簡單

知道上面的知識就很好辦了,下面我來說說TCP協議的穿透流程:

機器佈局還是和上面使用UDP的一樣。現在假設客戶A想和客戶B建立TCP連線。

首先還是 AB分別和伺服器S分別建立連線,S記錄AB的網際網路實際終端。然後S分別向AB傳送對方的實際終端。接著,從A和B向S連線時使用的埠,AB都非同步呼叫connect函式連線對方的實際終端(就是S告訴的終端),同時,AB雙方都在同一個本地埠監聽到來的連線(也可以先監聽,再connect更好)。由於雙方都向對方傳送了connect請求(假設各自的SYN封包已經穿過了自己的NAT),因此在對方connect請求到達本地的監聽埠時,路由器會認為這個請求是剛剛那個connect會話的一部分,是已經被許可的,本地監聽埠就會用SYN-ACK響應,同意連線。這樣,TCP穿透NAT的點對點連線就成功了。