1. TCP流量控制
-
流量控制就是让发送方的发送速率不要太快,要让接收方来得及接收;
-
接收方会通过接收窗口(rwnd)告诉发送方,它还能接收多少字节;也就是说,发送方的发送窗口不能超过接收方给出的接收窗口的数值;
-
特殊情况:接收方给发送方发送零窗口的报文段,过了一会缓存又有了一些存储空间。于是接收方向放送方发送了 rwnd=400 的报文段。然而这个报文段在传送过程中丢失了。放送方一直等待接收方发送非零窗口的通知,而接收方也一直等待发送方发送的数据。如果没有其他措施,这种互相等待的死锁局面将一直延续下去;
-
为了解决这个问题,当发送方收到零窗口的通知后,就启动持续计时器,每隔一段时间就发送一个零窗口探测报文段(仅携带1字节的数据),对方就在确认这个探测报文段后给出现在的窗口值。
2. TCP拥塞控制
2.1 拥塞控制的方法
-
慢启动
-
慢开始不是指 cwnd 的增长速度慢(指数增长),而是指 TCP 开始发送设置 cwnd=1。
-
思路:不要一开始就发送大量的数据,先探测一下网络的拥塞程度,也就是说由小到大逐渐增加拥塞窗口的大小。这里用报文段的个数的拥塞窗口大小举例说明慢开始算法,实时拥塞窗口大小是以字节为单位的。
-
为了防止 cwnd 增长过大引起网络拥塞,设置一个慢开始门限(ssthresh 状态变量)当 cnwd<ssthresh,使用慢开始算法当 cnwd=ssthresh,既可使用慢开始算法,也可以使用拥塞避免算法当 cnwd>ssthresh,使用拥塞避免算法
-
-
拥塞避免
无论是在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(其根据就是没有收到确认,虽然没有收到确认可能是其他原因的分组丢失,但是因为无法判定,所以都当做拥塞来处理),就把慢开始门限设置为出现拥塞时的发送窗口大小的一半。然后把拥塞窗口设置为 1,执行慢开始算法。
-
拥塞避免并非完全能够避免拥塞,是说在拥塞避免阶段将拥塞窗口控制为按线性规律增长,使网络比较不容易出现拥塞。
-
思路:让拥塞窗口 cwnd 缓慢地增大,即每经过一个往返时间 RTT 就把发送方的拥塞控制窗口加一。
-
-
快重传
-
快重传要求接收方在收到一个失序的报文段后就立即发出重复确认(为的是使发送方及早知道有报文段没有到达对方)而不要等到自己发送数据时捎带确认。快重传算法规定,发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段,而不必继续等待设置的重传计时器时间到期。
-
由于不需要等待设置的重传计时器到期,能尽早重传未被确认的报文段,能提高整个网络的吞吐量。
-
-
快恢复
-
当发送方连续收到三个重复确认时,就执行“乘法减小”算法,把 ssthresh 门限减半。但是接下去并不执行慢开始算法。
-
考虑到如果网络出现拥塞的话就不会收到好几个重复的确认,所以发送方现在认为网络可能没有出现拥塞。所以此时不执行慢开始算法,而是将 cwnd 设置为 ssthresh 的大小,然后执行拥塞避免算法。
-
3.区别
-
流量控制指的是点对点通信量的控制,是个端到端的问题(接收端控制发送端)。流量控制所要做的就是一直发送端发送数据的速率,以便使接收端来得及接收;
-
拥塞控制考虑的是全局性的过程,拥塞控制所要做的都有一个前提,就是网络能承受现有的网络负荷,也就是防止过多的数据注入到网络中,这样可以使网络中的路由器或者链路不至于过载。