0xAA55 发表于 2018-2-25 06:24:03

【翻译】通过调整TCP窗口大小来提升网络性能

出处:https://www.auvik.com/media/blog/tcp-window-size/
本帖:https://www.0xaa55.com/thread-16723-1-1.html
翻译:0xAA55
转载请保留以上信息。

如果你发现你的网络性能很差,但链路使用率却远远没到100%的话,那就是你没配置好TCP窗口了。

TCP/IP协议

TCP/IP协议是有些年头的东西了。它是在网络非常缓慢并且丢包率很高的时代发明的。 所以早期协议设计的主要考虑之一就是可靠性。传输控制协议(TCP)具有内置的可靠性机制,包括验证每个数据包的校验和,以及丢弃或乱序数据包的检测、排序和重传。它是在56Kbps电话线网络刚被普及的时候被发明出来的。在那个时候丢包率普遍1%以上。现在宽带网络速度要快好几个数量级,而且要可靠得多。 因此,协议中设计的可靠性机制有时会导致问题。其中之一与一个称为TCP窗口的功能有关。

TCP窗口是啥

对于可靠数据传输,一个关键性的功能叫“ACK包”。设备A向设备B发送一串数据。然后,设备B验证所有数据包的校验和并发送一个ACK包给设备A,表明所有数据都已正确接收。如果没有收到全部数据,则需要重新发送部分或全部数据。每个设备都会维护所有数据的缓冲区。接收到ACK数据包意味着设备可以将旧数据从缓冲区中清除。

TCP窗口是必须收到ACK之前可以发送的最大字节数。

如果网络不稳,最好将窗口缩小,这样可以减少重传数据的量。否则窗口可以设置很大。TCP最屌的特征之一就是滑动窗口的概念。设备可以动态改变窗口的大小,当网络阻塞时可以缩小窗口大小,当情况可控时可以更大。每个设备都会发送一个建议的窗口大小,表明在收到确认之前它想要接收多少数据。并且你可以在同一个对话中为两个流量方向设置不同的窗口大小。

TCP窗口出错的地方

TCP窗口固然很屌,但是在遇到高延迟和高带宽的情况下,情况就不一样了。

在第一个包裹到达目标之前你可以发送一整个窗口的数据,然后等待对方发送ACK。然后对方就会在收到全部包裹后发送ACK——这个ACK到达你的发送端所需的时间可并不短,就如同你的发送端发送的包裹到达接收端的时间也不短。

每个设备只能用很少量的时间来发送包裹,然后花费大量时间等待ACK。通过网络获得的平均数据量仅占总带宽的一小部分。在现代网络中,丢失率很低,这种传输速度慢是不合理的。只能降低网络性能。

如何修复TCP窗口带来的问题

TCP窗口大小由终端来决定,而不是中间的路由器、交换机、防火墙等。整个连接期间,设备可以主动、动态地协商窗口大小。但是因为TCP在设计的时候的网速比如今的网速慢很多个数量级,所以有的时候这个窗口大小会被限制到64 KB。但你可以通过设置窗口缩放,来得到最大1GB的窗口大小。

在RFC 1323中引入了窗口缩放扩展用于解决这类问题。它可作为任何现代TCP实现的一个选项。唯一的问题是它是否被正确启用。

新的Windows系统基本上都是默认打开了这玩意儿的,基本上不用调。在Linux上你可以通过看/proc/sys/net/ipv4/tcp_window_scaling的值来判断它是不是被启用了。

参考资料:
RFC 1323
https://www.ietf.org/rfc/rfc1323.txt
How to Adjust TCP Window Size to Improve Network Performance
https://www.auvik.com/media/blog/tcp-window-size/

黑魔法师Rabbit 发表于 2018-2-25 12:06:21

附加内容:Linux在4.9版本以上的内核里面加入了Google开发的BBR算法,就是为了在高延迟高带宽的环境下,提升TCP性能的。

0xAA55 发表于 2018-2-25 15:10:57

黑魔法师Rabbit 发表于 2018-2-25 12:06
附加内容:Linux在4.9版本以上的内核里面加入了Google开发的BBR算法,就是为了在高延迟高带宽的环境下,提 ...

页: [1]
查看完整版本: 【翻译】通过调整TCP窗口大小来提升网络性能