假设tcp的拥塞控制算法为Tcp Reno,ssthresh=20,拥塞窗口的初始值为1.假设网络链路为n0<–(B1,D1)–>n1<–(B1,D2)–>n2,其中(B,D)分别代表带宽和时延,B1>B2。假设这条链路仅有一个tcp session。现在,从理论上分析下这条链路的丢包情况。根据之前的分析[1],tcp的发包的时间间隔匹配的是ack的返回间隔,也就是瓶颈链路处理两个数据包的时间间隔。我用符号“1”表示一个数据包。
在慢启动阶段,第一个周期发送了一个数据包”1”(seq0).第二个周期发送两个数据包”11”(seq1,seq2).”11”在瓶颈链路排队,接受端接收数据包的间隔
Δτ=MTUB2
,ack的返回间隔为
Δτ
.第三个周期发送数据包,”11”(seq3,seq4)<
Δτ
>”11”(seq5,seq6),就是收到对数据包1的确认,可以连续发送数据包3,4;间隔
Δτ
收到对数据包2的确认,可以发送数据包5,6.第四个周期,可以发送”11”(seq7,seq8)<
Δτ
>”11”(seq9,seq10)<
Δτ
>”11”(seq11,seq12)<
Δτ
>”11”(seq13,seq14).以此类推,直到达到了慢启动的阈值。
关于占用的队列长度,分析下极端的情况,假设链路时延(D1,D2)为0,就是链路上不存在流动的数据包。
周期 | 间隔 | 数据包(序号) | 队列占用 | ack确认 | cwnd |
---|---|---|---|---|---|
1 | Δτ | 0 | 1 | 1 | |
2 | Δτ | 1,2 | 2 | 0 | 2 |
3 | Δτ | 3,4 | 3 | 1 | 3 |
3 | Δτ | 5,6 | 4 | 2 | 4 |
4 | Δτ | 7,8 | 5 | 3 | 5 |
4 | Δτ | 9,10 | 6 | 4 | 6 |
4 | Δτ | 11,12 | 7 | 5 | 7 |
4 | Δτ | 13,14 | 8 | 6 | 8 |
5 | Δτ | 15,16 | 9 | 7 | 9 |
5 | Δτ | 17,18 | 10 | 8 | 10 |
5 | Δτ | 19,20 | 11 | 9 | 11 |
5 | Δτ | 21,22 | 12 | 10 | 12 |
5 | Δτ | 23,24 | 13 | 11 | 13 |
5 | Δτ | 25,26 | 14 | 12 | 14 |
5 | Δτ | 27,28 | 15 | 13 | 15 |
5 | Δτ | 29,30 | 16 | 14 | 16 |
第五个周期一共可以发16个数据包。每两个包之间间隔为
Δτ
。在慢启动的条件下,每经过一个RTT,窗口值翻倍。本周期在发送最后的数据包之前,收到的是对上个rtt中最后一个数据包的确认。此周期的队列占用等于本周期发送的数据包个数。
[2]中有个很形象的视频,说明了tcp的数据包发送过程与路由器的队列占用情况。
[1]BBR与CoDel
[2]TCP congestion control in lossy wireless networks