概述
目录
一、如何应对两种情况
1、Client发的数据丢了
2、Server发的应答丢了
二、如何处理重复的数据?
三、如何确定超时的时间?
超时重传其实可以看作是一种网络异常时的补救措施。假设Client端发送数据,等了一段时间没有收到Server的回复,这样的话,就存在两种情况,第一种,Client发送的数据丢了;第二种,Server发送的应答丢了。
一、如何应对两种情况
1、Client发的数据丢了
这里所谓丢了,并不是说凭空消失,而是可能因为网络拥堵的缘故,导致数据没有及时送达,对此的策略就是,如果Client端在一定时间间隔内没有收到Server发来的应答,此时Client会重新发送一份数据。
2、Server发的应答丢了
同理,如果Server发送的应答丢了,Client在一定时间间隔内没有收到Server的应答,同样是Client重新发送一份数据,而不是Server重新发送一份应答。其实我们可以通过某种途径知道是Client的数据丢了还是应答丢了,但是这么做特别麻烦,就算知道了Client的数据丢了,最后的结果无非是重新发送一份,与其如此,不如简单粗暴一点,只要Client没收到应答,那就重发。
二、如何处理重复的数据?
如果因为网络拥堵问题,导致Client的数据没有及时送达,Client隔一段时间以后就会重发一份报文,等网络恢复以后,Server端可能会收到多份重复的报文。接下来就要用到报文首部的“16位序号”字段了,因为重传发送的报文的序号,跟前一份丢失报文的序号是一样的,因此,Server只要根据序号来进行去重即可。
三、如何确定超时的时间?
既然是超时重传,在多长的时间间隔内没有收到应答,Client就判定为超时呢??
这个需要考虑多方面的因素,网络是时时都在变化的;超时的时间设置的太长,会影响到重传的效率;超时的时间设置的太短,有可能会频繁发送重复的包。TCP为了保证较高效率的通信,一般会动态计算这个时间。
- 超时以500ms为单位进行控制,超时时间都是500ms的整数倍。
- 第一次发送,等待500 ms以后没有收到ACK,重发。
- 第二次重发,等待500*2 ms以后没有收到ACK,重发。
- 第三次重发,等待500*4 ms以后没有收到ACK,重发。
- 重发累计到一定的次数,TCP判定网络或者对方主机异常,强制关闭连接。
四、总结
上面只是举的例子是,Client主动发送,但是最后没有收到ACK,超过一定时间就会自动重发。这种情况同样适用于Server。总结一句话就是,谁主动发出报文,但是过了一段时间没有收到ACK,那该方就要重新发送报文。
最后
以上就是风趣学姐为你收集整理的TCP 超时重传机制的全部内容,希望文章能够帮你解决TCP 超时重传机制所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复