smartfox和NAT

最近的项目中使用smartfox来作为服务器,并且我们游戏的某些移动消息基于UDP(使用了cs中的entity interpolation技术)。有时,可以在服务器的log里观察到smartfox检测到session的udp端口变化而将udp包直接丢弃,这所带来的问题就很严重。客户端就无法收到服务端的位置更新了。

发生这个问题的原因有两方面:

  1. 路由的NAT机制
  2. smartfox本身的安全机制
对于NAT,即路由器会保存一个地址转换表,用于将内网的地址翻译成外网地址,与外部机器进行通信。对于UDP而言,这里需要映射的就是端口。我们发现,当在某段时间内,如果客户端没有发出任何UDP包,路由器会自动释放该端口(假定为A),随后若客户端继续发包,路由器会重新分配一个端口B,通常A != B。当然,到这里是没有任何问题,所有的NAT对于普通客户端而言是透明的。

由于smartfox自身有一个简单的安全机制,该机制的原理为:当客户端与服务端建立连接后,会记录下使用的socket的端口和地址,若在之后的通信中,无论是端口或者地址变化,都会被检测到,而被认为是一种恶意攻击。这里的问题时,一旦udp端口变化,所有数据将无法从服务端到达客户端。

Smartfox官方论坛上很多人提出过这个问题,但依然没有解决方法。我认为,既然是框架,就可以提供某种手段来定制这种策略,不过官方没有开放相关接口。

由于我们的游戏有面向移动的客户端,所以一旦进入后台,网络通信就受限,非常有可能出现上述问题。不过我们可以改变实现,以TCP来取代UDP。最初我们的实现是TCP,不过由于通信量较大,以及smatfox本身对于出口数据发送实现效率的问题,进而选择了UDP。出现这个问题,又只能切换到TCP,真是。。。如果用TCP来做,那么就只能优化实现来减少数据量。

还有一个问题是UDP在3G网络中的支持。我还没有具体查阅过相关资料,不过听说udp的支持不行,所以现在游戏在3G网络上基本无法运行,所以又只能将实现改为TCP?

EDIT: 我在地铁上用移动网络测试了一下我们的游戏,我的手机网络是Edge,对于udp的支持没有任何问题,只是在信号不稳定的情况下,很容易发生不流畅,所以,现在有些手游,没有那么依赖于服务器,基本上单人的话,就直接本地计算,而服务器做简单验证。当然我不知道他们对于服务器的依赖程度如何,只是一种猜测。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值