重读一遍《tcp/ip详解》,感受比第一遍学的时候领悟又深了一些,作点记录。算法
1、首先是关于tcp超时重传的问题,简单来讲,tcp在发送完一份数据包以后会设定一个定时器,当定时器超时以前尚未关于这份报文的ACK到达的话,tcp就会认为这份报文超时,从而进行重传。可是如今的一个主要问题就是,超时定时器如何设定,设定值太大的话,丢失的数据包不能被及时发送,过小的话,原本没有丢失的数据包也被重传,也会影响网络性能。如今咱们须要一个算法来肯定RTO(retransmission timeout)。网络
算法1:RTT = αRTT + (1 - α)Mtcp
RTO = βRTTide
其中α推荐取值为0.9,β推荐取值为2,M为RTT的测量值,RTT为往返时延估计值性能
算法2:Err = M - Aip
A = A + g·Errit
D = D + h·(|Err| - D)io
RTO = A + 4·Dclass
其中M为RTT测量值,A为估计值定时器
当报文被发送出去以后,超时定时器启动,通过一个RTO以后若是没有相应的ACK到达,则重发报文,而后超时定时器被定为2RTO,以后若是仍是没有收到ACK,则超时时延被定为4RTO,以后是8RTO。。。,可是Karn等人在1987年提出,若是一个报文在超时重传以后又收到了ACK,此时不能更新RTT和RTO,由于不知道此ACK是第一个报文的仍是第二个报文的。
2、再有就是tcp拥塞避免的问题。
在tcp协议中,有两个算法帮助实现拥塞避免,一个是慢启动算法,另外一个是拥塞避免算法。
慢启动算法:在tcp链接开始时,发送方初始化一个大小为一个最大报文段(MSS)的窗口,称为拥塞窗口,在此后的过程当中,发送方每收到一个ACK就将拥塞窗口加1,而后将此窗口和滑动窗口的最小值做为发送窗口。
拥塞避免算法:跟慢启动算法相似,此算法也是在收到ACK时更新拥塞窗口的值,所不一样的是它并非在收到一个ACK后将窗口加1,而是加1/cwnd(拥塞窗口)。具体算法是,cwnd(t+1) = cwnd(t) + mss*mss/cwnd(t)。
下面描述下完整的tcp拥塞避免算法:
对于一个tcp连接,初始化cwnd为1个最大报文段长度,ssthresh为65535字节。而后开始执行慢启动,直到cwnd的值大于ssthresh的值,此后执行拥塞避免。期间若是发生重传(超时或者收到重复的ACK),则将ssthresh的值更新,ssthresh = max(min(cwnd,awnd)/2,2*mss),基本是将ssthresh的值减半,而后分状况讨论,若是是超时致使的重传,则将cwnd变为1,从新开始慢启动,若是是重复ACK致使的重传,则将cwnd变为ssthresh的值,继续往下走,若是cwnd大于ssthresh执行拥塞避免,若是小于则执行慢启动。