问:请你讲一下接收窗口?
答:
为什么需要接收窗口?
TCP发送数据时,需要发送并且接收到对方的确认包,这是一个往返过程。
如果发送一个包就停下来等待确认,效率太低;
如果一口气包所有包发出去,网络带宽不够,接收方缓存(接收窗口)太小等等问题。
这个接收方缓存就是接收窗口,一口气发送的数据量就是TCP的发送窗口。
因此,为了最大效率发送数据,需要设置合理的接收和发送窗口。
发送窗口和最大分段大小(MSS,Max Segment Size)的关系?
发送窗口决定了一口气发多少字节,而最大分段大小决定了这些字节需要分多少包发完。
TCP Window Scale和接收窗口的概念?
在TCP刚被发明的时候,全世界的网络带宽都很小,所以最大接收窗口被定义成 65535 字节。随着硬件的革命性进步,65535 字节已经成为性能瓶颈了,怎么样才能扩展呢?
TCP 头中只给接收窗口值留了 16 bit,肯定是无法突破 65535 (216−1)的。1992年的RFC 1323中提出了一个解决方案,就是在三次握手时,把自己的Window Scale信息告知对方。由于Window Scale放在TCP头之外的Options中,所以不需要修改 TCP 头的设计。Window Scale 的作用是向对方声明一个 Shift count,我们把它作为2的指数,再乘以TCP头中定义的接收窗口,就得到真正的TCP接收窗口了。
以图6为例,从底部可以看到10.32.106.159告诉10.32.106.103说它的Shift count是5。25等于32,这就意味着以后10.32.106.159声明的接收窗口要乘以32才是真正的接收窗口值。
窗口大小(Window size)该字段占16位,指明TCP接收方缓冲区的长度,以字节为单位。最大长度是65535字节,0指明发送方应该停止发送,因为接收方的TCP缓冲区已满。这个值通常作为接收窗口(rwnd),并由接收方来确定,接收方可以使用此字段来改变发送方的窗口大小。在这种情况下,发送端必须服从接收端的决定。