一段时间以来,我一直遇到网络问题,并且正在尝试找出问题的根源。
昨天,我使用 SCP 通过 wifi 连接将文件从笔记本电脑传输到台式机。下载开始时,两台计算机与本地路由器 (192.168.1.1) 的 ping 值都很低,都在 10ms-50ms 左右,下载速度为 2-3 MB/s。
大约一分钟后,我发现我的台式机到 192.168.1.1 的延迟急剧上升(> 1,000 毫秒),传输速度慢得像爬行一样(~200 KB/秒)。然而,笔记本电脑到 192.168.1.1 的延迟保持不变(10-50 毫秒)。传输完成后,台式机的延迟又降回正常范围。
显然,当连接饱和时,就会出现问题。会是什么问题?这是否意味着路由器存在问题,还是我的桌面存在问题?从哪里开始查找比较合适?
答案1
谷歌搜索“缓冲区膨胀”。
随着 RAM 变得越来越便宜,网络设备添加了帧缓冲区,因此它们永远不会丢失任何一帧。
不幸的是,TCP 是通过丢帧来发现拥塞并知道何时退让的。如果没有丢帧,传统的 TCP 实现永远不会发现拥塞,也不会退让,因此它们只会继续以高速率发送,使情况变得更糟。
如果所有网络设备在拥塞期间都缓冲越来越多的帧并让队列长度无限制地增长,则延迟会越来越长,因为清空队列所需的时间越来越长。
主动队列管理 (AQM) 技术和显式拥塞通知 (ECN) 等机制可以缓解这种情况,但由于这个问题没有得到广泛宣传,很难知道哪些产品可以避免缓冲区膨胀,哪些不能。你不可能通过查看包装盒侧面的“无缓冲区膨胀!”标志就知道自己买到的是好设备。
不过,有些 Wi-Fi 路由器售后固件发行版专门用于避免缓冲区膨胀。至少有一个发行版是由最先发现该问题的 TCP 研究人员专门开发的,并在他们寻找解决方案时用作研发平台。
答案2
当数据包进入队列并在非常繁忙的链路上传输时,就会发生高延迟。队列中排在其前面的所有数据包都必须先发送。当链路上的需求很大,并且队列缓冲区很大时,这会导致往返时间很长。