• TCP 超时重传机制


            目录

    一、如何应对两种情况

    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,那该方就要重新发送报文

  • 相关阅读:
    Java“牵手”淘宝商品评论数据采集+淘宝商品评价接口,淘宝商品追评数据接口,行业商品质检接口,API接口申请指南
    RocketMQ 安装和启动
    (附源码)计算机毕业设计SSM酒店停车管理系统
    秒杀实现技巧
    Qt教程3-Ubuntu(x86_64)上配置arm64(aarch64)交叉编译环境及QT编译arm64架构工程
    容器化 | 一文搞定镜像构建方式选型
    『Linux小程序』进度条
    ref和reactive
    maven.类包冲突解决案例
    电商技术揭秘一:电商架构设计与核心技术
  • 原文地址:https://blog.csdn.net/challenglistic/article/details/126461035