Windows Scale窗口扩大因子
窗口扩大选项使TCP的窗口定义从16位增加为32位。这并不是通过修改TCP首部来实现的,TCP首部仍然使用16位,而是通过定义一个选项实现对16位的扩大操作(scaling operation)来完成的。于是TCP在内部将实际的窗口大小维持为32位的值。
[img]http://www-128.ibm.com/developerworks/cn/linux/cluster/cluster_system/balance/part7/images/image010.gif[/img]
这个选项只能够出现在一个SYN报文段中,因此当连接建立起来后,在每个方向的扩大因子是固定的。为了使用窗口扩大,TCP通信的两端必须在它们的SYN报文段中
发送这个选项。主动建立连接的一方(这里一般是客户端)在其SYN中
发送这个选项,但是被动建立连接的一方(负载均衡器和服务节点)只能够在收到带有这个选项的SYN之后才可以
发送这个选项。每个方向上的扩大因子可以不同。
TCP根据接收缓存的大小自动选择移位计数。也就是说,扩大因子的数值自动产生。当然也可以通过特定的接口由应用层进行修改。
客户端可以在发起SYN握手的时候向均衡器协商窗口扩大因子,数值可以是从0到16之间的任一值(用于表示扩大窗口的位移量,实际的窗口大小为:(16bit的windows大小)×2 (扩大因子))。当均衡器向服务节点发起SYN握手请求后,会将先前对应客户端的窗口扩大选项值传递到服务节点进行协商。如果服务节点支持该选项,将会使用该扩大因子与客户端进行splicing通信,尽管客户端仅仅是简单的把服务节点以0位移扩大因子看待。其实,作为典型的客户-服务通信模式,从服务端->客户端的返回数据量往往比较大,在客户端使用较大的窗口扩大因子也便于客户端接收大量数据,提高通信的效率。
如果服务节点不支持窗口扩大因子选项,均衡器需要忽略所有客户端的窗口扩大因子选项,使之无效,这一点和其他的扩展TCP选项的处理模式相同,主要是为了兼容更旧的TCP/IP协议栈实现系统。在后续的通信中,客户端将自动调整扩大因子,仅使用16位窗口大小选项来与服务节点通信。