[置顶] 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作为过程的一个参数,在过程中批量处理,下面就以一个例子做简单的阐述,以此谨记. --药品目录智能审核 --说 ...
随机推荐
- JFreeChart画折线图
请见Github博客: http://wuxichen.github.io/Myblog/htmlcss/2014/09/01/JFreechartLinechart.html
- rac 实例被莫名重启的案例分析
详见原文博客链接地址: Rac 实例被莫名重启一列分析
- Java chapter04-1
public class CPU { int speed; //获得speed的值 public void setSpeed(int m){ speed = m; } //返回speed的值 publ ...
- 1369 - Answering Queries(规律)
1369 - Answering Queries PDF (English) Statistics Forum Time Limit: 3 second(s) Memory Limit: 32 M ...
- [Android学习笔记5]四大应用组件之一:Service 下
绑定方式的Service使用 在实现绑定服务时,最重要的是定义onBind()回调方法返回的接口,有三种方式: 1. 继承Binder类 2. 使用Messenger 3. 使用AIDL 这里对1,2 ...
- Codeforces Round #250 (Div. 2)—A. The Child and Homework
好题啊,被HACK了.曾经做题都是人数越来越多.这次比赛 PASS人数 从2000直掉 1000人 被HACK 1000多人! ! ! ! 没见过的科技啊 1 2 4 8 这组数 被黑的 ...
- 乐视(letv)网tkey破解
乐视网tkey算法频繁变动,怎样才干获得她算法的源代码,以不变应万变? 本文仅仅用于技术交流.提醒各位尊重站点版权,请勿用于其他用途,否则后果自负! 使用软件 Adobe Flash Builder ...
- Android学习——百度地图开发定位与显示Demo
百度地图给我们提供了很丰富的API供我们进行二次开发.百度地图的SDK与定位SDK在今年6月份进行了更新. 地图更新为3.0,定位更新为4.2.百度说:这次更新对接口有了较大部分的调整,与之前版本号不 ...
- 2013 成都网络赛 1004 Minimum palindrome
题目大意:用m个字母组成一个长度为N的字符串,使得最长的回文子串 的长度最小. 并且要求字典序最小. 思路:分类模拟. 当M为1 的时候就直接输出N个A 当M大于2的时候就循环ABC 当M等于2的时候 ...
- 计算闰年_winform
新建窗体应用程序(如下),新建控件label1,label2,label3,textBOX1,button1,button2 label1的Text属性改为“计算闰年演示” label2的Text属性 ...