TCP 超时重传机制

        目录

一、如何应对两种情况

1、Client发的数据丢了

2、Server发的应答丢了

二、如何处理重复的数据?

三、如何确定超时的时间?


超时重传其实可以看作是一种网络异常时的补救措施。假设Client端发送数据,等了一段时间没有收到Server的回复,这样的话,就存在两种情况,第一种,Client发送的数据丢了;第二种,Server发送的应答丢了。

一、如何应对两种情况

1、Client发的数据丢了

这里所谓丢了,并不是说凭空消失,而是可能因为网络拥堵的缘故,导致数据没有及时送达,对此的策略就是,如果Client端在一定时间间隔内没有收到Server发来的应答,此时Client会重新发送一份数据。

TCP 超时重传机制_第1张图片

2、Server发的应答丢了

同理,如果Server发送的应答丢了,Client在一定时间间隔内没有收到Server的应答,同样是Client重新发送一份数据,而不是Server重新发送一份应答。其实我们可以通过某种途径知道是Client的数据丢了还是应答丢了,但是这么做特别麻烦,就算知道了Client的数据丢了,最后的结果无非是重新发送一份,与其如此,不如简单粗暴一点,只要Client没收到应答,那就重发

TCP 超时重传机制_第2张图片

二、如何处理重复的数据?

如果因为网络拥堵问题,导致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,那该方就要重新发送报文

你可能感兴趣的:(Linux,基础,tcp/ip,网络,服务器)