- 同意,TCP可靠是基于双方都知道彼此的字节流的原点,发送方对于自己发送的字节流一定要接收到对方的确认,才会从发送缓冲区彻底删除,如果没有得到确认,会一直重传,如果重传次数到达极限值,则reset TCP 连接。而UDP则不同,把数据发出去就不管了,也没有缓存区来缓存发出去而没有确认的数据,因为压根不会发生,此外也无需内存来保存类似TCP各种状态位。
简单回答的话,在TCP的实现方面,超时重传 快速重传和SACK机制都能在这种情况下实现让客户端重新传输丢掉的第2个包,分别讲讲三种不同的机制
1 超时重传
客户端通过tcp一次性把数据都发送了出去,在未收到这些发出报文的ack确认之间,这些报文仍然会缓存在发送队列里,如果在限定的时间内(RTO 重传过期时间)没有收到对应报文的ack,那么这些报文需要被重传
RTO不是静态配置的,在这个问题里系统会根据前面三次握手和第一个报文的ack的RTT计算出来一个RTO,这个时间可能是200ms到120s之间的一个值,所有到了RTO时间没有收到ack的报文都需要被重新传送到网络上
2 快速重传
等待一个RTO的时间太久了,尤其是在RTT比较大的网络环境里,如果丢包率再比较高的情况,那么TCP的效率就会非常低,所以需要通过快速重传机制来实现优化
简单来说,客户端发送的第2个报文丢了,没有收到ack,但服务器在收到第3 4 5个包时会检查他们的顺序编号sequence number,并察觉到与第1个包之间并不连续,于是会发送3个连续的dup ack 给客户端,要求客户端重新发送第1个包后面具有正确sequence number的报文 客户端在收到三个连续的dup ack之后就会确认第2个报文丢掉了,于是实现立即重传而不用再等到RTO的过期时间
3 SACK selective acknowledgment
如果只是丢了第2个包其实快速重传机制就已经可以搞定了,但如果在中间丢了多个报文的时候,比如2-9之间可能丢了第3,第5和第7个报文,其他报文都已经顺利到达服务器,如果只有快速重传,那么客户端需要重传从3到第7个之间的所有报文,而如果客户端和服务器都支持sack的话,服务器端就可以通过sack选项来告知发送方到底丢了哪些报文,这样客户端就只需要把对应丢失的报文重传就好了。二、TCP重传
1、重传的原因
1)发端计时器超时
TCP每发送一个报文段,就对这个报文段设置一次计时器。当计时器超时而没有收到确认时,就重传该报文。
注:原来报文哪去了呢?两种可能:1)在中间节点丢了。2)还在路上,走的慢。
对于第一种情况:接收端是不知情的,而对于第二种情况,接收端表现为收到两个一摸一样的报文。TCP 重传机制
通过上面我们直达搜:1)时间上的指数避退 2)复位的时间
往返时间测量
RTT(RTO)指的测量
往返时间RTT的例子
2142 RTT估计器 平滑的RTT和平滑的均值偏差
Err = M - A = 05 - 2 = -15
A= A + gErr = 2 - 0125 15 = 18125
RTO = A+ 4D = 1825 + 4 1125 = 63125
采用上面公式计算的Err 、A 和D的值与实际使用的定点计算方法得到结果有一些微小的差别。 后一种方法得到的RTO的值为6s(因为计算机是采用了移位 *** 作,而非63125s)
拥塞举例:
在时刻 10、14、 31 附近发生了3个重传。 我们还可以看到在这3个点中只进行了一次报文段的重传, 因为只有一个点下垂低于向上的斜率。
拥塞避免算法
拥塞避免算法和慢启动算法需要对每个连接维持两个变量: 已给拥塞窗口cwnd 和 一个慢启动门限ssthresh 。 算法的工作如下:
拥塞避免算法:线性增长的过程,上面的例子是慢启动和拥塞避免算法的集合
快速重传与快速恢复算法
快速恢复算法
按每条路由进行度量
新的TCP实现在路由表项中维持粗多我们在前面已经介绍过的指标。 但一个TCP连接关闭时, 如果已经发送改了足够多的数据来获得有意义统计的资料, 且目的节点的路由表项不是一个默认的表项,那么下列信息就曹村在路由表项中以备下次使用: 被平滑的RTT,被平滑的均值偏差以及慢启动门限。 所谓 “足够多的数据”是指一个窗口的数据,这样就可得到16个RTT采样。
当建立一个新的连接时, 无论是主动还是被动,如果该连接将要使用的路由表项已经有这些度量的值,则用这些度量来对相应的变量进行初始化。
ICMP 的差错 : 源站抑制、 主机不可达、网络不可达
————————
TCP的重新分组
当TCP超时并重传时,它不一定哟啊重传同样的报文段。 相反,TCP允许进行冲农信分组而发送一个较大的报文段, 这有助于提高性能(当然, 这个较大的报文daunt不能够超过接收方声明的MSS)。 在协议中这是允许的, 因为TCP是使用字节序号而不是使用报文段序号来进行识别它所要发送的数据和进行确认。
有关内容的总结:
几个TCP中的常见的算法的劣迹
TCP定时器: 2mls定时器、 超时定时器、坚持定时器、保活定时器
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)