Windows Scale窗口擴(kuò)大因子
窗口擴(kuò)大選項(xiàng)使TCP的窗口定義從16位增加為32位。這并不是通過修改TCP首部來實(shí)現(xiàn)的,TCP首部仍然使用16位,而是通過定義一個(gè)選項(xiàng)實(shí)現(xiàn)對(duì)16位的擴(kuò)大操作(scaling operation)來完成的。于是TCP在內(nèi)部將實(shí)際的窗口大小維持為32位的值。
[img]http://www-128.ibm.com/developerworks/cn/linux/cluster/cluster_system/balance/part7/images/image010.gif[/img]
這個(gè)選項(xiàng)只能夠出現(xiàn)在一個(gè)SYN報(bào)文段中,因此當(dāng)連接建立起來后,在每個(gè)方向的擴(kuò)大因子是固定的。為了使用窗口擴(kuò)大,TCP通信的兩端必須在它們的SYN報(bào)文段中
發(fā)送這個(gè)選項(xiàng)。主動(dòng)建立連接的一方(這里一般是客戶端)在其SYN中
發(fā)送這個(gè)選項(xiàng),但是被動(dòng)建立連接的一方(負(fù)載均衡器和服務(wù)節(jié)點(diǎn))只能夠在收到帶有這個(gè)選項(xiàng)的SYN之后才可以
發(fā)送這個(gè)選項(xiàng)。每個(gè)方向上的擴(kuò)大因子可以不同。
TCP根據(jù)接收緩存的大小自動(dòng)選擇移位計(jì)數(shù)。也就是說,擴(kuò)大因子的數(shù)值自動(dòng)產(chǎn)生。當(dāng)然也可以通過特定的接口由應(yīng)用層進(jìn)行修改。
客戶端可以在發(fā)起SYN握手的時(shí)候向均衡器協(xié)商窗口擴(kuò)大因子,數(shù)值可以是從0到16之間的任一值(用于表示擴(kuò)大窗口的位移量,實(shí)際的窗口大小為:(16bit的windows大小)×2 (擴(kuò)大因子))。當(dāng)均衡器向服務(wù)節(jié)點(diǎn)發(fā)起SYN握手請(qǐng)求后,會(huì)將先前對(duì)應(yīng)客戶端的窗口擴(kuò)大選項(xiàng)值傳遞到服務(wù)節(jié)點(diǎn)進(jìn)行協(xié)商。如果服務(wù)節(jié)點(diǎn)支持該選項(xiàng),將會(huì)使用該擴(kuò)大因子與客戶端進(jìn)行splicing通信,盡管客戶端僅僅是簡單的把服務(wù)節(jié)點(diǎn)以0位移擴(kuò)大因子看待。其實(shí),作為典型的客戶-服務(wù)通信模式,從服務(wù)端->客戶端的返回?cái)?shù)據(jù)量往往比較大,在客戶端使用較大的窗口擴(kuò)大因子也便于客戶端接收大量數(shù)據(jù),提高通信的效率。
如果服務(wù)節(jié)點(diǎn)不支持窗口擴(kuò)大因子選項(xiàng),均衡器需要忽略所有客戶端的窗口擴(kuò)大因子選項(xiàng),使之無效,這一點(diǎn)和其他的擴(kuò)展TCP選項(xiàng)的處理模式相同,主要是為了兼容更舊的TCP/IP協(xié)議棧實(shí)現(xiàn)系統(tǒng)。在后續(xù)的通信中,客戶端將自動(dòng)調(diào)整擴(kuò)大因子,僅使用16位窗口大小選項(xiàng)來與服務(wù)節(jié)點(diǎn)通信。