一、概述
拥塞
网络中存在太多的数据包导致数据包传输延迟或丢失,从而导致网络吞吐量下降
拥塞控制(congestion control)
需要确保通信子网能够承载用户提交的通信量,是一个全局性问题,涉及主机、路由器等多种因素
产生拥塞的原因
主机发送到网络的数据包数量过多,超过了网络的承载能力
突发的流量填满了路由器的缓冲区,造成某些数据包会被丢弃
拥塞控制的基本策略
开环控制----事先对通信流参数进行协商,协商后,不管网络是拥塞还是带宽充足,参数不能动态改变
开环控制属于预防性拥塞控制,它竭力使网络总是处于无拥塞状态运行。开环控制的方法包括决定什么时候接受新流量,什么时候丢弃数据包和丢弃哪些数据包。其缺点是没有考虑网络的当前状态
闭环控制—根据网络状态进行动态控制,包括两部分:反馈机制和控制机制。闭环控制方法分为两个子类:显式反馈与隐式反馈
2 流量调节
抑制包(Choke Packets):用于通知发送方减小发送量,路由器选择一个被拥塞的数据包,给该数据包的源主机返回一个抑制包,抑制包中的目的地址取自该拥塞数据包。源主机收到抑制包后,减少发向特定目的地址的流量
逐跳的抑制包(Hop-by-Hop Choke Packets):在高速或长距离网络中,由于源主机响应太慢,抑制包算法对拥塞控制的效果并不好,可采用逐跳抑制方法;其核心思想是抑制包对它经过的每个路由器都起作用,能够迅速缓解发生拥塞处的拥塞,但要求上游路由器有更大的缓冲区
显式拥塞通告(ECN,Explicit Congestion Notification),在IP包头中记录数据包是否经历了拥塞。在数据包转发过程中,路由器可以在包头中标记为经历拥塞,然后接收方在它的下一个应答数据包里显示该标记作为显式拥塞信号
RFC2474中重新定义TOS域为包含一个6位的区分服务码点(DSCP) 和2位未使用位;RFC3168重新定义RFC2474中TOS域未使用的两位为ECN域,包含如下值:
00:发送主机不支持ECN
01或者10:发送主机支持ECN
11:路由器正在经历拥塞
7.3 随机早期检测RED (Random Early Detection)
使路由器的队列维持两个参数,即队列长度最小门限 THmin 和最大门限 THmax
RED 对每一个到达的数据报都先计算平均队列长度 LAV
若平均队列长度小于最小门限 THmin ,则将新到达的数据报放入队列进行排队
若平均队列长度超过最大门限 THmax,则将新到达的数据报丢弃
若平均队列长度在最小门限 THmin 和最大门限THmax 之间,则按照某一概率 p 将新到达的数据报丢弃
RED 将路由器的到达队列划分成为三个区域
丢弃概率 p 与 THmin 和 Thmax 的关系
当 LAV <Thmin 时,丢弃概率 p = 0
当 LAV >Thmax 时,丢弃概率 p = 1
当 THmin < LAV < THmax时, 0 p 1
例如,按线性规律变化,从 0 变到 pmax
二.拥塞控制
发送方根据自己感知的网络拥塞程度,限制其发送速率
6.1 拥塞控制的类型
网络辅助的拥塞控制
路由器向端系统提供显式的反馈,例如:
设置拥塞指示比特
给出发送速率指示
ATM、X.25采用此类方法
端到端拥塞控制
网络层不向端系统提供反馈
端系统通过观察丢包和延迟,自行推断拥塞的发生
TCP采用此类方法
6.2 TCP拥塞控制要解决的问题
发送方如何感知网络拥塞?
发送方利用丢包事件感知拥塞:
拥塞造成丢包和分组延迟增大
-无论是丢包还是分组延迟过大,对于发送端来说都是丢包了
丢包事件包括:
-重传定时器超时
-发送端收到3个重复的ACK
发送方采用什么机制限制发送速率?
发送方使用拥塞窗口cwnd限制已发送未确认的数据量:
LastByteSent-LastByteAcked <= cwnd
cwnd随发送方感知的网络拥塞程度而变化
发送方感知到网络拥塞后,采取什么策略调节发送速率?
①AIMD
乘性减(Multiplicative Decrease)
发送方检测到丢包后,将cwnd的大小减半(但不能小于一个MSS)
目的:迅速减小发送速率,缓解拥塞
加性增(Additive Increase)
若无丢包,每经过一个RTT,将cwnd增大一个MSS,直到检测到丢包
目的:缓慢增大发送速率,避免振荡
注:MSS是发送速率TCP建立连接时双方确定的每一个报文段所能承载的最大数据长度
②TCP慢启动
慢启动的策略:
每经过一个RTT,将cwnd加倍
慢启动的具体实施:
每收到一个ACK段,cwnd增加一个MSS
只要发送窗口允许,发送端可以立即发送下一个报文段
特点:
以一个很低的速率开始,按指数增大发送速率
区分不同的丢包事件
超时:说明网络交付能力很差
收到3个重复的ACK:说明网络仍有一定的交付能力
收到3个重复的ACK:
将cwnd降至一半
使用AIMD调节cwnd
超时:
设置门限 =cwnd/2
cwnd=1MSS
使用慢启动增大cwnd至门限
使用AIMD调节cwnd
6.3 TCP拥塞控制的实现
发送方维护变量ssthresh
发生丢包时,ssthresh=cwnd/2
ssthresh是从慢启动转为拥塞避免的分水岭:
cwnd低于门限时,执行慢启动
cwnd高于门限:执行拥塞避免
拥塞避免阶段,拥塞窗口线性增长:
每当收到ACK, cwnd=cwnd MSS*(MSS/cwnd)
检测到3个重复的ACK后:
TCP Reno实现: cwnd= ssthresh 3,线性增长
TCP Tahoe实现:cwnd=1 MSS,慢启动
TCP发送端的事件与动作
版权声明:本文为CSDN博主「Dreamchaser追梦」的原创文章,遵循CC 4.0 BY-SA版权协议,
原文链接:https://blog.csdn.net/qq_46101869/article/details/118108697