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位窗口大小選項來與服務節點通信。