TCP之所以可以安全的将数据在传输中的安全性,是因为它每次给对方发送数据,都会等待对方给个确认,当长时间收不到这个确认,发送端就会重发这个数据。
要测超时时间,TCP必须要发送一个特别序号的字节和接收包含该字节的确认之间的RTT,但是,确认本身就是有延时的,所以一般有一种简单的测量超时时间的公式
RTO = RB
其中R为随RTT变化而变化的平滑因子
前边的博客有写道,当发送端使用慢启动算法时,由于其发送的数据段呈指数增长,因此也很容易达到网络通道的极限,此时,网络上的路由就会将部分分组丢失,因此TCP又给发送端设置了一种拥塞算法,此算法就是用来解决分组丢失问题的
拥塞算法假定正常情况下分组的丢失率是非常小的低于(1%),所以当双方出现大量丢失分组现象,则说明网络出现拥堵
拥塞避免算法和慢启动算法一般结合使用,此时需要给发送端维持俩个变量,一个是拥塞窗口cwnd,和一个慢启动门ssthresh,算法过程具体如下
(1)对于一个给定的连接,将初始化cwnd为1,和ssthresh为65535字节
(2)TCP输出的数据不能超过接收方给的通告窗口和拥塞窗口的最小值,拥塞窗口是发送方使用的流量控制,通告窗口是接收仿使用的流量控制
(3)当拥塞发生时(超时或收到重复确认),ssthresh就会被设置为当前窗口的一般,即拥塞和通告窗口的最小值
(4)此时我们先进行慢启动,发送的数据段将呈指数增长,很快便达到了修改后的ssthresh(窗口的一般)的值,此时慢启动将不在以指数的方式增长发送量了,而是每收到一个确认,则发送量就增长1的线性增长
当我们收到失序的报文段时,TCP需立即产生一个ACK(一个重复的ACK),这个重复的ACK不应该延迟,该ACK是想让对方知道收到了失序的报文段,并告诉对方希望收到的序号
由于我们并不知道一个重复的ACK是由丢失的报文段引起的还是仅仅由重新排序所引起的,因此我们就稍微等待一下,在做判断。当在重新排序的报文段被处理并产生一个新的ACK之前只可能收到1-2个重复的ACK,如果收到3个以上的ACK就很可能是报文段丢失了,于是我们就直接重传丢失的报文段,而无须等待超时定时器的溢出(也就是不需要等到超时时间到了才判断丢了)接下来执行的就是拥塞避免算法,这就是快速恢复。
现在较新的TCP实现的路由表项中维持了许多指标,当一个TCP连接关闭时,如果已经发出了足够多的数据来获得有意义的统计资料,且目的节点的路由表项不是一个默认表项,那么下列信息就保存在在路由表项中使用:平滑的RTT,慢启动门限等
当TCP重传时,它不一定要重传同样的报文段,相反TCP允许进行重新分组,而进行发送一个较大的报文段
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/shreck66/article/details/47357389