Page 35 - Web性能权威指南
P. 35
݀ໃ܋ থ܋
ᆌᆩຕ
图 2-2:通告接收窗口(rwnd)大小
第一次建立连接时,两端都会使用自身系统的默认设置来发送 rwnd。浏览网页通常主要是
从服务器向客户端下载数据,因此客户端窗口更可能成为瓶颈。然而,如果是在上传图片
或视频,即客户端向服务器传送大量数据时,服务器的接收窗口又可能成为制约因素。
不管怎样,如果其中一端跟不上数据传输,那它可以向发送端通告一个较小的窗口。
假如窗口为零,则意味着必须由应用层先清空缓冲区,才能再接收剩余数据。这个过
程贯穿于每个 TCP 连接的整个生命周期:每个 ACK 分组都会携带相应的最新 rwnd
值,以便两端动态调整数据流速,使之适应发送端和接收端的容量及处理能力。
窗口缩放(RFC 1323)
最初的 TCP 规范分配给通告窗口大小的字段是 16 位的,这相当于设定了发送端和
接收端窗口的最大值(216 即 65 535 字节)。结果,在这个限制内经常无法获得最优
性能,特别是在那些“带宽延迟积”(参见 2.3 节“带宽延迟积”)很高的网络中。
为解决这个问题,RFC 1323 提供了“TCP 窗口缩放”(TCP Window Scaling)选项,
可以把接收窗口大小由 65 535 字节提高到 1G 字节!缩放 TCP 窗口是在三次握手期
间完成的,其中有一个值表示在将来的 ACK 中左移 16 位窗口字段的位数。
今天,TCP 窗口缩放机制在所有主要平台上都是默认启用的。不过,中间节点和
路由器可以重写,甚至完全去掉这个选项。如果你的服务器或客户端的连接不能
完全利用现有带宽,那往往该先查一查窗口大小。在 Linux 中,可以通过如下命
令检查和启用窗口缩放选项:
• $> sysctl net.ipv4.tcp_window_scaling
• $> sysctl -w net.ipv4.tcp_window_scaling=1
TCP的构成 | 17