如何避免被节制?


9

我正在写一个联网的iOS游戏。当以每秒60个数据包(即相邻数据包之间的16毫秒)发送数据包GKMatchSendDataReliable(我假设是UDP并写有自己的数据包接收代码)时,平均ping时间迅速恶化:我在下面打开了7个GameCenter匹配项(一个接一个) ),然后简单地发送了100个数据包(每秒60个数据包)。我测量了平均往返时间,结果如下:

[ 21:16:39 ]:  I saw an average roundtrip time of 52.342787 ms, he saw 54.496590 ms
[ 21:16:34 ]:  I saw an average roundtrip time of 62.631942 ms, he saw 61.991655 ms
[ 21:16:45 ]:  I saw an average roundtrip time of 88.394380 ms, he saw 83.619123 ms
[ 21:16:51 ]:  I saw an average roundtrip time of 179.053118 ms, he saw 156.869141 ms
[ 21:16:57 ]:  I saw an average roundtrip time of 75.025076 ms, he saw 75.419723 ms
[ 21:17:23 ]:  I saw an average roundtrip time of 8832.082488 ms, he saw 7616.877558 ms
[ 21:19:33 ]:  I saw an average roundtrip time of 25088.962344 ms, he saw 16833.064914 ms

经过最后两次测试后,结果约为1000毫秒。

看来我很可能被ISP限制了。由于这是一个iOS游戏,因此人们将使用常规的住宅连接。

当我将数据包发送速率更改为慢10倍(因此每160毫秒发送1个数据包)时,测试所需的时间要长得多,但往返时间始终保持较低水平。

[21:31:27]:我看到平均往返时间为55.289109毫秒,他看到了69.032727毫秒

因此,它看起来想保持较低的连接延迟(并且不会被ISP“惩罚”),我必须降低发送数据包的速率。请记住,这些都是非常小的数据包,例如最大40个字节,但我仍然受到限制。

我正在寻找有关每秒可以发送多少个UDP数据包以避免被限制的指南!哪里有通用准则?


你测试了吗 如果每秒下降10个数据包会怎样?那你会受到严重的节制吗?这可以帮助回答问题的最后一部分。
notlesh

“你可以用一个人如何勒死你来讲述一个人的事情……”哦,你的意思是“油门”的定义:P
Casey,

确保您不仅仅与在UDP之上构建的任何可靠系统使连接饱和。UDP开始退出时,临时恢复系统往往很难正确设置。永远不要将恶意归因于...-
拉尔斯·维克伦德

看来我可能做错了。可能再次是NAGLES。
bobobobo

Answers:


9

甚至不是基于家用PC的动作游戏或大型MMO都以60Hz运行其数据包。再加上具有非常小的数据包大小并不一定是一件好事,这些微小数据包中的每一个在将其发送出去时都有很大的开销。

尝试使用一些客户端插值拍摄10Hz更新。我认为您已经插值了,因为总会有ping延迟。

阅读有关MTU大小的信息,并在其中添加更多信息以涵盖更长的时间范围。传输层的平均数据包大小为1400左右,超过MTU大小的任何内容都会拆分您的消息并导致更多开销。


7

首先,您必须确保整个数据量。您的ISP很可能会关心实际发送的字节,而不是数据报的数量或频率。如果每秒发送60次最大(65507有效载荷八位数)大小的最大数据报,则上游发送速度约为30 Mb / s。并非每个人都有这种联系。

请记住,IP标头的长度为20个八位位组,而UDP标头的长度为8个八位位组。这是您要为每个数据报发送的另外28个八位位组。

如果您没有最大限度地利用连接,则可能在许多地方延迟数据包:客户端的操作系统,网关(可能是无线路由器或电缆调制解调器),ISP,另一对等方的ISP,另一对等方的网关,其他对等方的操作系统。

如果您还没有使用过它,我建议您使用Wireshark,它是诊断网络问题的功能非常强大的工具。可以将其视为调试器的等同物,但适用于网络。

您可以通过以下几种方法来使用Wireshark诊断网络流量:

  • 在与移动设备位于同一网络中的PC上使用Wireshark,并使用混杂集线器,并将您的网络设备设置为混杂

  • 将PC设置为无线网关,然后将您的移动设备连接到该网关,然后在该PC上使用Wireshark收听

  • 在与模拟器相同的机器上运行Wireshark

  • 在设备本身中运行tcpdump(在Android上很容易,在iOS上需要越狱),然后在Wireshark上读取捕获的数据

  • 制作一个简单的程序,该程序可以执行完全相同的操作,但可以在PC上运行,并在其中使用Wireshark。

  • ...还有许多其他

