拥塞控制和流量控制
拥塞控制和流量控制
1、流量控制
1.1、定义和作用
流量控制(flow control):所说的端到端(end to end
)针对的是发送方和接收方速度不匹配的问题比如经典的fast sender and slow receiver问题
,接收方缓存大小与发送速率不匹配,提供一种速度匹配服务遏制发送速率使接收方应用程序的读取速率与之相适应。
作用
当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。
1.2、控制方法
主要的方法有:
- 1、
Stop-and-wait
这个也是最简单粗暴的,发一个分组就等对方一个ACK回应然后再发,收不到ACK就不发了。(不展开说) - 2、
滑动窗口
(包括go back N和选择重传) 接收方在一个窗口都满了以后才会发送ACK确认并要求发送下一个窗口。Go back N
中接收方发送NAK表示接收前N-1个分组失败然后由发送方退回N步继续发送;选择重传
双方都维护窗口,引入序列号,发现超时未收到序列号则由发送方重传。- TCP的窗口单位是字节,不是报文段,发送方的发送窗口不能超过接收方给出的接收窗口的数值。
所以你可以很明显看到流量控制是由接收方控制的,发送方始终是被迫调整至与接收方同步。
1.3、滑动窗口使用
1、参数说明:
- (1)接收端窗口 rwnd
接收端缓冲区大小。接收端将此窗口值放在 TCP 报文的首部中的窗口字段,传送给发送端。 - (2) 拥塞窗口 cwnd (congestion window)
发送端缓冲区大小 - (3)发送窗口swnd
发送窗口的上限值 = Min [rwnd, cwnd]
当 rwnd < cwnd 时,是接收端的接收能力限制发送窗口的最大值。
当 cwnd < rwnd 时,则是网络的拥塞限制发送窗口的最大值。
2、使用流程:
- 1.设A向B发送数据。在连接建立时,B告诉了A:“我的接收窗口rwnd = 400”(这里rwnd表示recevier window)。
- 2.发送方的发送窗口不能超过接收方给出的接收窗口的数值,请注意,TCP的窗口单位是字节,不是报文段。
- 3.再设每一个报文段为100字节长,而数据报文段序号的初始值设为1(图中第一个箭头上面的序号为seq=1。从1开始,data里有100个字节的数据。)
- 4.图中箭头上面大写ACK表示首部中的确认位ACK(应答标识,表示接收到信息),小写ack表示确认字段的值(表示接收到了哪些具体的数据)。
3.以上处理的不足
死锁问题
- 1、B向A发送了零窗口的报文段后不久,B的接收缓存又有了一些存储空间。于是B向A发送了rwnd = 400的报文段,然而这个报文段在传送过程中丢失了。
- 2、A一直等待收到B发送的非零窗口的通知,而B也一直等待A发送的数据,如果没有其他措施,这种相互等待的死锁局面将一直持续下去。
4、解决方法
- 1.TCP为每一个连接设有一个持续计时器。
- 2.只要TCP连接的一方收到对方的零窗口通知,就启动持续计时器。
- 3.若持续计时器设置的时间到期,就发送一个零窗口探测报文段(仅携带1字节的数据),而对方就在确认这个探测报文时给出了现在的窗口值。
- 4.如果窗口值仍然是零,那么收到这个报文段的一方就重新设置持续计时器。
- 5.如果窗口不是零,那么死锁的僵局就可以打破了。
2、拥塞控制
2.1、定义和作用
拥塞控制就是防止过多的数据注入网络中,这样可以使网络中的路由器或链路不致过载。
- 1.拥塞控制所作的都有一个前提,就是网络能够承受现有的网络负荷。
- 2.拥塞控制是一个全局性的过程,涉及到所有的主机、所有的路由器,以及与降低网络传输性能有关的所有因素。
2.2、拥塞控制的方法
1.慢开始
2.拥塞避免
3.快重传
4.快恢复
2.3、拥塞控制流程(面试重点)——慢开始和拥塞避免
1、参数说明
TCP的拥塞控制采用的是窗口机制,通过调节窗口的大小实现对数据发送速率的调整。
- TCP的发送端维持一个称为
拥塞窗口cwnd
的变量,单位为字节
。 - 为了防止拥塞窗口cwnd增长过大引起网络拥塞,还需要设置一个
慢开始门限ssthresh
状态变量- 1.当
cwnd < ssthresh
时,使用上述的慢开始算法 - 2.当
cwnd > ssthresh
时, 停止使用慢开始算法而改用拥塞避免算法 - 3.当
cwnd = ssthresh
时 , 即可以使用慢开始算法,也可以使用拥塞避免算法。
- 1.当
- 什么是
RTT
- 1、一个传输轮次所经历的时间其实就是往返时间RTT(RTT并非恒定的数值)
- 例如,拥塞窗口cwnd的大小是4个报文段,那么这时的往返时间RTT就是发送方连续发送4个报文段,并收到这4个报文段的确认,总共经历的时间。
- 2、使用“传输轮次”是更加强调:把拥塞窗口所允许发生的报文段都连续发送出去,并收到了对已发送的最后一个字节的确认
- 3、在TCP的实际运行中,发送方只要收到一个对新报文段的确认,其拥塞窗口cwnd就立即加1,并可以立即发送新的报文段,而不需要等这个轮次中所有的确认都收到后再发送新的报文段。
- 1、一个传输轮次所经历的时间其实就是往返时间RTT(RTT并非恒定的数值)
2、慢开始流程:
- 1、 在主机刚刚开始发送报文段时可先设置拥塞窗口 cwnd = 1,即设置为一个最大报文段 MSS 的数值。
- 2、 在每收到一个对新的报文段的确认后,每经过一个传输轮次,拥塞窗口cwnd就加倍,即增加 MSS 的数值
3、拥塞避免算法:
当拥塞窗口的值增加到ssthresh时,就要减缓拥塞窗口的增长速度。
- 1、具体的做法是每经过一个RTT,拥塞窗口cwnd的值加1(单位为MSS),这样就可以使cwnd按线性规律缓慢增长。
- 2、只要发送方判断网络出现拥塞(其根据就是没有按时收到确认),就要把慢开始门限 ssthresh
设置为出现拥塞时的发送方窗口值的一半(但不能小于2)。 - 3、然后把拥塞窗口 cwnd 重新设置为 1,执行慢开始算法。
2.4、快重传和快恢复
2.4.1、快重传
1、接收方收到了M1和M2后都分别及时发出了确认。
2、现假定接收方没有收到M3的但收到了M4,本来接收方可以什么都不做。
3、但按照快重传算法,接收方必须立即发送对M2的重复确认,以便让发送方及早知道接收方没有收到报文段M3。
4、发送方接着发送M5和M6,接收方收到后也仍要再次分别发出对M2的重复确认。
5、这样,发送方共收到了接收方的4个对M2的确认,其中后3个都是重复确认。
6、快重传算法规定,发送方只要一收到3个重复确认,就知道接受方确实没有收到报文段M3,因而应当立即进行重传(即“快重传”),这样就不会出现超时,发送方也不就会认为出现了网络拥塞。
2.4.2、快恢复
1、定义
当发送端连续收到三个重复确认时,就将慢开始门限ssthresh减半,以预防网络拥塞的发生,并且将拥塞窗口cwnd的值置为减半后的ssthresh,然后开始执行拥塞避免算法,使得cwnd缓慢地加性增大。
2、快恢复的两个特点
- 1、当发送方连续收到三个重复确认时,就执行“乘法减小”算法,把慢开始门限减半,这是为了预防网络发生拥塞。
- 2、由于发送方现在认为网络很可能没有发生拥塞,因此现在不执行慢开始算法,而是把cwnd值设置为慢开始门限减半后的值,然后开始执行拥塞避免算法,是拥塞窗口的线性增大。
3、快恢复和慢开始的区别:
慢开始算法只是在TCP建立时才使用,快恢复是在遇到网络拥塞接收不到数据时触发,常常伴随着快重传算法。
3、拥塞控制和流量控制的区别
1、拥塞控制是防止过多的数据注入到网络中,可以使网络中的路由器或链路不致过载,是一个全局性的过程。
2、流量控制是点对点通信量的控制,是一个端到端的问题,主要就是抑制发送端发送数据的速率,以便接收端来得及接收
参考
1、https://www.cnblogs.com/ppzhang/p/10506237.html
2、https://www.zhihu.com/question/38749788/answer/79703879