• 《TCP/IP详解 卷一》第14章 TCP超时与重传


    14.1 引言

    TCP重传机制:

            重传超时:RTO值就是超时时间。

            快速重传。

            选择性重传(SACK)

            重复的选择性重传(DSACK)

    14.2 简单的超时与重传举例

    每次重传的间隔时间加倍:二进制指数退避。

    net.ipv4.tcp_syn_retries

            发送SYN包的最大重传次数。(即第一次握手报文)

    net.ipv4.tcp_synack_retries

            发送SYN+ACK包最大重传次数。(即第二次握手报文)

    14.3 设置重传超时

    重传超时(Retransmission Timeout,RTO)

    RTO值:用于确定何时重传未收到ACK的数据包

            可根据网络延迟情况动态调整。

    TCP通常使用往返时间(RTT)来估算RTO

            1. 通过TCP时间戳选项计算得到RTT。

            2. 根据RTT计算得到RTO,有多种算法。不细究。

    14.4 基于计时器的重传

    该定时器的值就是RTO值。

    发送方在发送数据时,开启定时器,并记录数据序列号。

    发送方在收到对应数据ACK时,取消定时器。

    每次重传时,指数增大RTO。

    14.5 快速重传

    不基于定时器超时重传,而基于接收端反馈信息来重传。

            优点:快速重传,修复丢包。

    内核会同时实现TCP超时重传和快速重传。

    快速重传工作原理:

            接收方收到失序数据时,会发送重复ACK,表明空缺数据范围。

            发送方连续收到多个重复ACK时,就快速重传重复ACK中指示的报文。

    结合SACK:

            如果重复ACK报文中没有使用SACK选项,只能表明一个空缺范围。

            反之使用SACK选项,可表明多个空缺信息。实现重传多个报文。

    14.6 带选择性确认的重传

    选择性确认:SACK,一个TCP选项。

    发送ACK报文时,齐总可包含SACK选项。

    SACK选项包含:一个或多个SACK块,每个SACK块表示已成功接收的数据序列号范围。

            所以多个SACK块可报告多个已接收数据范围。

    这样发送方可根据SACK信息来重传多个丢失的数据段。

    14.7 伪超时与重传

    伪超时:过早判定超时,报文可能只是延迟。

    原因:超时时间过短。

    坏处:伪超时会导致不必要的重传,即伪重传。

    伪重传应对方法:

            DSACK:即重复SACK,一个TCP选项类型。

    DSACK原理:

            告知对方收到的重复报文段的序列号。

            对方就可知是包丢失还是ACK丢失,如果ACK丢失无需重传。减少不必要重传。

    DSACK选项中包含:

            Start Edge/End Edge:收到的重复数据段的起始和结束序号。

    14.8 包失序与包重复

    14.8.1 失序

    IP层无法保证TCP段是有序传输的。

    失序原因:

            不同包从不同链路传输。

            不同包有不同处理延时。

    无需具体区分包失序还是丢失。都重传即可。

    解决方法:

            收到多个重复ACK,触发快速重传机制。

    14.8.1 重复

    包重复:链路层重传,将单个IP包传输多次。

    解决方法:

            SACK选项:指示多个范围段的数据已接收。即知道哪些序列号报文空缺。

            DSACK选项:指示哪部分数据重复接收了。

    14.9 目的度量

    即使TCP连接断开,也保存一些对端信息。包括:

            使用的本地网络接口,到对端的路由下一跳,对端通告的MSS,RTT等信息。

    当对端再次进行TCP连接时,可用保存的信息来初始化新连接。

    14.10 重新组包

    TCP超时重传时,不需要重传完全相同的报文段。可重新组包,发送更大的报文段来提高性能。

    14.11 与TCP重传相关的攻击

    14.12 总结

    关键机制:

            SACK:可报告多个范围段的数据已接收。

            DSACK:报告哪个范围的数重复接收。

  • 相关阅读:
    JDK8中String的intern()方法详细解读【内存图解+多种例子+1.1w字长文】
    判断两个DataFrame和array的列(Series)是否相同
    Java Coding Problems Second Edition --chapter 01
    SolidWorks 入门笔记03:生成工程图和一键标注
    springboot 搭建一个 测试rabbitmq连通性demo
    狂神说MybatisPlus学习笔记
    Python 安装faiss失败
    OC-run loop
    Git commit校验工具commitlint的配置与使用
    龙迅#LT8711UXE1 适用于Type-C/DP1.2/EDP转HDMI2.0方案,支持音频剥离和HDCP功能。
  • 原文地址:https://blog.csdn.net/qingwangheni/article/details/136490069