您是否发现网络性能不佳,但链接利用率却远低于100%?您的TCP窗口大小可能有问题。解决问题的方法和原因如下。
TCP / IP协议
的 TCP / IP协议 有时会显示其年龄。
它是在网络非常慢且丢包率很高的时代发明的。因此,早期协议设计中的主要考虑因素之一是可靠性。
传输控制协议(TCP)具有内置的可靠性机制,包括验证每个数据包的校验和,以及检测和重发丢弃或乱序的数据包。
这些功能是在56Kbps的WAN带宽快速且丢包率仅为1%的情况下发明的。
当今的宽带网络速度要快许多数量级,并且可靠性要高得多。因此,协议中设计的防弹可靠性机制有时会引起问题也就不足为奇了。其中之一与称为TCP窗口的功能有关。
什么’s a TCP window?
TCP的关键可靠性功能是确认(ACK)数据包。设备A向设备B发送一堆数据。然后设备B验证所有数据包级别的校验和,并发送一个ACK数据包,说明已正确接收所有数据。
如果未收到所有内容,则需要重新传输部分或全部数据。每个设备都会保留所有数据的缓冲区,以防万一需要再次发送。接收ACK数据包意味着设备可以将旧数据刷新出缓冲区。
TCP窗口是必须接收ACK之前可以发送的最大字节数。
如果网络不可靠,最好将窗口缩小。这样,如果出现问题,您不必重新传输太多数据。但是,如果网络可靠,则窗口可能会很大。
TCP的最聪明的功能之一是 滑动窗口。设备可以动态更改窗口的大小,在拥塞时可以缩小窗口,在没有问题的情况下可以放大窗口。
每个设备都会向另一个设备发送建议的窗口大小,该窗口大小说明在收到确认之前希望接收多少数据。您甚至可以在同一会话中为两个路况设置不同的窗口大小。
TCP窗口出现问题的地方
TCP窗口是一种非常聪明的机制。但是请考虑在具有非常高的延迟和高带宽的网络上会发生什么。
您甚至可以在另一端接收到第一个数据包之前轻松地传输整个窗口的数据。然后,发送方停止并等待确认。最终,接收器接收到突发中的最后一个数据包,并再次发送确认消息(必须穿越网络的单个数据包)。
每个设备只能在这些相对较短的突发中发送数据包。然后,它必须等待另一端的确认。
通过网络获取的平均数据量仅占总带宽的一小部分。在现代网络中,丢包率是如此之低,因此这种缓慢的传输速率是不合理的。它所做的就是降低网络性能
如何修复TCP窗口
TCP窗口的大小由终端设备控制,而不是由中间的路由器,交换机或防火墙控制。设备在整个会话中主动地和动态地协商窗口大小。
但是,正如我前面提到的,TCP机制是为网络带宽设计的,它比我们今天拥有的速度慢几个数量级。因此,某些实现仍将最大窗口大小强制为64KB。您可以通过启用来解决此问题 Windows缩放,该窗口最多可容纳1GB。
Windows缩放功能是在 RFC 1323 解决快速,可靠的网络上的TCP窗口化问题。任何现代TCP实施中都可以选择使用此选项。唯一的问题是是否已正确启用它。
在所有最新的Microsoft Windows实现中,默认情况下启用Windows缩放。您会在Internet上找到提示您更改注册表值以增加窗口大小的位置,但是根据您使用的Windows版本,这些更改将无效。这些值甚至可能不再存在。最重要的是,您无需在Windows客户端或服务器中修复TCP窗口。
在Linux系统上,可以通过查看/ proc / sys / net / ipv4 / tcp_window_scaling中的值来检查是否已启用全窗口缩放。
在思科设备上,您可以使用全局配置命令“ ip tcp window-size”来调整窗口大小。此命令仅影响到Cisco设备本身的会话。网络设备通常不会更改仅通过网络的会话的参数。
很好的文章。清晰表达
很棒的文章,正如Sooraj所说,很好地表达了出来。
我有一个问题与根据RFC1323采用Windows Scaling的Windows平台有关?看这个RFC(1992)的日期’m假设Microsoft已在所有Windows XP XP平台上引入此功能–我在测试网络上使用Windows 7。
嗨布莱恩–谢谢你的提问。从Server 2000开始在Windows Server平台上提供RFC 1323,从Windows XP开始在工作站上提供RFC 1323。可以通过注册表启用和禁用它“Tcp1323Opts”参数。所以如果你’re unsure if it’继续工作,’可能是最好的起点。
这就是任何人应该如何向任何级别的网络技术解释基本的窗口化和窗口缩放的方式!
谢谢..
干净利落的解释,谢谢英国
TCP窗口缩放的出色总结
非常有用..直截了当…Thanks
不错的一个只是我需要有关TCP窗口大小的解释。
谢谢
还是我们不’不知道如何将窗口大小设置为固定值。我们可以禁用滑动,然后下一步呢?
那么Android呢?可以在哪里/如何更改窗口大小或缩放比例?谢谢。
艾萨克,你好
Android是幕后的Linux变体。这样,它将具有默认的初始TCP窗口大小,但是如果吞吐量和延迟良好,则应自动将其正确缩放到协议允许的最大值。我不’认为没有任何用户可访问的方式来更改行为。
– Kevin
Linux是否可以自动调整TCP窗口大小?
我知道Windows XP以后就拥有Windows。但是,Linux呢?它最初是基于Linux的系统吗?