
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
我们在前几期的文章中给大家简单介绍了程序员在学习tcp协议的时候需要掌握的一些基础知识等内容,而本文我们就继续来学习一下,tcp协议中的重传机制应用分析。
重传机制是为了保证所有的数据包都可以到达。
1、超时重传
TCP发送方在发送报文的时候,会设定一个定时器,如果在规定的时间内没有收到接收方发来的ACK确认报文,发送方就会重传这个已发送的报文段,如果依旧没有收到回应,就会继续重传。
超时重传时间RTO的值应该略大于报文往返RTT的值,如果超时重传的数据又超时了该怎么办呢?
TCP的策略是每次间隔时间都是上次时间的2倍。
2、快速重传
如果发送5000个字节的数据包,因为MSS的限制每次传输1000个字节,分5段传输,如下图:
数据包1发送的数据正常到达接收端,接收端回复ACK1001,表示seq为1001之前的数据包都已经收到,下次从1001开始发。数据包2(10001:2001)因为某些原因未能到达服务端,其他包正常到达,这时接收端也不能ack345数据包,因为数据包2还没收到,接收端只能回复ack1001。
2个数据包重传成功以后服务器会回复5001,表示seq为5001之前的数据包都已经收到了。
超时重传是指当发送端收到3个或以上重复ACK,就意识到之前发的包可能丢了,于是马上进行重传,不用傻傻的等到超时再重传,提高了重传效率。
3、SACK
因为除了2号包,3、4、5包也有可能丢失,那到底是只重传数据包2还是重传2、3、4、5所有包呢?
聪明的网络协议设计者,想到了一个好办法:
收到3号包的时候在ACK包中告诉发送端:喂,小老弟,我目前收到的大连续的包序号是1000(ACK=1001),[1:1001]、[2001:3001]区间的包我也收到了
收到4号包的时候在ACK包中告诉发送端:喂,小老弟,我目前收到的大连续的包序号是1000(ACK=1001),[1:1001]、[2001:4001]区间的包我也收到了
收到5号包的时候在ACK包中告诉发送端:喂,小老弟,我目前收到的大连续的包序号是1000(ACK=1001),[1:1001]、[2001:5001]区间的包我也收到了
这样发送端就清楚知道只用重传2号数据包就可以了,数据包3、4、5已经确认无误被对端收到。
这种方式被称为SACK。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加danei456学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。