最近利用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,即不进行控制。

[置顶] NS2中TCP拥塞控制仿真过程中盲点解析的更多相关文章

  1. 转:Oracle中SQL语句执行过程中

    Oracle中SQL语句执行过程中,Oracle内部解析原理如下: 1.当一用户第一次提交一个SQL表达式时,Oracle会将这SQL进行Hard parse,这过程有点像程序编译,检查语法.表名.字 ...

  2. [置顶] NS2中对TCP数据包和ACK包的TCP Sink类的主要实现代码详尽剖析--吐血放送

    NS2中对TCP数据包和ACK包的TCP Sink类的主要实现代码详尽剖析,限于个人水平,如有错误请留言指出! TcpSink类的recv()方法: void TcpSink::recv(Packet ...

  3. cloudsim仿真过程中内存占用过大问题的解决

    在写<云环境下基于预算和截止期约束的科学工作流弹性资源提供和调度>这篇文章时用到了cloudsim仿真软件进行实验仿真,在实验过程中遇到了当仿真执行时间过长时程序总是不能正常结束,由于仿真 ...

  4. [置顶] Ajax程序:处理异步调用中的异常(使用Asp.Net Ajax内建的异常处理方法)

    无论在Window应用程序,还是Web应用程序以对用户友好的方式显示运行时的异常都是很有必要,尤其对于可能有很多不确定因素导致异常的Web应用程序;在传统的Web开发中,处理异常的方式——设计专门一个 ...

  5. opnet仿真过程中SEED的概念问题 分类: opnet 2014-11-02 15:25 69人阅读 评论(0) 收藏

    仿真配置中SEED的概念:仿真随机种子,是产生随机数的种子值,反应随机数的状态.只要选定一个种子值,整个随机事件系统就固定了,复杂仿真的随机过程就成了一次实现.目的是测试仿真系统的稳健性,具体来说,针 ...

  6. IAR FOR AVR 仿真过程中出现全局变量值不断随意变化的问题

    本文记录使用IAR FOR AVR 使用过程中出现的问题,确保自己以后能够有史可查,也分享给遇到同样问题的朋友. 版本信息:IAR Assembler for AVR  5.40.0 (5.40.0. ...

  7. [置顶] MVC三层架构在各框架中的特征

    1.从结构上分析jsp+servlet图解原理: 在基于mvc设计模式下的最原始的jsp+Servlet框架,在某种程度上是不能够达到mvc最直观的体现.当客户端发送请求到服务器时,服务器会将从客户端 ...

  8. 微软BI 之SSIS 系列 - 对于平面文件中 NULL 值处理过程中容易极易混淆的几个细节

    开篇介绍 最近有人问我有关文件处理中空值处理的相关问题: OLE DB Destination 中的 Keep Nulls 如何控制 NULL 值的显示? 为什么选中了 Keep Nulls 但是数据 ...

  9. oracle中自定义type、以及java中传递list到过程中的例子

    在java开发过程中有时候为了处理数据的速度更快,会把要处理的数据组装成list,把list作为过程的一个参数,在过程中批量处理,下面就以一个例子做简单的阐述,以此谨记. --药品目录智能审核 --说 ...

随机推荐

  1. perl学习(5) 输入和输出

    1.1. 从标准输入设备输入 <STDIN> 行输入操作在到达文件的结尾时将返回undef,在while循环的条件中不能使用chomp: while (defined($line = &l ...

  2. HDU2084:数塔(DP)

    Problem Description 在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大 ...

  3. 链接分析算法之:主题敏感PageRank

    链接分析算法之:主题敏感PageRank     前面的讨论提到.PageRank忽略了主题相关性,导致结果的相关性和主题性降低,对于不同的用户,甚至有很大的差别.例如,当搜索“苹果”时,一个数码爱好 ...

  4. skin++ 终极破解之法

    *[标题]:Skin++通用界面换肤系统V2.0.1破解探讨 *[作者]:gz1X <gz1x(at)tom(dot)com> *[来自]:中国黑客联盟 *[前言]: skin技术,大家都 ...

  5. mmc一维下料例子

    数据来自维基, 长度 = 5600; l切割长度= {1380, 1520, 1560, 1710, 1820, 1880, 1930, 2000, 2050, 2100, 2140,     215 ...

  6. Codeforces 455B A Lot of Games(字典树+博弈)

    题目连接: Codeforces 455B A Lot of Games 题目大意:给定n.表示字符串集合. 给定k,表示进行了k次游戏,然后是n个字符串.每局開始.字符串为空串,然后两人轮流在末尾追 ...

  7. BZOJ-1007-水平可见直线-HN2008

    描写叙述 在xoy直角坐标平面上有n条直线L1,L2,-Ln,若在y值为正无穷大处往下看,能见到Li的某个子线段,则称Li为可见的,否则Li为被覆盖的. 比如,对于直线: L1:y=x; L2:y=- ...

  8. 一个人的旅行(Dijkstra算法)

    这道题可用Dijkstra算法,好像还有floyd等算法,慢慢研究 Description 虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途 ...

  9. System.IO

                 I/O       1.文件操作:File (1)void AppendAllText(string path, string contents) (2)bool Exist ...

  10. Hibernate + Spring (quartz) 整合懒(延迟)加载问题

    开发项目的时候 在一个Job中执行了数据库操作, 用的是懒加载,但是如下错误 org.hibernate.LazyInitializationException: failed to lazily i ...