Ns3源码分析以及对于DcTcp性能的比较
1. 类图:
2. 模型关系:
3. 消息发送调用链 (基于first.cc
)
4. 消息接收调用链 (基于first.cc
)
2. 对于不同协议在dctcp_example.cc
环境下性能差异的问题
1. 问题现象描述:
为了解DcTcp和其他协议相比的性能优势, 在不改动 dctcp_example.cc 的其他代码环境下将 TcpDctcp 协议分别替换为 TcpCubic 和 TcpLinuxReno. 分别进行运行, 并比较输出的 example-t1-length.dat 发现以下现象.
设计目的为控制拥塞的 DcTcp 反而拥有更高的队列长度.
2. 问题分析结果:
在DcTcp
的论文中, 作者使用的队列时当超过某一限制之后全部标记CE
. 而dctcp-example.cc
中使用的ns3::RedQueueDisc
类进行CE
标记时遵循以下规则:(开启HardDrop
时k = 1
,反之k = 2
)
-
n_enqueued < minTh
时, 不进行标记 -
minTh <= n_enqueued <= k*maxTh
时, 进行某一概率p的随机标记 -
k*maxTh<= n_enqueued
时, 进行全部标记
但是当TCP协议未开启ECN时,或TCP协议包不支持ECN时, 采用以下规则: (开启HardDrop
时k = 1
,反之k = 2
)
-
n_enqueued < minTh
时, 不进行丢包 -
minTh <= n_enqueued <= k*maxTh
时, 进行某一概率p的随机丢包 -
k*maxTh <= n_enqueued
时, 进行全部丢包
注: p的大小与n_enqueued的大小以及拥塞持续的时间相关
由于TcpCubic
和TcpLinuxReno
都是基于丢包的协议. 它们的收敛点被设计在丢包率为0附近. 而Dctcp
由于在论文中使用的是 概率为0 或 概率为1 的标记. 其收敛点被设计在 P(CE) < 1 以下. 而因为需要避免过度响应导致交换机的性能浪费, 在Dctcp
的设计中将标记率设置为 P(CE) > 0 的点. 因为收敛的极限不同, 导致协议表现出的队列长度相差较大.
3. 对于问题的解决:
对于ns3::RedQueueDisc
的代码进行修改:
禁用生成概率p
的函数, 将p
替换成常量1. 使得队列长度大于minTh
之后标记CE
和丢包的概率都为1. 这样使得 TcpCubic
, TcpLinuxReno
, Dctcp
有相近的收敛点.
修改函数之后的结果: