macOS高延时TCP连接提速优化

问题

最近发现一个很尴尬的问题,分别用iPad和MacBookPro来连接到speedtest.net上80ms~150ms延迟的网络测速点,发现iPad每次基本上都能跑到下行满速120mbps左右,上行40mbps左右。但是MacBookPro总是慢慢悠悠的下行跑到40~50mbps,上行跑到4~6mbps。明明都是连接到一样的网络,这是为什么呢?

分析

经过抓包观察分析,发现了问题。macOS这边TCP初始化连接时的initcwnd太小,而且提速也不够快,在测速就很短的时间内,根本没有办法达到比较高的速度。那如何解决这个问题呢?

按照理论上讲, macOS一部分是Unix,所以和linux一样通过sysctl应当能够进行配置。不过macOS这边的参数有很多独特的地方,所以可能不太好直接通过搜索来进行配置。这里通过sysctl -a | grep tcp,并挑出了这样几个选项来进行优化

这三个配置项,第一个net.inet.tcp.win_scale_factor看名字就知道是影响TCP窗口缩放的因子,扩大该值可以更快的从慢启动状态进入到带宽峰值。第二个配置net.inet.tcp.slowstart_flightsize是公网上慢启动的初始窗口值,令人发指的是这个值默认居然是1,这都什么年代了。。。所以这里直接改成16,可以更快的提升速度。第三个配置net.inet.tcp.local_slowstart_flightsize是本地网络上慢启动的初始窗口值。这让我想起了通过延迟7~8ms的无线网络网络通过AFP或SMB进行TimeMachine备份比起延迟不超过1ms的有线网络速度慢好几倍的事情。。。特别是密集小文件备份时,明明物理带宽几百兆但是实际就跑几兆。。。这里直接从16提升为64,可以有效提升TimeMachine备份的速度。

另外一个问题,上面的命令只能管本次启动有效,下次重启后就不生效了。所以这里使用launchctl来做一个/etc/rc.local的自启动

这样可以确保重启后生效

解决

配置项生效后重新使用speedtest.net测速,100ms左右的延迟,可以跑满110mpbs下行和40mbps上行,TCP速度提升明显变快,提速成功。

参考

OS X: Add rc.local and Launchd entry for it
Нет-Work: Darwin Networking
OSX – Tuning the Network Stack TCP
Tuning initcwnd for optimum performance
Mac OSX Tuning
TCP window scale option