[置顶] 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,即不进行控制。
[置顶] NS2中TCP拥塞控制仿真过程中盲点解析的更多相关文章
- 转:Oracle中SQL语句执行过程中
Oracle中SQL语句执行过程中,Oracle内部解析原理如下: 1.当一用户第一次提交一个SQL表达式时,Oracle会将这SQL进行Hard parse,这过程有点像程序编译,检查语法.表名.字 ...
- [置顶] NS2中对TCP数据包和ACK包的TCP Sink类的主要实现代码详尽剖析--吐血放送
NS2中对TCP数据包和ACK包的TCP Sink类的主要实现代码详尽剖析,限于个人水平,如有错误请留言指出! TcpSink类的recv()方法: void TcpSink::recv(Packet ...
- cloudsim仿真过程中内存占用过大问题的解决
在写<云环境下基于预算和截止期约束的科学工作流弹性资源提供和调度>这篇文章时用到了cloudsim仿真软件进行实验仿真,在实验过程中遇到了当仿真执行时间过长时程序总是不能正常结束,由于仿真 ...
- [置顶] Ajax程序:处理异步调用中的异常(使用Asp.Net Ajax内建的异常处理方法)
无论在Window应用程序,还是Web应用程序以对用户友好的方式显示运行时的异常都是很有必要,尤其对于可能有很多不确定因素导致异常的Web应用程序;在传统的Web开发中,处理异常的方式——设计专门一个 ...
- opnet仿真过程中SEED的概念问题 分类: opnet 2014-11-02 15:25 69人阅读 评论(0) 收藏
仿真配置中SEED的概念:仿真随机种子,是产生随机数的种子值,反应随机数的状态.只要选定一个种子值,整个随机事件系统就固定了,复杂仿真的随机过程就成了一次实现.目的是测试仿真系统的稳健性,具体来说,针 ...
- IAR FOR AVR 仿真过程中出现全局变量值不断随意变化的问题
本文记录使用IAR FOR AVR 使用过程中出现的问题,确保自己以后能够有史可查,也分享给遇到同样问题的朋友. 版本信息:IAR Assembler for AVR 5.40.0 (5.40.0. ...
- [置顶]
MVC三层架构在各框架中的特征
1.从结构上分析jsp+servlet图解原理: 在基于mvc设计模式下的最原始的jsp+Servlet框架,在某种程度上是不能够达到mvc最直观的体现.当客户端发送请求到服务器时,服务器会将从客户端 ...
- 微软BI 之SSIS 系列 - 对于平面文件中 NULL 值处理过程中容易极易混淆的几个细节
开篇介绍 最近有人问我有关文件处理中空值处理的相关问题: OLE DB Destination 中的 Keep Nulls 如何控制 NULL 值的显示? 为什么选中了 Keep Nulls 但是数据 ...
- oracle中自定义type、以及java中传递list到过程中的例子
在java开发过程中有时候为了处理数据的速度更快,会把要处理的数据组装成list,把list作为过程的一个参数,在过程中批量处理,下面就以一个例子做简单的阐述,以此谨记. --药品目录智能审核 --说 ...
随机推荐
- python 模块BeautifulSoup使用
BeautifulSoup是一个专门用于解析html/xml的库.官网:http://www.crummy.com/software/BeautifulSoup/ 说明,BS有了4.x的版本了.官方说 ...
- Sicily-1024
一. 题意: 有n个节点,n-1条边,并且任意两个节点都连通.模拟一下,实际上是一棵树的便利,求从特定根节点出发最长路径的值.这里用了广搜. 二. 每个节点只有两条邻接边,每个节点用一个vector来 ...
- 配置php网页显示错误
发现问题比解决问题重要,使用php集成开发环境Appserv网页会提示各种语法错误,但自己配置开发环境无法提示错误,特别当不是语法错误,比如com组件的调用,当不知道问题出现在何处,是不能忍受的,这时 ...
- 你喜欢SOAP吗?反正我不喜欢!
叫什么Simple Object Access Protocol,实际上一点都不Simple! 说什么轻量级协议,从它基于XML的编码就知道它有多臃肿! 说什么跨平台特性,其实各个语言需要自己实现一整 ...
- setInterval定义与调用
以下是一个倒计时,可以定义定时器为全局变量(ti2),或局部变量(ti). <script type="text/javascript" src="js/jquer ...
- DTM initialization: failure during startup recovery, retry failed, check segment status (cdbtm.c:1603)
安装greenplum集群出现以下错误: 20160315:13:49:16:025696 gpinitsystem:h95:jason-[INFO]:-Checking configuration ...
- 2014 HDU多校弟五场A题 【归并排序求逆序对】
这题是2Y,第一次WA贡献给了没有long long 的答案QAQ 题意不难理解,解题方法不难. 先用归并排序求出原串中逆序对的个数然后拿来减去k即可,如果答案小于0,则取0 学习了归并排序求逆序对的 ...
- 为centos添加第三方源
默认centos自带的源少了很多好软件,所以需要添加第三方源一.安装CentOS yum源优先级插件yum-prioritiesyum install yum-plugin-priorities.no ...
- activity变成Dialog的样式设置
1.属性解析 <item name="android:windowFrame">@null</item> :Dialog的windowFrame框为无< ...
- WinForm - 两个窗体之间的方法调用
方法1: 所有权法//Form1://需要有一个公共的刷新方法public void Refresh_Method(){ //...} //在调用Form2时,要把Form2的所有者设为F ...