使用wireshark抓包分析 TCP handshake 中 window scale 参数
Window scale简析
首先TCP的窗口有两种,发送窗口和接收窗口。这里我们主要讨论接收窗口,在TCP通信中,发送方的TCP报头中会包含一个窗口信息,这个窗口是指发送方的接收窗口的大小,当接收方进行应答时,发送的在途数据不能超过窗口大小,否则会造成丢包。
下面我们讨论下Window scale的具体作用。
在TCP的报头中,有一个16bit的字段是表示window的大小的,而2^16 = 65536,即由于字段的长度,窗口最大为64KB,显然对于现在动辄1000Mbps的带宽,这个大小是远远无法满足实际需求。如果要修改该字段的长度,则对TCP的兼容性会造成比较大的影响,因此采用了Window scale的方法。即在TCP的报头的option 中增加一个Window scale,计算方式如下:
实际的窗口大小 = (window size value) X (2^(Window scale))
这样在实际交互过程中就可以采用比较大的实际窗口了。
TCP 握手
tcp的三次握手过程如下图所示。12号包是客户端发送的SYN握手请求包;15号包是服务器返回的SYN/ACK包,即是应答12号包;17号包是客户端发送的ACK包,即是对15号包的应答。