2012-10-02 59 views
0

我有一个简单的客户端<>服务器设置,其中客户端每秒向端口2000多次发送UDP数据包到服务器。服务器有一个线程,它具有一个在端口2000上侦听的开放BSD套接字,并使用阻塞recvfrom调用读取数据。而已。我在服务器的recvfrom调用中设置了一个简单的tic toc计时器,并在通过Wifi运行时绘制了结果。安静期后的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,客户端是通过Wifi连接到接入点的iPhone。我试着在iPad上运行客户端并获得相同的结果。该接入点是Apple Airport Extreme基站,其网络可通过Apple Airport Express进行扩展。我也尝试过使用Thompson路由器和简单的(非WDS网络),但仍然遇到同样的问题。


UPDATE

我在C#中改写了部分服务器在Windows .NET和测试它在无线上网的保持一切相同,问题就消失了。所以这表明它是Mac OS X上的OS /网络堆栈/套接字问题。

+0

无线信道有多忙?这看起来像MAC层造成的突发流量 – KillianDS

+0

你可以使用[Wireshark](http://www.wireshark.org/download.html)来看看吗? – CodeCaster

+0

@KillianDS网络上有大约5个Wifi设备,但它们都很安静。 – lms

回答

1

我不认为你可以对此做任何事情。有几件事情可能发生:

  1. WiFi MAC层必须为多个用户分配带宽插槽,它通常会尝试给用户足够长的时间发送尽可能多的流量。但是,当其他用户忙碌时,该客户端无法发送流量。你甚至可以看到只有一个用户(802.11协议的结果),但是当然你会注意到这是最活跃的用户。
  2. IOS本身可能会有某种省电和缓存数据包一段时间发送突发,所以它可以保持一段时间的一些子系统空闲。
  3. 您还有其他一些干扰的无线电信号。

这不是一个详尽的列表,只是我可以在短时间内想到的只有给定的输入。有一件事:0.6到3秒在无线领域时间并不是很长,可能是'长',但延迟是所有无线通信中最大的问题之一。不要忘记,大多数无线接入点基于相当古老的规格,所以我不会说这些数字是极端的(但我不会指望3s的差距)。