目录
TCP拥塞控制机制
- 端到端的拥塞控制机制
-
路由器不向主机提供有关拥塞的反馈信息
|-----------------------------|
| 路由器负担较轻 符合网络核心简单的TCP/IP架构原则 | -
端系统根据自身得到的信息判断是否发生拥塞,从采取动作
-
- 拥塞控制的问题
-
如何检测拥塞
|---------|
| 轻微拥塞 拥塞 | -
控制策略
|--------------------------------------------------|
| 在拥塞发送时如何动作,降低速率:轻微拥塞和拥塞的时候如何降低 在拥塞缓解的时候如何动作,增加速率 |
-
TCP拥塞感知
发送端如何探测到拥塞
-
某个段超时了:拥塞
-
超时时间到,某个段的确认没有来(一旦超时,就认为拥塞了,有一定误判,但是总体控制方向是对的)
|-------------------------------------------------------------------|
| 原因1:网络拥塞(某个路由器缓冲区没空间了,被丢弃)概率大 原因2:出错被丢弃了(传输过程中受到干扰,没有通过校验,被丢弃)概率小 |
-
-
有关某个段的3次重复ACK:轻微拥塞(后三个是正常到的,相当于发出去4个堵了1个,说明轻微拥塞了)
- 段的第1个ACK,正常,确认吕端,期待红段
- 段的第2个重复ACK,意味着红段的后一段收到了,蓝段乱序到达
- 短的第2,3,4个ACK重复意味着红段的后第2,3,4个段收到了,橙段乱序到达,同时红段丢失的可能性很大
TCP速率控制方法
- 如何控制发送端发送的速率
-
维持一个拥塞窗口的值:CongWin
-
发送端限制已发送但是未确认的数据量(的上限):
|---------------------------------------|
| 传输的最后一个字节序号 - 最后一个接收的字节序号 <= CongWin | -
从而粗略的控制发送方的网络中注入的速率
-
CongWin是动态的,是感知到的网络拥塞程度的函数
-
超时或者三个重复ACK,CongWin
|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 超时:CongWin降低为1MSS,进入SS(Slow Start)阶段然后再倍增到CongWIN/2(每个RTT),从而进入CA(Congestion Avoidance)阶段(是超时的话就先把窗口降到1MSS,然后每一个RTT翻倍,直到到达原窗口的一半,开始每个RTT增加1MSS) 3个重复ACK:CongWin降为CongWin/2,CA阶段 | -
否则(正常收到ACK,没有发送以上情况):CongWIn跃跃欲试
|-----------------------------------|
| SS阶段:加倍增加(每个RTT) CA阶段:线性增加(每个RTT) |
-
-
TCP拥塞控制和流量控制的联合动作
- 拥塞窗口值决定了由于拥塞控制的因素,发送方一次可以向网络当中在未经确认的情况下网网络当中注入字节的数量。
- 对方接收窗口告诉发送方在未经确认的情况下可以向对方发送多少字节,到了对方一定有缓冲区可以把它存下,从而满足流量控制的目的(共享缓冲区是通过网络发送的)。
- 这两个值的最小值决定了发送方一次在未确认的情况下可以往网络当中注入字节的数量。几满足了流量控制的要求,又满足了拥塞控制的要求。简单来说就是拥塞窗口大小和空闲缓冲区大小取一个最小值作为一次性可以注入的字节量
TCP拥塞控制策略
- 慢启动(SS)
- 在 TCP 连接刚刚建立时,拥塞窗口(Congestion Window,CongWin)通常会初始化为一个较小的值
- 每收到一个确认,拥塞窗口值+1,从而每个RTT拥塞窗口值加倍
- 这样子指数型额的增加必定会导致拥堵
- AIMD(Additive Increase, Multiplicative Decrease)
- 乘性减
- 丢失时间以后将CongWin降低为1,将CongWin/2作为阈值,进入慢启动阶段
- 加性增
- 当CongWin>阈值的时候,如果一个RTT没有发生丢弃事件,将CongWin+1MSS;探测
- 当收到3个冗余的ACK
- CongWin减半,窗口(缓冲区大小)之后线性增长
- 当超时时间发生的时候
- CongWin被设置为1MSS,进入SS阶段
- 之后窗口指数增长
- 增长到一个阈值(上次发生拥塞的窗口的一半)的时候再线性增加
- 乘性减
思路:三个重复的ACK表示网络还有一定的段传输能力,超时之前的3个重复的ACK表示"警报"
- 超时事件后的保守策略
- 将指数型增长变成线性的时候:在超时之前,当CongWin变成上次发生超时的窗口的一半
- 实现
- 变量:Threshold
- 出现丢失:Threshold设置为CongWin的1/2
下面收到三个冗余ACK后除二,加三的原因是有三个冗余ACK,遇见一个加一
TCP吞吐量
- 假设拥塞窗口为w
- 拥塞控制让他从w/2值到w变化,所以平均吞吐量(ss时间比较短所以忽略ss阶段)
TCP公平性
- 如果有两个主机对分享了一个瓶颈的链路限制了主机和主机之间的通讯的带宽,每对主机会获得1/n的带宽
- 为什么TCP是公平的(大致公平)
- 两个竞争的TCP会话
- 加性增加,斜率为1,吞吐量增加
- 乘性减,吞吐量比例减少
- 假设起初是不公平的:因为二者没有充分使用带宽所以开始进入拥塞避免阶段(ss时间太短,忽略),最后因为有缓冲队列的存在,会有一段时间x+y>R,最终A到A'和B到B'都会拥塞,然后就会RTT拥塞窗口减半,最终二者占用链路将趋于相等
- 两个竞争的TCP会话