TCP对比UDP的三大特色:可靠传输,流量控制,拥塞控制
可靠传输对应于TCP实现中的超时重传,这看似很简单,但选择重传的时机却很是复杂.当前
采取karn算法,总的原则有:
超时重传时间RTO(Retransmission Time-Out)应略大于加权平均往返时间RTTs,其中RTTs
比报文段的往返时间RTT(Round Trip Time)值更平滑(即两个相隔的RTTs值比两个相邻的
RTT值更差距更少),具体来说RTTs的计算如下:
新的RTTs = (1 - a) x (旧的RTTs) + a x (新的RTT样本)
其中RTT样本根据报文段发出时间以及相应的确认报文的接收时间来确定.
由上式可知,a的值越大,则RTT变化的幅度越大,而RFC 2988推荐的a值为1/8,这就不知道他
用什么数学方法计算出来的了.同时他也建议使用下式计算RTO:
RTO = RTTs + 4 x RTTd
而RTTd是RTT的偏差的加权平均值,它的计算与RTTs的计算模式相似,但我不明白有什么意
义,就不写出来了.
而第二个原则是,当报文段发生重传时,不采用这个报文段作计算RTO的样本,但这样就会出
问题,例如某时刻之后传播时延突然增大了许多,导致在原本的RTO时间内,报文未能收到确
认,于时重传,但由于重传之后RTO并不会更新(不选择重传报文作样本),所以后续发送的所
有报文只能继续采用旧的RTO,这将导致所有报文至少都要重传一次.
所以必须对karn算法作出修正,方法是:报文段每重发一次,就将RTO增大一倍.然后当重传
不再发生时再重新计算RTO.
流量控制比较简单,只要发送方在接收方的接收窗口大小范围内发送报文就可以了,但考虑
到传输效率问题,例如rlogin之类的交互式应用时,除了简单的不超出范围传送外,还需要
令传输更有效率,也就是避免小分组在网络上的传送,这时可采用Nagle算法,即:
发送第一个字节,然后在确认应答来到之前缓存所有要发送的小分组,在应答到来之后才可
发送.
还有一个问题叫糊涂窗口综合症,具体表现为:当接收缓存已满,而接收进程每次取出一个
字节,这将导致只有一个字节的接收空间也会通知发送方,这时发送方发送一个字节,如此
循环.解决方法是让接收方等待一段时间,直到接收缓存可容纳一个最长的报文段(MSS)或
接收缓存有一半的空闲空间时才发送确认给发送方.
拥塞控制控制的是整个网络的流量,而流量控制仅仅是点对点通信双方的问题,可以想像,
拥塞控制比流量控制要复杂得多.
RFC 2581定义了进行拥塞控制的四种算法:慢开始(slow-start),拥塞避免(congestion
avoidance),快重传(fast retransmit)和快恢复(fast recovery).在TCP的实现中,这四种
算法是配合使用的,《计算机网络》第212页的图很好的描述了这一点.
当采用快恢复算法时,慢开始只是在TCP连接建立时和网络出现超时时才使用.
当然拥塞控制还会用到超时重传,毕竟拥塞发生时报文会丢失.