静音期后WiFi滞后飙升

时间:2012-10-02 13:16:36

标签: sockets networking network-programming udp

我有一个简单的客户端<>服务器设置,其中客户端在端口2000上每秒多次向服务器发送UDP数据包。服务器有一个线程,其中一个开放的BSD套接字侦听端口2000,并使用阻塞recvfrom调用读取数据。而已。我在服务器的recvfrom调用周围设置了一个简单的tic toc计时器,并在通过Wifi运行时绘制了结果。

benchmark graph

当服务器通过Wifi连接到接入点时,它的类似之处通常是recvfrom呼叫也需要0.015秒。然而,在没有发送数据包的短时间无线电静默(大约半秒)之后,服务器上的下一个数据包将导致recvfrom呼叫花费很长时间(在0.6到3秒之间),然后一连串非常快速的通话(约0.000005秒),然后恢复正常(约0.015秒)。以下是一些示例数据:

0.017361 <--normal 
0.014914
0.015633
0.015867
0.015621
...      <-- radio silence
1.168011 <-- spike after period of radio silence
0.000010 <-- bunch of really fast recvfrom calls
0.000005
0.000006
0.000005
0.000006
0.000006
0.000005
0.015950 <-- back to normal
0.015968
0.015915
0.015646

如果你仔细观察,你可以在图表上注意到这一点。

当我通过LAN(即使用电缆)将服务器连接到接入点时,一切正常,并且recvfrom呼叫总是需要大约0.015秒。但是通过Wifi,我得到了这些疯狂的峰值。

这到底是怎么回事?

P.S。服务器运行Mac OS X,客户端是iPhone,在两种情况下都通过Wifi连接到接入点。我尝试在iPad上运行客户端并获得相同的结果。接入点是Apple Airport Extreme基站,其网络使用Apple Airport Express进行扩展。我也试过Thompson路由器和一个简单的(非WDS网络),但仍然遇到同样的问题。

<小时/> 的更新

我在C#上重写了Windows .NET上的服务器部分,并通过Wifi对其进行了测试,保持其他所有内容相同,问题就消失了。所以它表明它是Mac OS X上的OS /网络堆栈/套接字问题。

1 个答案:

答案 0 :(得分:1)

我认为你无能为力。有几件事可能发生:

  1. WiFi MAC层必须为多个用户分配带宽插槽,它通常会尝试为用户提供足够长的时间来发送尽可能多的流量。但是,当其他用户忙碌时,此客户端无法发送流量。您甚至只用一个用户(802.11协议的结果)就可以看到这一点,但当然,您会注意到多个活跃用户。
  2. IOS本身可能会有某种功率节省并缓冲数据包一段时间以发送突发,因此它可以使一些子系统空闲一段时间。
  3. 你有其他一些干扰的无线电信号。
  4. 这不是一个详尽的清单,只是在短时间内只考虑给定输入时我能想到的。

    有一点:0.6到3秒在无线领域并不是一个非常长的时间,它可能很长,但延迟是所有无线通信中最大的问题之一。别忘了大多数无线AP是基于相当陈旧的规格,所以我不会说这些数字是极端的(但我不会期望3s的差距)。