《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:报告哪个范围的数重复接收。

相关推荐

  1. TCP/IP详解 14 TCP超时

    2024-03-11 01:26:03       40 阅读
  2. TCP机制详解——03DSACK

    2024-03-11 01:26:03       37 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-11 01:26:03       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-11 01:26:03       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-11 01:26:03       87 阅读
  4. Python语言-面向对象

    2024-03-11 01:26:03       96 阅读

热门阅读

  1. Android学习笔记 Dialog

    2024-03-11 01:26:03       40 阅读
  2. 【Mysql优化】

    2024-03-11 01:26:03       42 阅读
  3. LeetCode 128 最长连续序列

    2024-03-11 01:26:03       40 阅读
  4. android WiFI连接,socket连接

    2024-03-11 01:26:03       36 阅读
  5. 数据结构界的幻神(First)----链表

    2024-03-11 01:26:03       37 阅读