谷歌quic协议自带网络仿真器代码分析(一)

    谷歌的quic代码中带有一个离散时间仿真器,十分短小精悍,易于理解。对于开源的网络离散仿真器,omnet++,ns2(to name a few),自成体系,规模庞大,难以理解。所以本篇文章分析下quic中的simulator,它山之石,可以攻玉。其他的仿真器也可以按照这样的流程理解。

    里面主要有这个几个抽象,Actor,Simulator,Queue,Port,Link,EndPoint。其中Simulator负责总的数据包的传输仿真,负责回调注册到队列的中的Actor。基本模型就是,链路上模拟时延,交换机上模拟队列,队列可以设置长度。Sender与Receiver中的队列可以理解为网卡中的发送队列。

    数据的发送流程,发送端将数据包发送到网卡队列中,网卡队列将数据包发送到链路上(要等待上次数据包产生的发送时延,这里模拟的是网卡的处理能力),l链路模拟传输时延和发送时延(数据包长度/发送带宽),交换机负责数据包的转发,转发数据到接收链路(发送时延+传输时延,调度时间在上次数据包的传输时延之后)

    Sender(Queue)<-----(Link 10Mbps 2ms)----->Switch(Port Queue)<--------(Link 4Mbps  30ms )------->Receiver(Queue)

    交换机中的Port中存在队列,在例子中设置为4*BDP(为什么是这样一个大小,需要后续研究,这个好像与谷歌提出的拥塞控制算法BBR相关)。在交换机中,如果队列长度大于队列容量,则将数据包丢弃。发生丢包时,就是交换机中数据包的接收速度高于发送速度,比如上图所示,发送端按照10M的速度发包,导致交换机在4M链路上来不及处理数据包,就会出现排队现象。

    经过四天的努力,终于把simulator中的代码摘取了出来。下载地址[2]。采用codeblocks的ide,使用了PRId64,编译程序需要定义宏-D__STDC_FORMAT_MACROS[3]。

 

 

[1]quic代码中simulator的位置

[2]代码下载

[3]C++中正确使用PRId64

你可能感兴趣的:(C加加)