TCP/IP卷一:71---TCP超时与重传之(超时与重传总体概述、系统超时重传阀值、一个简单的超时与重传案例)
发布日期:2021-06-29 22:33:25 浏览次数:3 分类:技术文章

本文共 2430 字,大约阅读时间需要 8 分钟。

一、TCP超时与重传概述

  • 到目前为止,我们并没有过多地涉及效率与性能,而主要关注操作的正确性。在本文及接下来的TCP文章中,我们不仅讨论TCP执行的基本任务,还关心其执行效率
  • 由于下层网络层(IP)可能出现丢失、重复或失序包的情况,TCP协议提供可靠数据传输服务。为保证数据传输的正确性,TCP重传其认为已丢失的包。TCP根据接收端返回至发送端的一系列确认信息来判断是否出现丢包。当数据段或确认信息丢失,TCP启动重传操作,重传尚未确认的数据

两套重传机制(RTO、SACK)

  • TCP拥有两套独立机制来完成重传:
    • 一是基于时间:TCP在发送数据时会设置一个计时器,若至计时器超时仍未收到数据确认信息,则会引发相应的超时或基于计时器的重传操作,计时器超时称为重传超时(RTO)
    • 二是基于确认信息的构成:此种方式的重传称为快速重传,通常发生在没有延时的情况下。若TCP累积确认无法返回新的ACK,或者当ACK包含的选择确认信息(SACK)表明出现失序报文段时,快速重传会推断出现丢包
  • 第二种方法通常比第一种更高效
  • 通常来说,当发送端认为接收端可能出现数据丢失时,需要决定发送新(未发送过的)数据还是重传
  • 接下来几篇文章将详细讨论TCP怎样判断出现报文段丢失及其响应操作。接下来几篇文章我们探讨如何根据某个连接的RTT来设置RTO,基于计时器的重传机制,以及TCP快速重传操作。另外我们也会看到SACK怎样帮助确定丢失数据、失序和重复IP包对TCP行为的影响,以及TCP重传时改变包大小的方法

二、系统超时重传阀值

  • 逻辑上讲,TCP拥有两个阀值来决定如何重传同一个报文段。主机需求RFC[RFCl122]描述了这两个阀值,在前面“TCP连接管理”中也提到过:
    • Rl表示TCP在向IP层传递“消极建议” (如重新评估当前的IP路径)前,愿意尝试重传的次数(或等待时间)
    • R2(大于Rl)指示TCP应放弃当前连接的时机
  • Rl和R2应分别至少设为三次重传和100秒。对连接的建立过程(发送SYN报文段),阀值设置与数据段传输有所区别,针对SYN报文段的R2应最少设为3分钟

Linux系统的设置值

  • Linux系统中,对一般数据段来说,Rl和R2的值可以通过应用程序,或使用系统配置变量net.ipv4.tcp_retries1和net.ipv4.tcp_retries2设置。变量值为重传次数,而不是以时间为单位
  • tcp_retries2默认值为15,对应约为13 - 30分钟,根据具体连接的RTO而定。net. ipv4.tcp_retries1默认值为3
  • 对于SYN报文段,变量net.ipv4.tcp_syn_retries和net.ipv4. tcp_synack_retries限定重传次数,默认值为5(约180秒)

Windows系统的设置值

  • Windows也有相应控制TCP行为的变量,包括Rl和R20。通过下列注册表项可以修改对应值[WINREG]:

  • 最主要的值为TcpMaxDataRetransmissions,对应Linux中的tcp_retries2变量,其默认值为5

三、简单的超时与重传案例

  • 我们已经看到一些超时和重传的例子:
    • 前面的ICMP文章中,ICMP目的不可达(端口不可达)的例子中,采用UDP的TFTP客户端使用简单(且低效)的超时和重传策略:设置足够大的超时间隔,每5秒进行一次重传
    • 在TCP连接管理中,尝试与不存在的主机建立连接中,我们看到TCP在尝试建立连接的过程中,在每次重传时采用比上次更大的延时间隔
    • 前面的链路层文章中,以太网冲突中,我们也可以看到相关操作
    • 上述机制都是由计时器超时引发的

演示案例

  • 我们首先来看TCP的基于计时器的重传策略。先建立一个连接,并发送一些数据验证连接正常。然后断开连接的一端,这时再发送一些数据,观察TCP的操作。这里我们采用Wireshark来跟踪记录连接状况(见下图)

  • 报文段1、 2、 3为TCP建立连接的握手过程。连接建立完成后,Web服务器处于等待web请求的状态。在发出请求前,我们先断开服务器端主机的连接。在客户端输人如下命令:

  • 该请求无法传输至服务器端,因此它会在客户端的TCP队列中存储一段时间。此时采用netstat命令读取客户端队列状态显示为非空:

  • 可以看到发送队列中有18字节的数据,等待被传送至wb服务器。这18个字节包含了之前显示的请求命令以及回车换行。其他的输出细节(包括地址和状态信息)会在下面涉及
  • 报文段4为客户端首次尝试发送Web请求,时间为42.748s。0.206s以后,在42.954s发送了第二次请求。接着在43.374s,即0.420s后,再次尝试请求。后续的请求(重传)时刻分别为44.215、 45.895以及49.255s,间隔分别为1.680和3.360s
  • 每次重传间隔时间加倍称为二进制指数退避,我们在前面“TCP连接管理”中的TCP尝试建立连接失败时提到过,后面将会详细讨论。自首次请求至连接完全失效,总时间为15.5min。随后,客户端会显示如下错误信息:

四、与TCP重传相关的攻击

  • 有一类DoS攻击称为低速率DoS攻击。在这类攻击中,攻击者向网关或主机发送大量数据,使得受害系统持续处于重传超时的状态。由于攻击者可预知受害TCP何时启动重传,并在每次重传时生成并发送大量数据。因此,受害TCP总能感知到拥塞的存在,根据Karn算法不断减小发送速率并退避发送,导致无法正常使用网络带宽。针对此类攻击的预防方法是随机选择RTO,使得攻击者无法预知确切的重传时间
  • 与DoS相关但不同的一种攻击为减慢受害TCP的发送,使得RTT估计值过大。这样受害者在丢包后不会立即重传。相反的攻击也是有可能的:攻击者在数据发送完成但还未到达接收端时伪造ACK。这样攻击者就能使受害TCP认为连接的RTT远小于实际值,导致过分发送,造成大量的无效传输

转载地址:https://dongshao.blog.csdn.net/article/details/104082482 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:TCP/IP卷一:72---TCP超时与重传之(设置重传超时RTO(经典方法、标准方法、Linux采用的方法、RTT估计器行为、RTTM对丢包和失序的鲁棒性))
下一篇:TCP/IP卷一:70---TCP连接管理之(TCP服务器(TCP端口号、限制本地IP地址、限制外部节点、连接队列))

发表评论

最新留言

初次前来,多多关照!
[***.217.46.12]2024年04月21日 02时28分25秒