TCP的滑动窗口和流量控制

1. 滑动窗口

TCP每发送一个数据,都要收到一个确认应答。并且序列号是递增的。当上一个数据包收到应答,再发送下一个。这样效率很低。
于是,引入了窗口的概念,窗口大小,就是一次能并行发送消息的最大值。
相应的序列号应答,即使中间有丢失,收到最后的应答,也认为是成功接收所有数据了,这种模式就是 累计确认 或 累计应答。
窗口实际上是操作系统开辟的缓存区域,发送方的叫发送窗口,接收方的叫接收窗口。
发送窗口应该小于等于接收窗口。

发送方,依据发送窗口发送数据,接收方接收到数据,放在接收窗口中,此时接收窗口减小,接收方返回window字段,告诉发送方,
接收窗口大小,发送窗口减小。两端的窗口不断变化,这个就是滑动窗口的机制。

当然,如果接收方不能及时的返回窗口大小,发送方可能过量的发送数据,这样会造成数据丢失。

2. 流量控制

也是依据滑动窗口的原理,调整窗口的大小,避免流量过大或过小。

2.1 窗口探测

当发送窗口降为0,接收窗口迟迟不能返回新的非0窗口值,会陷入死锁。两边都在等待对方。
TCP有窗口探测机制,发送方在窗口为0时候,会启动计时机制,在超时未收到窗口信息,就会发送窗口探测包,以便知道接收方窗口是否发生了改变。

2.2 糊涂窗口综合症

接收方太忙,无时间处理接收的数据,并不断返回窗口大小,导致发送窗口越来越小。发送窗口也会继续发送几个字节的数据,导致流量浪费,因为TCP + IP头就有
40个字节的数据,发送几个字节,非常不经济。

为了避免这种情况,通常规定接受窗口小于缓存的一半MSS,就返回0,不返回小窗口值

而发送方,使用Nagle算法:

1. 窗口大小 >= MSS 或 数据大小 >= MSS
2. 收到之前数据包的ACK应答

两者都满足才会发送数据

参考: https://baijiahao.baidu.com/s?id=1664395039305097355&wfr=spider&for=pc

原文地址:https://www.cnblogs.com/mengff/p/13573846.html