SIP如何在蜂窝网络上工作?

Jun*_*ang 4 android voip sip

我只是对SIP的工作方式感到困惑,而我的却没有。我做了一个简单的Android服务器,它打开了服务器套接字,并监听3G / 4G网络上的传入连接。然后,我做了一个连接服务器的客户端,该连接被运营商的防火墙(AT&T)阻止了。

之后,我下载了一个基于SIP的开源VOIP应用程序,并在SIP代理上注册了这2部电话,让他​​们彼此呼叫,这非常完美。

我对SIP在蜂窝网络上的工作方式感到困惑,SIP是p2p协议,SIP代理仅用于重定向。这两个电话在VOIP会话中如何相互连接?为什么此连接没有被运营商阻止?有人可以向我解释吗?先感谢您!

更新:我只是尝试在AT&T和SPRINT网络之间发送UDP数据包,它不起作用;(

Sha*_*ell 5

在基本SIP中,端点媒体流量通常像您所说的那样以P2P方式在彼此之间直接通信。他们这样做是为了在SIP SDP协商中为彼此提供地址/端口。

在“完美”的网络世界中,这可以正常工作,因为所有端点都可以彼此直接通信。

众所周知,事实并非如此。

在大多数情况下,IPv4世界的主要障碍是NAT。

人们想到的第一个解决方案是STUN。STUN将从NAT后面为您提供您正在使用的“公共” IP地址,SIP堆栈将在SIP / SDP数据包中使用该IP地址。只要打孔就可以使用。

人们想到的下一个解决方案是TURN。TURN是UDP代理,它允许客户端(例如SIP客户端)从公共网络(即Internet)分配和使用专用网络上的IP地址/端口。它应该在所有情况下都可以工作,但是会在TURN服务器上增加很多网络开销。它不会像P2P连接那样高效。使用TURN的好处是并非双方都需要支持它才能正常工作。因此,当您在Internet上的软件电话与内部网络上的硬件SIP设备之间进行交谈时,这非常好。

人们想出的下一个解决方案是ICE。两个SIP端点都需要支持ICE。它通过扩展SDP协议以使其能够在SDP协商中添加所有可能的连接(所有本地网络适配器,由STUN提供的公共地址和TURN分配的优先级顺序的地址)来工作。然后,一侧通过列出​​的连接并尝试建立连接。如果没有其他方法,则这两个连接都可以“尝试”连接P2P,并回退到TURN连接。它也应该在任何网络环境到任何网络环境中工作,并在SIP端点之间找到最有效的网络路径。ICE的缺点是两个SIP端点都需要支持ICE才能正常工作。(顺便说一句,ICE / TURN / STUN现在是WEBRTC的要求 网络浏览器之间出于相同原因相互对话的协议)

其他可能的解决方案是让您在中间使用某种“智能” sip代理,如果另一端不支持,则可能会在一侧伪造ICE。另一个是如果需要转码,则需要某种媒体网关或B2BUA,这将与TURN tho存在相同的问题。

我建议您尽可能使用STUN,TURN和ICE设置SIP客户端,这将增加SIP呼叫实际工作的可能性。

至于为什么您的案件现在不起作用,则需要网络和/或SIP日志来了解确切的障碍是什么。