網絡電話的工作過程,問題所在和解決辦法

來源: fitwxc 2011-02-08 13:06:35 [] [博客] [舊帖] [給我悄悄話] 本文已被閱讀: 次 (3583 bytes)
本文內容已被 [ fitwxc ] 在 2011-02-08 14:03:33 編輯過。如有問題,請報告版主或論壇管理刪除.

網上談VOIP(SIP)的很多,但沒有一個說清楚的。VOIP要用到兩種不同的通訊協議,一是SIP,用來向SIP Server注冊;一是RTP,用來最後的IP-IP通話(語音流)。如果這些通訊出問題的話,電話要麽打不通,要麽接通後聽不到聲音。對這些工作過程有所了解,出問題時就比較有思路,對症下藥。

先看上麵沒有路由器的情況。ATA每3600秒左右到SIP Server(比如Sipgate.com)注冊一次,告訴它自己的SIP/IP:PORT(167.187.156.233:5060)。這樣有電話打來時,Sipgate就到167.187.156.233:5060找ATA。找到後,ATA就告訴自己的RTP/IP:PORT(167.187.156.233:16384),SIP Server再把這個信息告訴對方,對方的電話就直接把語音流送往167.187.156.233:16384,通話順利開始。順便提一句:可見最後的通話是不再通過SIP Server的,所以SIP Server不會影響話音質量。

這種情況下出問題隻有兩種可能:1)端口5060被你的ISP阻斷了,注冊不上Sipgate,電話打來時,它就不知道到哪裏去找你的ATA。2)SIP Server看到你的IP是來至它所禁止的國家,拒絕服務。這時ATA不會響鈴,對方也聽不到響鈴。

路由器帶來的問題

如今沒有誰不用路由器的,問題就來了,注意紅色的部分。這時ATA所使用和提供給SIP Server的,和router所使用的用於通話的RTP的地址和端口不一致,從而導致諸多難題。

這時電話打來時,SIP Server還是能像上麵一樣找到你的ATA,所以還會響鈴,因為你的ATA通過SIP協議注冊時,SIP Server會看到你的實際的地址和端口。也就是除了上麵說的兩種,SIP部分不會出額外的狀況。

問題出在語音流部分(RTP),ATA提供給SIP Server的是192.168.1.100:16384,而實際上路由器已把它MAP到了167.187.156.233:55235。進來的語音流去找一個private地址和端口(192.168.1.100:16384),當然是找不到的,於是ATA收不到對方的語音流,也就聽不到對方的聲音(one way audio)。

如果是來電的那方有Router,那麽對方的ATA就有一樣的問題,這時聽不到聲音的是它。如果雙方都有router,那誰都聽不到誰。

哦,這裏還有一個問題,就是router一般會在一段時間後關掉SIP端口(61204)。這時有電話打進來時,SIP Server就無法跟ATA聯係,ATA根本不會知道有來電,鈴都不會響。

解決辦法

先說上麵的最後一個問題,最簡單,在ATA裏啟用NAT Refresh。這樣每隔一段時間(默認是15秒)ATA給SIP Server送一個很小的數據,路由器看到有數據活動,就不會關掉端口(61204)。

其它問題要靠STUN Server來解決,來電時ATA可以通過它知道自己那一刻的public地址(167.187.156.233)和端口(55235)。這樣ATA就可以為SIP Server提供public 167.187.156.233,而不是提供誰都找不到的private 192.168.1.100。如果你想讓你的ATA同時也提供正確的端口號,你還需要啟用NAT Mapping,也就是把16384映射到55235。這樣SIP Server就會得到你的真實的IP和PORT,然後轉告來電的對方,就都妥了。

如果在來電的那一刻ATA和STUN之間的通訊出現問題的話,ATA就得不到正確的地址和端口,那麽還是會出現沒聲音的問題。所以一個可靠的STUN Server至關重要。

其它辦法

如果你不想使用STUN和NAT Mapping的話,那你就需要在router上把16384-16482(不同的ATA這個範圍可能不同)forward到ATA。現在的SIP Server都比較聰明,看到ATA提供的是private地址時,會把它改為public地址,也就是把192.168.1.100替換成167.187.156.233,因為SIP和RTP一般都是來自同一個IP。但是它還是不知道其真實的端口號(55235,與SIP的不同),還是讓對方去找16384。如果你不把16348等forward到ATA的話,語音流就還是到不了ATA。

16384-16482的範圍太廣了,一般用不了那麽多,一般4個就夠了(16384-16387)。所以你可以在ATA裏把這個範圍改一下,那麽你在router上也就隻需要forward少少的4個UDP端口。

有些大公司的路由器阻斷STUN,而你又無法開通這些端口的話,那麽就隻有用RTP Relay的辦法了,這裏主要麵向家用,不說這個。

再回過頭看一下上麵的示意圖裏的紅色部分,能更好的領會這裏所說的。

所有跟帖: 

這是fitwxc講得最清晰的一篇文章。不可不讀! -123泛政治化- 給 123泛政治化 發送悄悄話 123泛政治化 的博客首頁 (0 bytes) () 02/08/2011 postreply 17:46:49

萬分感謝,解釋得清楚極了。 -交流什麽- 給 交流什麽 發送悄悄話 (0 bytes) () 02/08/2011 postreply 20:13:39

在router的防火牆的Application Level Gateway (ALG)中,打開SIP即可。 -old_taoist- 給 old_taoist 發送悄悄話 (26 bytes) () 02/08/2011 postreply 23:58:57

或者吧ata放入DMZ,同時允許NON-UDP/TCP/ICMP LAN SESSIONS -old_taoist- 給 old_taoist 發送悄悄話 (0 bytes) () 02/09/2011 postreply 00:00:11

good theory explanation, now I know what is -longterminvestor- 給 longterminvestor 發送悄悄話 longterminvestor 的博客首頁 (31 bytes) () 02/10/2011 postreply 11:51:02

請您先登陸,再發跟帖!

發現Adblock插件

如要繼續瀏覽
請支持本站 請務必在本站關閉/移除任何Adblock

關閉Adblock後 請點擊

請參考如何關閉Adblock/Adblock plus

安裝Adblock plus用戶請點擊瀏覽器圖標
選擇“Disable on www.wenxuecity.com”

安裝Adblock用戶請點擊圖標
選擇“don't run on pages on this domain”