请问在恶劣的(大概一个房间中有百来人) WiFi 无线局域网中用 UDP,掉包率和延时能变得多坏,以及怎样应对?

2015-10-06 04:20:13 +08:00
 quadpixels
大家好,前几天我写了一个程序,需要在两台电脑之间用 UDP 传数据。这两个电脑中有一台充当 server ,有一台充当 client , client 的工作是一直往 server 发数据(尺寸不是很大),同时每隔半秒钟还发一个“心跳包”。我在 server 上做了一个设置,就是如果 2 秒内没有收到任何心跳包,就认为 client 不在线了,然后就退出。

这样的设置,我在家里的 WiFi 测试没有问题,但是在真正使用时就出了问题。
这个真正使用的环境是在一个大概面积 100 平米的房间里举行的一场晚会, client 与 server 就连接到这个房间里的同一个 WiFi 上。晚会开始之前有排练,在排练的时候,房间里有大概有十来个人,那时这个程序还能正常工作,但有时好像会偶尔丢一两个包。但是等后来房间里的人多到快 100 个的时候, WiFi 的性能好像就明显下降,我甚至没法在 client 机器上 ping 到 server 机器;而这个程序在一次侥幸连接上并运行之后正常工作了大概十秒钟,就因为在接下来的 2 秒钟内没有收到心跳包而不能正常工作了。

因为当时我不知道有 iperf 之类的工具,所以我也不知道丢包率之类的信息。因为没有事故现场的记录,所以我现在也不是很清楚当时为什么会出现 2 秒内的 4 个心跳包全没收到的情况。后来为了查明原因并让程序更稳定一点,我就用了 tc 手工增加延时(到 10 秒)和丢包率(到 25%),在此种环境下将程序的 2 秒超时改成了 20 秒,并且改正了一些同步时的处理流程(简单说就是如果有很多包一起送来,只取最新的,然后计算 delta )。但是我还是不知道是否用 tc 模拟一下延时和丢包率是否真的能重现当时的恶劣的 WiFi 下的情况(因为网上还有人说延时能多至 40 秒的),以及这样的应对措施是不是够了。

后来有一次回到了同一个房间,那时房间里只有 3 个人,这个程序又完美工作了。所以我想肯定是只有在那个房间里人多的时候才有问题。

这个问题弄砸了晚会上的一个表演,程序当众出问题,好尴尬,要哭死了 :(((((
6435 次点击
所在节点    问与答
28 条回复
fantasticfears
2015-10-06 04:30:01 +08:00
WiFi endpoint 在和 AP 协商的时候,如果检测到有人传输,就会 backoff 静默一段时间。在蓝牙占用信道的时候也会如此。

所以我觉得应该要用更多硬件分割网络吧,不过具体的网络部署就毫无经验了
Showfom
2015-10-06 05:06:19 +08:00
就不会用个专门的 Wi-Fi 通道吗
quadpixels
2015-10-06 05:26:20 +08:00
@Showfom 设置专门的 Wi-Fi 通道是要改房间里的路由器的设定吗?如果是那样我改不了…
quadpixels
2015-10-06 05:28:07 +08:00
@fantasticfears 那有没有什么方法能“知道他们在 backoff ”呢?比如用 Wireshark 抓包或是某些性能测试工具?
Showfom
2015-10-06 05:31:25 +08:00
@quadpixels 专门放个路由器
CupTools
2015-10-06 06:21:00 +08:00
CupTools
2015-10-06 06:23:56 +08:00
为什么是 CSMA/CA 而不是 CSMA/CD 脑补: https://en.wikipedia.org/wiki/Hidden_node_problem
CupTools
2015-10-06 06:24:16 +08:00
jasontse
2015-10-06 07:11:04 +08:00
你确定不是因为 AP 扛不住了吗
c742435
2015-10-06 07:37:50 +08:00
ap 扛不住这么多人的。最简单的解决办法如楼上说的,单独搞个只有你用的 ap
ryd994
2015-10-06 08:11:23 +08:00
要是连 ping 都 ping 不同,除非单独 AP ,否则根本就无解。
Themyth
2015-10-06 08:15:12 +08:00
明显是你的无线路由器抗不住那么多人连接
更换一台路由器就可以解决问题了。
datocp
2015-10-06 08:52:30 +08:00
64 bytes from 192.168.10.27: seq=1180 ttl=64 time=11839.121 ms
64 bytes from 192.168.10.27: seq=1181 ttl=64 time=11330.665 ms
64 bytes from 192.168.10.27: seq=1182 ttl=64 time=10471.025 ms

这是用 ubnt uap 时见到的最恐怖的延迟。通常为了解决大量弱信号托垮 ap 性能可以根据客户端的 SNR 值主动踢除弱信号。往往一个进入黑屏界面的手机 SNR 值就-80dbm 以上,当大量设备接入,人员到处移动被各种障碍物阻挡时,情况将变得非常复杂 wifi 将变得不可用。
gamexg
2015-10-06 09:03:52 +08:00
加个无线路由器自己用,而且信道要切到没有干扰的另一个信道。
其实这种情况最好用有线,更可靠。
flynaj
2015-10-06 09:18:26 +08:00
首先你的路由器性能要能支持 100 多个人,不然是空谈, http://routerboard.com/CRS125-24G-1S-2HnD-IN
rssf
2015-10-06 09:43:46 +08:00
一般的企业级 ap 都带不动这么多人。多么你就多带几个瘦 ap ,用 ac 控制
deben
2015-10-06 10:05:59 +08:00
每个 UDP 包发十次(二十次),并且每包里面带一个 *时间戳* , server 接收的时候,判断 *时间戳* 是否相同,相同的不计。
squid157
2015-10-06 10:55:38 +08:00
这 AP 竟然还没彻底爆炸,也是神迹。 100 人,人均两个设备联网,差不多吧。
ljbha007
2015-10-06 11:03:54 +08:00
学到了 原来一般 AP 带不动 100 个客户端
Halry
2015-10-06 11:03:55 +08:00
100 人,这个 AP 怎么顶得顺...我见过最极端的也是 50 人...

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/225826

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX