最近利用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. Maven--几个需要补充的问题(三)

    <Maven--搭建开发环境(一)> <Maven--构建企业级仓库(二)> <Maven—几个需要补充的问题(三)> 前两篇由于篇幅太长,为了给读者理解方便,这篇 ...

  2. 【centos6 , 7】 网络原理、网络配置

    第一部分:网络原理: 一.网络编址 (主要使用IP编址) 1.ip编址是一个双层编址方案,一个ip地址标识一个主机(或一个网卡接口) 2.现在应用最为广泛的是IPv4编址,已经开始逐渐向IPv6编址转 ...

  3. Java--再次理解多态

    Java中多态性(polymorphism)的实现 什么是多态 1. 面向对象的三大特性:封装.继承.多态.从一定角度来看,封装和继承几乎都是为多态而准备的.这是我们最后一个概念,也是最重要的知识点. ...

  4. get get_children方法

    get 方法: [root@wx03 zook]# cat a4.pl use ZooKeeper; use AnyEvent; use AE; use Data::Dumper; my $zk = ...

  5. PHP通过Thrift操作Hbase

    PHP通过Thrift操作Hbase     HBase是一个开源的NoSQL产品,它是实现了Google BigTable论文的一个开源产品,和Hadoop和HDFS一起,可用来存储和处理海量col ...

  6. vnc server配置、启动、重启与连接,图形管理linux系统

    环境:RedHat Linux 5企业版.Xwindows:gnome (红帽默认安装的图形界面) 尽管我们可以使用SSH连接远程通过字符界面来操作Linux,但是对于更多熟悉图形人来说是很不方便的, ...

  7. HDU 1573 X问题 中国剩余定理

    链接:pid=1573">http://acm.hdu.edu.cn/showproblem.php? pid=1573 题意:求在小于等于N的正整数中有多少个X满足:X mod a[ ...

  8. Git学习笔记总结和注意事项

    一.Git简单介绍 Git是眼下世界上最先进的分布式版本号控制系统.其特点简单来说就是:高端大气上档次! 二.Windows上Git安装 最早Git是在Linux上开发的.非常长一段时间内.Git也仅 ...

  9. iOS:(接口适配器3)--iPhone适应不同型号 6/6plus 前

    对于不同的苹果设备.检查每个参数<iOS:机型參数.sdk.xcode各版本号>.        机型变化 坐标:表示屏幕物理尺寸大小,坐标变大了.表示机器屏幕尺寸变大了: 像素:表示屏幕 ...

  10. Android SurfaceView实战 带你玩转flabby bird (下)

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/43063331,本文出自:[张鸿洋的博客] 1.概述 在Android Surfa ...