您是否发现网络性能不佳,但链接利用率却远低于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设备本身的会话。网络设备通常不会更改仅通过网络的会话的参数。