您要检查发送哪些包以及何时发送。例如,如果延迟是在发送之前发生的,那么您就被操作系统限制;而即使您在同一程序的桌面版本上也遇到延迟,这意味着您正在受到某处网络的限制。

通常,如果您受到网络的限制,则应该获取ICMP类型4数据报,因此可以使用这些数据报检查您到底在哪里受到限制。

总而言之,您的软件包延迟的原因有很多,在开始尝试解决问题之前,先找出问题所在是很明智的。


0

我的假设之一似乎是错误的。根据

GKMatchSendDataUnreliable模式下,要在所谓的UDP中传输图像。TCP发送的GKMatchSendDataReliable模式映像。通常应为GKMatchSendDataUnreliable。

将发送模式更改为真实 UDP(即GKMatchSendDataUnreliable似乎可以保持每秒60个数据包的低ping速率。好像我被Nagles吓了一跳

我仍然有奇怪的行为(ping时间非常长),但是我不确定根本原因(ISP或网络拥塞)。

[ 10:30:33 ]:  I saw an average roundtrip time of 39.908923 ms, he saw 48.437794 ms
[ 10:30:39 ]:  I saw an average roundtrip time of 26.278577 ms, he saw 27.023854 ms
[ 10:30:48 ]:  I saw an average roundtrip time of 23.254163 ms, he saw 24.495182 ms
[ 10:30:54 ]:  I saw an average roundtrip time of 37.333127 ms, he saw 34.780404 ms
[ 10:31:03 ]:  I saw an average roundtrip time of 29.198575 ms, he saw 29.071106 ms
[ 10:31:11 ]:  I saw an average roundtrip time of 49.030299 ms, he saw 48.675459 ms
[ 10:31:18 ]:  I saw an average roundtrip time of 34.031792 ms, he saw 34.698117 ms
[ 10:31:24 ]:  I saw an average roundtrip time of 30.058642 ms, he saw 32.814952 ms
[ 10:31:30 ]:  I saw an average roundtrip time of 53.110438 ms, he saw 54.271453 ms
[ 10:31:45 ]:  I saw an average roundtrip time of 119.693933 ms, he saw 107.616359 ms
[ 10:31:50 ]:  I saw an average roundtrip time of 222.644443 ms, he saw 229.589861 ms
[ 10:31:57 ]:  I saw an average roundtrip time of 166.827070 ms, he saw 167.647724 ms
[ 10:32:05 ]:  I saw an average roundtrip time of 765.356593 ms, he saw 859.600923 ms
[ 10:32:13 ]:  I saw an average roundtrip time of 357.522686 ms, he saw 339.648654 ms
[ 10:32:24 ]:  I saw an average roundtrip time of 1115.639593 ms, he saw 1060.574401 ms
[ 10:32:39 ]:  I saw an average roundtrip time of 175.845995 ms, he saw 171.112166 ms
[ 10:32:44 ]:  I saw an average roundtrip time of 47.262925 ms, he saw 41.987869 ms
[ 10:32:52 ]:  I saw an average roundtrip time of 74.524443 ms, he saw 78.868198 ms
[ 10:33:47 ]:  I saw an average roundtrip time of 20.943917 ms, he saw 21.217377 ms
[ 10:33:52 ]:  I saw an average roundtrip time of 28.944821 ms, he saw 29.303144 ms
[ 10:34:06 ]:  I saw an average roundtrip time of 25.581624 ms, he saw 25.439416 ms
[ 10:34:13 ]:  I saw an average roundtrip time of 25.565568 ms, he saw 25.655267 ms
[ 10:34:18 ]:  I saw an average roundtrip time of 38.609394 ms, he saw 37.462835 ms

后来:

[ 10:38:11 ]:  I saw an average roundtrip time of 40.037623 ms, he saw 43.367524 ms
[ 10:38:21 ]:  I saw an average roundtrip time of 121.222703 ms, he saw 118.855264 ms
[ 10:38:28 ]:  I saw an average roundtrip time of 726.391897 ms, he saw 685.742454 ms
[ 10:38:33 ]:  I saw an average roundtrip time of 60.251207 ms, he saw 57.974503 ms
[ 10:38:42 ]:  I saw an average roundtrip time of 1133.909392 ms, he saw 1124.404501 ms     

因此它是零星的,并且一波三折。我想我将不得不尝试其他帖子中的一些建议,例如降低我的数据包发送速率。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.