Ios sip头与专用ip联系。可以吗?

Ios sip头与专用ip联系。可以吗?,ios,iphone,objective-c,sip,pjsip,Ios,Iphone,Objective C,Sip,Pjsip,我正在使用sip客户端,我有一些问题: 在sip头中:联系人字段中,ip应该包含什么?客户端的专用ip还是客户端的网关ip?我看到联系人字段中当前使用的虹吸是: via: sip/2.0/udp gatewayip;.... Contact: <sip:username@privateIP:port;transport=...> To: <sip:username22@serverIP;....> From: <sip:username@serverIP;...&g

我正在使用sip客户端,我有一些问题:

在sip头中:联系人字段中,ip应该包含什么?客户端的专用ip还是客户端的网关ip?我看到联系人字段中当前使用的虹吸是:

via: sip/2.0/udp gatewayip;....
Contact: <sip:username@privateIP:port;transport=...>
To: <sip:username22@serverIP;....>
From: <sip:username@serverIP;...>
via:sip/2.0/udp网关ip;。。。。
联系人:
致:
发件人:
由于某些原因,尝试拨打电话时的INVITE消息无法到达服务器。这可能是原因吗?有人能解释一下吗?注册工作正常

编辑:


我设法用公共ip设置联系人字段。问题仍然存在。可能是因为tcp套接字吗?

联系人标头包含SIP URI,客户端希望在该URI中进行后续请求的联系。这意味着URI的主机部分必须是任何人都可以全局访问的。
如果您的联系人包含一个私有IP(在NAT后面?),那么它是错误的,因为其他同龄人无法通过该IP与您联系。 但是,由于联系人标头用于后续的请求,因此这不是问题的原因。

当你说邀请没有到达服务器时,你的意思是你没有收到来自它的任何响应,还是你收到了一个错误?传出邀请的请求URI是什么?您可以进行Wireshark捕获,以查看它是否到达预期的服务器地址。

正如@Axel83所解释的,
联系人:
标头为每个会话的后续请求定义了一个联系点,即,在REGISTER和INVITE中提供不同的
联系人:
是有效的,但是一些系统使用注册作为身份验证系统,这意味着,为了避免人格化攻击,任何具有不同
联系人:
的请求都将被丢弃

最初,在最后一个场景中,您将收到403响应,但是,也许您可以尝试测试它

另一方面,您可能面临一个SIP应用程序级网关(ALG),它可能会改变您的场景,这可以通过检查服务器中接收到的注册请求来了解。也许,你可以提供一个注册截图

更详细地说,ALG通常知道SIP消息的接收情况,因为源端口和目标端口,这是指,如果它发送到或从5060端口(或5061)发送

这些实体有什么问题?他们把自己放在中间,像中间人攻击一样,通过未知的标准操纵媒体流、连接或请求转发等多个通信方面。这可能会影响您的保持活力机制、新会话的建立以及其他一些事情

知道您在ALG后面的主要症状是发送带有私有IP地址的SIP请求,并在服务器端检查收到的消息是否包含此私有信息,或者是否已被公共地址替换。在前一个场景中,您应该在ALG后面

如果您实际上在ALG后面,最好的避免方法是不使用5060端口作为源(客户端端口)或目标(服务器端)端口,例如,如果您当前正在从IP地址为A.B.C.D:5060的客户端A连接到服务器F.G.E.H:5060,请尝试使用:A.B.C.D:5161 F.G.E.H:5161

这样做的主要原因是,从服务器端看,检查所有通过的流量成本太高,而且ALG是基于源端口和目标端口应用的,而这些端口是标准端口


请注意,在这个建议的解决方案中,您需要在服务器端启用NAT遍历机制(例如星号已经提供)

谢谢您的重播。我确实用wireshark跟踪了数据包,我确实看到invite sip消息传出,但在服务器端我看不到来自客户端的任何流量没有错误,在客户端我确实收到408请求超时。好的,因此它是本地生成的408。您是否在Wireshark中签入了INVITE的目标IP/端口/传输是否与服务器的侦听地址/端口/传输相对应?您的客户端是否收到ICMP通知?否,它不会收到任何ICMP消息。注册和第一次通话都很好。但过了一会儿,当我试图打电话时……什么也没发生。我使用的协议是TCP.Hi jcm。谢谢你的重播。我想告诉你,注册和第一个camm工作正常。我设法将联系人域更改为具有公共ip。在第一次呼叫2分钟或3分钟后,第二次呼叫未到达服务器。可能是因为tcp套接字吗?tcp套接字能在几分钟后从服务器上关闭吗?@justME我知道寄存器工作正常,但ALG不会给您任何注册问题,但在以下请求下,主要问题是,它是随机的,因此确保您不在这种情况下很重要。另一方面,关于TCP连接,最初,它应该保持活动状态,但这取决于网络提供商和服务器的实现,因为TCP保持活动状态机制可以被禁用。在这种情况下,常见的解决方法是从应用程序级别保持活动状态,例如,发送SIP选项消息。在服务器端,如何检查是否启用了tcp保持活动状态机制?我每10分钟重新注册一次客户端。堆栈中所有没有到达服务器的调用最初都会在新注册后到达。基于此,我想这是一个tcp问题。您能告诉我如何检查服务器上的TCP保持活动机制是否已禁用吗?此外,对于客户端上的keep-alive mechanims,我使用pjsua_acc_set_注册。(ios pjsip堆栈)。你认为这可能是问题所在吗?@justME如果你的服务器是Linux平台,我想是这样的:D,你可以检查/proc/sys/net/ipv4/tcp_keepalive_time(这表示第一条保持活动消息之前的时间,以秒为单位)、tcp_keepalive_intvl(保持活动数据包之间的时间间隔)和tcp_keepalive_pro