TCP超时时间的计算

news/2024/5/17 19:19:00 标签: tcp, 网络, 算法

转:http://blog.csdn.net/metasearch/archive/2008/03/07/2157017.aspx

超时重传是TCP协议保证数据可靠性的另一个重要机制,其原理是在发送某一个数据以后就开启一个计时器,在一定时间内如果没有得到发送的数据报的ACK报文,那么就重新发送数据,直到发送成功为止。

1.超时
超时时间的计算是超时的核心部分,TCP要求这个算法能大致估计出当前的网络状况,虽然这确实很困难。要求精确的原因有两个:(1)定时长久会造成网络利用率不高。(2)定时太短会造成多次重传,使得网络阻塞。所以,书中给出了一套经验公式,和其他的保证计时器准确的措施。

1.1.递推公式概说
最早的TCP曾经用了一个非常简单的公式来估计当前网络的状况,如下

R<-aR+(1-a)M
RTP=Rb
其中a是一个经验系数为0.1,b通常为2。注意,这是经验,没有推导过程,这个数值是可以被修改的。这个公式是说用旧的RTT(R)和新的RTT (M)综合到一起来考虑新的RTT(R)的大小。但是,我们又看到,这种估计在网络变化很大的情况下完全不能做出“灵敏的反应”(Jacoboson说 的,不是偶说的,呵呵),于是就有下面的修正公式:

Err=M-A
A<-A+gErr
D<-D+h(|Err|-D)
RTO=A+4D
具体的解释请看书的228页,这个递推公式甚至把方差这种统计概念也使用了进来,使得偏差更加的小。而且,必须要指出的是,这两组公式更新,都是在 数据成功传输的情况下才进行,在发生数据重新传输的情况下,并不使用上面的公式进行网络估计,理由很简单,因为程序已经不在正常状态下了,估计出来的数据 也是没有意义的。

1.2.RTO的初始化
RTO的初始化是由公式决定的,例如最初的公式,初始的值应该是1。而修正公式,初始RTO应该是A+4D。

1.3.RTO的更新
当数据正常传输的情况下,我们就会用上面的公式来更新各个数据,并重开定时器,来保证下一个数据被顺利传输。要注意的是:重传的情况下,RTO不用上面的公式计算,而采用一种叫做“指数退避”的方式。例如:当RTO为1S的情况下,发生了数据重传,我们就用RTO=2S的定时器来重新传输数据,下一次用4S。一直增加到64S为止。

1.4.估计器的初始化
在这里,SYN用的估计器初始化似乎和传输数据用的估计器不一样(我也没有把握)造我的理解,在修正公式中,SYN的情况下,A初始化为0,D初始化为3S。

而在得到传输第一个数据的ACK的时候,应该按照下面的公式进行初始化:

A=M+0.5
D=A/2
1.5.估计器的更新
和上面的讨论差不多,就是在正常情况下,用上面的公式计算,在重传的情况下,不更新估计器的各种参数。原因还是因为估计不准确。

1.6.Karn算法
这不算是一个算法,这应该是一个策略,说的就是更新RTO和估计器的值的时机选择问题,1.3.和1.5.所说得更新时机就是Karn算法

1.7.计时器的使用
两句话:

一个连接中,有且仅有一个测量定时器被使用。也就是说,如果TCP连续发出3组数据,只有一组数据会被测量。
ACK数据报不会被测量,原因很简单,没有ACK的ACK回应可以供结束定时器测量。

 

参考资料:

1.《TCP/IP详解 VOL.1》21.3节


http://www.niftyadmin.cn/n/923426.html

相关文章

拥塞控制

为了防止网络的拥塞现象&#xff0c;TCP提出了一系列的拥塞控制机制。最初由V. Jacobson在1988年的论文中提出的TCP的拥塞控制由“慢启动(Slow start)”和“拥塞避免(Congestion avoidance)”组成&#xff0c;后来TCP Reno版本中又针对性的加入了“快速重传(Fast retransmit)”…

Nagle算法

RFC 896[Nagle 1984]中提出了Nagle算法。Nagle算法针对的问题是&#xff1a;广域网上大量的小分组会增加拥塞出现的可能。Nagle算法的思想&#xff1a;该算法要求一个TCP连接上最多只能有一个未被确认的未完成的小分组&#xff0c;在该分组的确认到达之前不能发送其他小分组。相…

RST复位报文段

TCP首部中的RST比特是用于“复位”的。一般来说&#xff0c;无论何时一个报文段发往基准的连接出现错误&#xff0c;TCP都会发出一个复位报文段。TCP在下列三种情况下产生RST复位报文段。 1.到不存在的端口的连接请求 产生复位的一种常见情况是当连接请求到达时&#xff0c;目…

tcpdump抓包分析TCP三次握手过程

转&#xff1a;http://hi.baidu.com/xxjjyy2008/blog/item/e6566bf837d91903d9f9fdd0.html 一、 tcpdump使用 1、首先看下MAN手册 TCPDUMP(8) …

epoll

I/O多路复用技术在比较多的TCP网络服务器中有使用&#xff0c;即比较多的用到select函数。在linux2.6内核中&#xff0c;有了一种替换它的机制&#xff0c;就是epoll。 一、epoll相关的数据结构和函数 epoll用到的所有函数都是在头文件sys/epoll.h中声明的&#xff0c;下面简…

多进程服务器中,epoll的创建应该在创建子进程之后

转&#xff1a;http://blog.csdn.net/wei801004/archive/2009/06/13/4264031.aspx 看我的测试代码,似乎应该是在创建子进程之后创建epoll的fd,否则程序将会有问题,试将代码中两个CreateWorker函数的调用位置分别调用,一个在创建epoll fd之前,一个在之后,在调用在创建之前的代码…

c语言共用体对齐

还从网上找到共用体内存分配原则的文章&#xff0c;下面列几个例子说明&#xff1a; 1.Union data1{ double d; int i; char c1; char c2[9]; }; sizeof(union data1)的值为16.在编译器默认设置的情况下&#xff0c;该共用体最大基本类型为double,它占8字节&#…

gdb调试正在运行的进程

转&#xff1a;http://hi.baidu.com/brady_home/blog/item/6b92aa8ffdfee2e6f01f369b.html 有时会遇到一种很特殊的调试需求&#xff0c;对当前正在运行的其它进程进行调试&#xff08;正是我今天遇到的情形&#xff09;。这种情况有可能发生在那些无法直接在调试器中运行的进…