[置顶] NS2中TCP拥塞控制仿真过程中盲点解析

最近利用NS2做TCP拥塞控制协议的仿真,发现很多变量的方法含义都是解释的不清楚,给核心模块修改带来很多麻烦,所以决定用最准确的语言解释成员变量、方法,术语等的含义。限于个人水平,若有错误请留言指正!

盲点一:

int recover_;(tcp.h/tcp.cc)

这个变量的最准确的含义是发送端在收到3个重复的ACK或超时或者源抑制或者带有ECN-Echo的ACK时,发送端已经发送的最大序列号。

盲点二:

源抑制(source quench):当TCP/IP主机发送数据到另一主机时,如果速度达到路由器或者链路的饱和状态,路由器发出一个ICMP源抑制消息。源抑制消息在仿真中具体的意思是接收端返回的某段时间第一个带有ECE为的ACK。

盲点三:

Karn算法 (Karn algorithm):该算法目的是为了准确计算RTO,用于发送端重传报文段后,收到相应的确认报文段时无法确定此确认报文段是对先发送的报文段的确认,还是对后来重传的报文段的确认?因为由于重传的报文段与原先的报文段完全一样,所以发送端就无法正确计算平滑的往返时间(SRTT)。Karn算法:计算SRTT时,只要报文段重传了,就不采用其往返时间样本。

盲点三:

指数退避算法(Exponential backoff algorithm):该算法可以说是对Karn算法很好的改进,改进方法:报文段每重传一次,就把超时重传时间RTO增大一些。典型的做法是取新的重传时间为2倍的就得重传时间。当不再发生报文段的重传时,才根据正常的计算方法计算RTO。

盲点四:

TracedInt maxseq_; (tcp.h/tcp.cc)

这个变量的意思就是截止到现在为止发送端已经发送的报文段的最大序列号,而不仅限用于Karn算法。

盲点四:

Nagle算法:该算法要求一个T C P连接上最多只能有一个未被确认的未完成的小分组,在该分组的确认到达之前不能发送其他的小分组。相反,T C P收集这些少量的分组,并在确认到来时以一个分组的方式发出去。该算法的优越之处在于它是自适应的:确认到达得越快,数据也就发送得越快。

盲点五(tcp.cc):

if (hdr_flags::access(pkt)->ecnecho() && ecn_)

     ecn(tcph->seqno());

这段代码的意思是,如果接收到的该ACK包头部的ECN-Echo位置1,并且状态指示变量ecn_为1,即TCP连接两端支持ECN。那么用该ACK包所指示的序列号(也就是该ACK包头上的序列号,也就是要求发送端发送的下个报文段的序列号)做参数,调用ecn()方法进行降低窗口的相关处理。到此时,还没有对ACK是否是重复ACK进行判断。

盲点六:

int seqno_; (tcp.h/tcp.cc)              //与curseq_的意思一致,指的是发送端目前产生的最大序列号(个人理解应该指的是在窗口可发送范围内的最大序列号),但是该序列号报文段可能还未被发送,用于trace,C++模块中用curseq_进行参数传递

TracedInt t_seqno_;(tcp.h/tcp.cc)   //将要发送的报文段序列号,也就是ACK指示的序列号,用于trace

int seqno;(tcp.cc)                               //与上面的t_seqno_意思一样,用于参数的的传递,代码中:int seqno = t_seqno_;可以说明

盲点七:

ecn_backoff_;(tcp.h/tcp.cc)      //这个变量表示是不是进行ecn回退,说到这里可能还是不明白什么是ecn回退?从源头说起,当启用ecn后,发送端就会根据返回的ACK包来进行适当地减少拥塞窗口(也就是带有ECE位的ACK,但并不是收到每个带有ECE位的ACK都减少),若是拥塞比较严重,就会出现拥塞窗口降到cwnd_ <= 1.0的情况,此时再收到带有ECE位的ACK窗口就无法再减半,所以启用ecn回退,也就是置ecn_backoff_ = 1;rtt_backoff()回退调用后就可以将RTO加倍。

ecn_burst_;(tcp.h/tcp.cc)       //表示前一个ACK包是否带有ECE位,当前一个ACK带有ECE位ecn_burst_=1。

old_ecn_;(tcp.h/tcp.cc)         //为了往后兼容ECN实现方法,默认值为1,表示兼容

control_increase_;(tcp.h/tcp.cc)  //如果为真,那么发送端不进行窗口限制的情况下,也不增加发送窗口,默认值为0,即不进行控制。 

你可能感兴趣的:(tcp)