流量控制
如果接收方的缓存区满了,发送方还在疯狂的发送数据。那么接收方只能把接受到的数据包丢掉,大量的丢包会造成极大的网络资源浪费。所以需要流量控制。
什么是流量控制?
让发送发的发送速率不要太快,让接收方来得及接受处理。
- 原理:
- 通过确认报文中窗口字段的大小来控制发送发的发送速率
- 发送发的发送窗口大小不能超过接收方给出的窗口大小
- 当发送方收到接收方窗口的大小为0是,发送方就会停止发送数据
特殊情况
一开始,接收方给发送方发送了窗口值为0的报文段。后面,接收方有了缓存空间,给发送方发了窗口值不为0的报文段,但是丢失了。
现在,发送方得发送窗口任然为0,双方陷入僵局。
- 解决方案:
- 当发送方收到窗口值为0的报文段时,停止发送报文
- 同时,开启一个定时器,每隔一段时间就给发送方发个测试报文主动去询问接收方当前的窗口大小
- 如果接收到发送方回复的报文段窗口值依然为0,则再次刷新定时器
拥塞控制
什么是拥塞控制
- 防止过多的数据注入到网络中
- 避免网络中的路由器或链路过载
缩写词
- MSS(Max Segment Size):最大报文段数据部分长度,在建立连接时确定,取双方中最小值。
- cwnd(congestion window):拥塞窗口
- rwnd(receive window):接收窗口
- swnd(send window):发送窗口,取cwnd和rwnd最小值
慢开始(slow start,慢启动)
- cwnd(拥塞窗口)的初始值比较小,然后随着数据包被接收方确认,cwnd的值会成倍增长(指数级)
拥塞避免(congestion avoidance)
- ssthresh(slow start threshold):慢开始阈值,cwnd达到阈值后,以线性方式增加
- 拥塞避免(加法增发):拥塞窗口缓慢增大,以防止网络过早出现拥塞
- 乘法减小:只要网络出现拥塞,把ssthresh值减半,与此同时,执行慢开始算法(cwnd值恢复到初始值)
快重传(fast retransmit)
- 接收方,每收到一个失序的分组后,就立即发出重复确认。使发送方及时知道有分组没有到达。不要等待自己发送数据时才进行确认。
- 发送方,只要连续收到三个重复确认(总共4个相同的确认),就应当立即重传对方尚未收到的报文段,而不必继续等待重传计时器到期后再重传
快恢复(fast recovery)
- 当发送发连续收到三个重复确认,就执行“乘法减小”算法,把ssthresh值减半
- 与慢开始不同之处是,现在不不执行慢开始算法,即cwnd现在不恢复到初始值,而是把cwnd设置为ssthresh减半后的值。然后开始执行拥塞避免算法(加法增大),使拥塞窗口缓慢线性增大
发送窗口(swnd)的最大值
- 发送窗口的最大值,取拥塞窗口和接收窗口最小值,即swnd = min(cwnd,rwnd)
- 当cwnd < rwnd时,说明网络拥塞限制了发送窗口的最大值
- 当rwnd < cwnd时,说明接收方的接收能力限制了发送窗口的最大值