深入理解Linux TCP RTO算法 (linux tcp rto)

TCP是一种可靠传输协议,可以为应用程序提供一种面向连接的通信机制。在TCP协议中,RTO即重新传输超时时间,是实现可靠传输的重要指标。Linux TCP RTO算法是一种基于网络延迟的动态算法,它可以根据网络情况动态调整RTO值,确保TCP连接的可靠性。

1. RTO算法的原理

RTO算法是TCP协议中实现可靠传输的关键算法之一。它的核心原理是通过测量数据包的传输延迟来动态调整数据包的重新传输超时时间。在TCP连接中,每个数据包都会携带一个时间戳,记录数据包的发送时间。当接收方收到数据包时,会将时间戳回传给发送方,从而计算出数据包的往返时间RTT。RTO值即表示在网络环境中,一个合理的数据包传输所需要的时间。

在TCP协议中,数据包的重传是一种保险机制,用来确保数据包正确到达目的地。如果一个数据包在RTO时间内没有收到确认,发送方会将该数据包重新发送。RTO算法的目的是为了确保RTO时间的合理性,避免因网络延迟等原因导致数据包的不必要重传。

2. Linux TCP RTO算法的特点

与其他网络传输协议相比,Linux TCP RTO算法具有以下几个特点:

(1)基于网络延迟的动态算法

Linux TCP RTO算法是一种基于网络延迟的动态算法,在实际使用中可以根据实际网络情况动态调整RTO值。这意味着,当网络负载较大时,RTO值可以适当延长,避免数据包的不必要重传;而在网络负载较小时,RTO值可以适当缩短,提高数据包的传输速度。

(2)避免时间窗口的过度调整

在TCP协议中,还有一个关键参数是时间窗口大小,用于控制网络传输的速度。当网络传输速度过慢时,TCP连接可能会出现拥塞。为了避免时间窗口的过度调整,Linux TCP RTO算法通过动态调整RTO值来控制数据包的传输速度,保证TCP连接的稳定性。

(3)支持多种最小值算法

Linux TCP RTO算法支持多种最小值算法,包括最简单的静态最小值算法和动态平均值算法。这些算法不仅可以减小网络传输的延迟,还可以减小CPU负载,提高系统性能。

3. Linux TCP RTO算法的实现

Linux TCP RTO算法是通过修改Linux内核的代码实现的。具体来说,它主要涉及三个内核参数:tcp_retranission_ timeout、tcp_retries1和tcp_retries2。其中,tcp_retranission_timeout参数用于控制初始的RTO值;tcp_retries1和tcp_retries2参数用于控制数据包的重传次数。

在Linux内核中,RTO值的计算可以通过以下公式来实现:

RTO = SRTT + max(G, K * RTTVAR)

其中,SRTT表示平滑的往返时间,RTTVAR表示平均往返时间的变化量,G表示全局最小的TCP时间延迟,K表示一个常数。通过这个公式,可以根据网络延迟动态调整RTO值,保证TCP连接的可靠性和稳定性。

4.

Linux TCP RTO算法是实现可靠传输的关键算法之一。它通过动态调整RTO值,根据网络延迟情况来保证数据包的可靠传输,避免因网络延迟等原因导致数据包的不必要重传。与其他网络传输协议相比,Linux TCP RTO算法具有基于网络延迟的动态算法、避免时间窗口的过度调整和支持多种最小值算法等特点。在实际使用中,我们可以根据网络延迟情况动态调整RTO值,确保TCP连接的稳定和可靠。

相关问题拓展阅读:

tcp重传报文可以多添加数据吗

TCP数据传输协议详解 原创

:47:54

程序员老石

码龄4年

关注

1、TCP概述

1、点对点

一个发送方,一个接收方

2、可靠地,按顺序的字节流

没有报文边界

3、管道化(流水线)

TCP拥塞控制和流量控制设置

窗口大小

4、发送和接收缓存

5、全双工数据

在同一连接中数据流双向流动

MSS:更大报文段大小

6、面向连接:

在数据交换之前,通过握手(交换控制报文)初始化发送方、接收方的状态变量

7、有流量控制

发送方不会淹没接收方

2、TCP报文段的首部格式

1、TCP是面向字节流的,但是TCP传送的数据单元是报文段

2、一个TCP报文段分为首部和数据两部分

3、TCP首部的最小长度是20字节

4、首部固定部分各字段的意义如下:

1)源端口和目的端口

各占2个字节(1字节 = 8bit),分别写入源端口号和目的端口号。

2)序号(报文段序号):报文段首字节在字节流的编号。

占4个字节,在一个TCP连接中传送的字节流中的每一个字节都按照顺序编号,整个要传送的字节流的起始序号必须在连接建立是设置。首部中的序碧空号字段值则指的是本报文段所发送的数据的之一个字节的序号。

3)确认号

占4个字节,是期望收到对方下一个报文段的之一个数据字节的序号。

总之,确认号 = N,则表明:到序号N-1为止的所有数据都已正确收到。

主机A发送X是从42开始,发送一个字节C【报文段中只包含一个字节】,主机B发送的ACK=79,说明78及以前的数据都收到了,告诉主机A希望再从X=79开始传

4)数据偏移

占4位,它指出TCP报文段的数据起始处距离TCP报文段起始处有多远。

5)紧急URG

当URG设置为1时,发送应用进程就告诉发送方的TCP有紧急数据要传送。于是发送方TCP就把紧急数据插入到本报文段数据的最前面,而在紧急数据后面的数据仍是普通数据。这时要与首部中紧急指针字段配合使用。

6)确认ACK

仅当ACK=1时确认号字段才有效。当ACK=0时,确认号无效。

TCP规定,在连接建立后所有传送的报文段都必须把ACK设置为1

7)窗口

5、MSS:更大报文段长度

MSS是每一个TCP报文段中的数据字段的更大长度。

数据字段加上TCP首部才等于整个的TCP的报文段。所有MSS并不是整雹氏个TCP报文段的更大长度。而是TCP报文段长度减去TCP首部长度。

MSS应尽可能大些,只要在IP层传输时不需要再分片就行。对网络的使用率就高一些。如果TCP报文段十分长,那么在IP层传输时就有可能要分解成多个短数据报片。在终点要把收到的各个短数据报片转配成原来的TCP报文段。当传输出错时还要进行重传。这些也都会使开销增大。

若主机没有填写这一项,则MSS的默认值是536字节长。因此,所有在互联网上的主机都应能接受的报文段长度是536+20(固定首部长度) = 556字节。

6、往返时间RTT

之一,用来计算往返时间RTT。发送方在发送报文段时把当前时钟的时间值放入时间戳字段,接收不方在确认该报文段时把时间戳字段值复制到时间戳回送回答字段。因此,发送方在收到确认服文后,可以准确地计算出 RTT来。

第二,用于处理TCP序号超过232的情况,这又称为防止序号绕回PAWS S(Protect Against Wrapped Sequence numbers)。我们知道,TCP 报文段的序号只有32位,而每增加2的32次方个序号就会重复使用原来用过的序号。当使用高速网络时,在一次 TCP连接的数据传送。为了使接收方能够把新的报文段和迟到很久的报文段区分开,可以再报文段中加上这种时间戳。

3、超时重传时间的选择

1、TCP的发送方在规定的时间内没有收到确认就要重传已发送的报文段。

2、TCP采用了一种自适应算法

RTT:报文段的往返时间

3、超时重传时间RTO

4、TCP:可靠数据传输

1、TCP在IP不可靠服务的基础上建立了rdt

1)管道化的报文段

2)累计确认

3)单个重传定时器

定时器只和最老的报文段相关联

4)是否可以接收乱序的,没有规范

接收方收到一个乱序的报文段怎么处理,接收方可以进行缓存也可以抛弃掉

2、TCP发送方事件

从应用层接收数据:

1)用nextseq创建报文段

2)序号nextseq为报文段首字节的字节流编号

3)如果还没有运行,启动定时器

* 定时器与悔肆瞎最早未确认的报文段关联

* 过期间隔:TimeOutInterval

4)超时

* 重传后延最老的报文段

* 重启定时器

TCP快速重传是在超时重传时间到来之前,发送方连续收到3个ACK,发送方快速重传。

5、TCP:流量控制

1、接收方控制发送方,不让发送方发送太多,太快以至于让接收方的缓冲区溢出

6、TCP连接管理

7、拥塞控制原理

拥塞:

1、非正式的定义:“太多的数据需要网络传输,超过了网络的处理能力”

2、与流量控制不同

3、拥塞的表现

1)分组丢失(路由器缓冲区溢出)

2)分组经历比较长的延迟(在路由器的队列中排队)

4、网络中前10位问题

7.1 导致网络拥塞的原因

1、当某个节点缓存的容量太小时,到达该节点的分组因无存储空间暂存而不得不被丢弃。

2、简单的对节点缓存扩容也解决不了网络拥塞的问题,原因是由于链路的容量和处理机的速度并没有提高,在队列中的绝大多数分组的排队等待时间会大大增加,结果上层软件只好把他们进行重传(超过重传时间)。

3、如果一个路由器没有足够的缓存空间,它就会丢弃一些新到的分组。但是当分组被丢弃,发送这一分组的源点就会重传这一分组,甚至可能还要重传多次,这样会引起更多的分组流入网络和被网络中的路由器丢弃。反而会加剧网络的拥塞。

1、理想的拥塞控制作用下,网络的吞吐量仍然维持在其所能达到的更大值。

2、实际的拥塞控制情况下,随着提供的负载的增大,网络吞吐量的增长速率逐渐减少。当提供的负载达到某一数值时,网络的吞吐量反而会随着提供的负载的增大而降低。当提供的负载继续增大到某一数值时,网络的吞吐量就下降到零,网络已无法工作,这就是所谓的死锁。

网络拥塞的原因:

1、为了达到有效的输出,需要输入更多的数据。在网络拥塞的时候需要重传很多没有不必要的数据,从而加速了网络拥塞的程度,使得网络变得更拥塞。

8、TCP拥塞控制

8.1 TCP的拥塞控制方法

1、慢开始算法:当主机开始发送数据时,由于并不清楚网络的负荷情况,所以如果立即把大量数据字节注入到网络,那么就有可能引起网络发生拥塞。经验证明,较好的方法是先探测一下,及由小到大逐渐增大发送窗口,也就是说,由小到大逐渐增大拥塞窗口数值。

拥塞窗口cwnd是按倍数增加的。

2、拥塞避免算法:是让拥塞窗口cwnd缓慢地增大,即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1,而不是像慢开始阶段那样加倍增长。因此在拥塞避免阶段就有“加法增大”的特点。这表明在拥塞避免阶段,拥塞窗帘cwnd按线性规律缓慢增长,比慢开始算法的拥塞窗口增大速率缓慢得多。

3、快重传

打开CSDN,阅读体验更佳

TCP数据的传输过程_学习不毕业的博客_tcp传输过程

TCP 是面向连接的传输方式,必须保证数据能够正确到达目标机器,不能丢失或出错,而网络是不稳定的,随时可能会毁坏数据,所以机器A每次向机器B发送数据包后,都要求机器B”确认“,回传ACK包,告诉机器A我收到了,这样机器A才能知道数据传送成…

TCP如何实现可靠的数据传输服务_skywuuuu的博客

可靠的数据传输服务 TCP保障接收方一定能收到数据,发送方一定会最终被通知,但是TCP的可靠的数据传输服务是建立在IP的不可靠的服务上的,所以这里就需要借助重新传输来实现。 自适应重传 RTT(round-trip time)会根据实际网络的情况不断被…

最新发布 TCP协议与UDP协议的区别

TCP和UDP协议的简单介绍,以及实现。

继续访问

可靠数据传输协议-Rdt协议

目录 一、引言 二、Rdt存在意义及原理 三、Rdt 的历经版本及实现 1. Rdt 1.0 协议 2. Rdt 2.0 协议 3. Rdt 2.1 4. Rdt 2.2 5. Rdt 3.0 常用的Rdt 3.0的实例情况有以下几种: 一、引言 该文章来源于教材的思路。 使用F状态机描述发送方和接收方服务响应状态。 在阅读本文之前…

继续访问

TCP数据传输过程详解_weixin_的博客

TCP会话的每一端都包含一个32位(bit)的序列号,该序列号被用来跟踪该端发送的数据量。每一个包中都包含序列号,在接收端则通过确认号用来通知发送端数据成功接收 当某个主机开启一个TCP会话时,他的初始序列号是随机的,可能是0和4,…

TCP的数据传输_weixin_的博客

另外,当客户进程的主动打开成功但是服务器的应用层还不知道这个新的连接时,它可能会认为服务器进程已经准备好接受数据了(如果发生这种情况,服务器的TCP仅将接受的数据放入缓冲队列)。 5)对于新的连接请求,连接队列中已经没有空间,TCP将…

TCP原理之:TCP数据传输

TCP原理之:TCP数据传输 TCP(Tranission Control Protocol)全称为传输控制协议, 它工作在网络七层模型中的第四层-传输层, 是一种面向连接的可靠的数据传递协议。 对于IP和UDP协议, 它们会在接收到数据后根据数据的校验值来对数据的有效性进行判断, 对于无效的数据会直接丢弃, 而不会去纠正。 相比于UDP协议, TCP协议显得更“安全”, 它在数据失效时会进行“重传”以确保数据的正确性。本文主要讨论TCP数据传输过程中所涉及到的一些基本知识,包括报文的格式,TCP连接建

继续访问

计算机原理探险系列(三)– TCP数据传输

上一篇文章中我们讲到了关于网络传输数据方面到内容,今天我们来深入了解下网络传输数据过程中可能会存在到问题。 数据包 正常到一次网络请求中,都会以数据包作为传输单位来判断。如果数据包到体积过大,那么就需要进行拆解。 tcp数据包信息基本结构如下: 包含了网络数据到发送端口,目标端口,ack,seq,还有一些和滑动窗口相关的数据信息。 mss值 mss值是一个缩写,全称是max segment size,主要是控制每次数据传输中的更大传输大小。每次进行数据包传输的时候,如果数据包大小超过了tcp里面限制的ms

继续访问

tcp数据传输(C/S)模式_喵 喵 喵的博客

tcp数据传输(C/S)模式 之前发布过一篇有关于tcp传输的文章,这篇文章是在之前那篇文章的简单tcp通信的基础上改进后的程序。 设计一个学生信息结构体,包括姓名,学号,数学和英语成绩。由客户端将多个学生的姓名,学号,数学和英语成绩输入,…

TCP传输过程_芸酥的博客_tcp传输过程

TCP数据传输 之一行 客户端发送请求体 “GET / HTTP1.1” 第二行 客户端收到服务器请求确认 第三行 客户端收到服务器发送的数据包 第四行 客户端发送接收确认 TCP 四次挥手 之一行 服务器发送断开连接 …

TCP协议详解

网络层的任务是提供网络中的两个主机提供逻辑通信。从IP层上来看,通信的是两个主机。 而传输层在网络中负责是两个主机上的应用程序进程提供逻辑通信。在传输层上看,通信双方是主机上的两个应用进程。传输层的功能: 复用和分用差错检测: 前提:网络层为主机之间提供逻辑通信,信道是不可靠的,它只“尽更大努力”交付,但数据报仍有可能发生:丢包,乱序,等等情况。 传输层还要对收到的报文进行差错检测。(后面细讲)传输层的端口 传输层需要在接收到数据包后正确地交付给上层应用,准确来讲就是交付给进程,我们知道,操作系统中的每个进

继续访问

TCP是如何传输数据的?

在局域网中,我们需要和另外的机器通信时,只需要只知道他的硬件地址,交换机就会把我们的消息发送到对应的机器。我考过RFC中与TCP相关的文档,也看过Linux中与TCP相关的源码,也看过不少框架中的TCP相关的代码,对TCP是有点感觉了。现在不同的机器上的应用进程之间可以独立通信了,那么我们就可以在计算机网络上开发出形形式式的应用:如web网页的http,文件传输ftp等等。这样,在网络中的所有主机,在逻辑上都连接起来了,上层只需要提供目标IP地址和数据,网络层就可以把消息发送到对应的主机。…

继续访问

数据传输协议汇总

FTP(文件传输协议) 对于业务文件传输,FTP可能是之一个想到的。 FTP是为单个文件传输和批量文件传输而构建的。它已经存在了一段时间,因此您可能不会在互操作性方面遇到问题。这意味着,您的贸易伙伴将永远有很大的机会能够通过它交换信息。您也不会为最终用户找到客户端应用程序。缺点是,此文件传输协议的安全性不是很强。 FTP的另一个问题是它容易受到防火墙问题的影响, 这可能会对客户端连接产生不利影响。 2. HTTP(超文本传输协议) 与FTP一样,HTTP文件传输是用于业务文件传输的广泛使用的协议。它易于.

继续访问

三次握手

TCP握手协议 在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接. 之一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认; SYN:同步序列编号(Synchronize Sequence Numbers) 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态; 第三次握手:客户端收到服务器的SYN+ACK包,向

继续访问

TCP发送数据、接受数据及TCP通信程序练习

TCP通信协议

继续访问

TCP协议(全面)

基于TCP协议的三大特性,对TCP协议进行了全面介绍

继续访问

TCP协议传输数据

三次握手 之一次握手: 客户端发送syn包到服务器,并进入syn_sedn状态,等待服务器确认; SYN=1,ACK=0表示请求连接。 X表示本次字节流的初始序号。 TCP规定:此时没有数据传输,但是消耗一个序号。 第二次握手: 服务器接受syn包,必须确认客户的syn(ack=x+1),同时自己也发送一个 syn包(seq=y),即syn+ack包,此时服务器进入syn_recv状态; SYN=1,ACK=1表示同意连接的应答响应。 Y表示本次字节流的初始序号。 X+1表示希望收到的字节起始序号。 第三

继续访问

TCP(传输控制协议)

TCP(传输控制协议)

继续访问

http协议(三)几种数据传输方式

说说http协议的一些特点: 1)无状态 http协议是一种自身不对请求和响应之间的通信状态进行保存的协议,即无状态协议。 这种设置的好处是:更快的处理更多的请求事务,确保协议的可伸缩性 不过随着web的不断发展,有时候,需要将这种状态进行保持,随即,就引入了cookie技术,cookie技术通过在请求和响应报文中写入cookie信息来控制客户端的状态。 有关cookie的内容后面我们再…

继续访问

热门推荐 互联网中几种常用的传输协议

互联网中几种常用的网络传输协议 网路传输协议多种多样,各有所长,学起来真的很让人头大。 对协议的学习需要不断地使用不断加深理解。本篇就是我的个人学习笔记。 –一个正在努力学习的码农新人 协议那么多,常用的也就那么几个 进程/应用程协议 常见协议有:Telnet、FTP、TP、HTTP、DNS等。由客程序和服务程序两部分组成,程序通过服务器与客户机交互。 主机—主机层协议 建立并且维护…

继续访问

TCP协议中的序列号

TCP 协议工作在OSI的传输层,是一种可靠的面向连接的数据流协议,TCP之所以可靠,是因为它保证了传送数据包的顺序。顺序是用一个序列号来保证的。响应包内也包括一个序列号,表示接收方准备好这个序列号的包。在TCP传送一个数据包时,它会把这个数据包放入重发队列中,同时启动计时器,如果收到了关于这个包的确认信息,便将此数据包从队列中删除,如果在计时器超时的时候仍然没有收到确认信息,则需要重新发送该数据

继续访问

TCP解析

TCP协议 首部格式 图释: 各个段位说明: 源端口和目的端口:  各占 2 字节.端口是传输层与应用层的服务接口.传输层的复用和分用功能都要通过端口才能实现,源端口号,主机该报文段是来自哪里;目标端口号,要传给哪个上层协议或应用程序 序号:  占 4 字节.TCP 连接中传送的数据流中的每一个字节都编上一个序号.序号字段的值则指的是本报文段所发送的数据的之一个字节的序号 确认号:  占 4 字节,是期望收到对方的下一个报文段的数据的之一个字节的序号,用作对另一方发送的tcp报文段的响应。其值

继续访问

Java 网络编程TCP协议之发送数据和接收数据的详解

TCP协议: 传输控制协议(Tranission Control Protocol) TCP协议是面向连接的通信协议,即传输数据之前,在发送端和接收端建立逻辑连接,然后再传输数据,它提供了两台计算机之间可靠无差错的数据传输。在TCP连接中必须要明确客户端和服务器端,由客户端向服务器端发出连接请求,每次连接的创建都要经历“三次握手”。 三次握手: TCP协议中,在发送数据的准备阶段,客户端与服务器之间的三次交互,以保证连接的可靠。 之一握手,客户端向服务器发出连接请求,等待服务器确认。 第二次握手,服务

继续访问

TCP协议及数据结构

特点 面向连接:通讯双方交换数据前必须建立连接 可靠的:多种确保可靠性的机制 关键名词解释 字节流服务:8bits(1Byte)为最小单位构成的字节流 套接字地址: TCP 使用“连接”(而不仅仅是“端口”)作为最基本的抽象,同时将TCP连接的端点称为插口(socket),或套接字、套接口。 插口和端口、IP地址段关系是: TCP 发送进程以字节流的形式传递数据,而接收进程也把数据作为字节流来接收,类似于假想的管道 UDP 发送进程的数据报文都是独立的,因此UDP不是面向流的协议。 缓存:数据流向的每一

继续访问

TCP可靠传输-超时重传时间的选择

前面已经讲到,TCP的发送方式在规定的时间内没有收到确认就要重传已发送的报文段。这种重传的概念是很简单的,但重传时间的应该设置多少合适呢?这是TCP最复杂的问题之一 如果把超时重传时间设置的过长,就会引起很多报文段不必要的重传,使网络负荷增大。但若把超时重传时间设置的过长,则又使网络的空闲时间增大,降低了传输效率。 TCP采用了一种自适应算法,它记录一个报文段发出得到时间,以及收到相应的确认的时间,这两个时间之差就是报文段的往返时间RTT(又称为平滑往返时间)。TCP保留了RTT的一个加权平均往返时间R

继续访问

计算机原理—TCP详解

什么是“三次握手,四次挥手” TCP 是一种面向连接的单播协议,在发送数据前,通信双方必须在彼此间建立一条连接。 所谓的“连接”,其实是客户端和服务器的内存里保存的一份关于对方的信息,如 IP 地址、端口号等。 TCP 可以看成是一种字节流,它会处理 IP 层或以下的层的丢包、重复以及错误问题。 在连接的建立过程中,双方需要交换一些连接的参数。这些参数可以放在 TCP 头部。 TCP 提供了一种可…

继续访问

tcp数据传输

网络

分析tcp协议原理

原理四个主要方面:

一、tcp协议之连接建立、断开

二、tcp协议之超时重传

三、tcp协议之窗口管理

四、tcp协议之拥塞控制

TCP是一种面向有连接的协议,也就是说必须确认对方存在时才能发送数据而TCP通过检验和、序列号、确认应答、重发控制、连接管理、窗口控制等机制来实现可靠传输。

1. 目的:TCP

三次握手

是客户端和服务器总共发三个

数据包

,通过三个数据包来确认主动发送能力和被动接收能力是否正常。

2. 实质:通过指定的四元组(源地址、源端口、目标地址、目标端口)来建立TCP连接,同步双方各自发送序列号seq和确认号ACK,同时也会交换窗口大小信息

三次握手过程的实现方式就是交换序列号seq。

随便在网上找个地址,如果通过域名想看ip地址,可以ping下看连接。

① 192.168.3.7发送报文段至222.169.228.146,告知序列号x为0。

② 222.169.228.146发送报文段至192.168.3.7,告知序列号y为0,确认号ACK为x+1=1。

③192.168.3.7发送报文段至222.169.228.146,告知确认号ACK为y+1=1。

报文段中的其他参数:

MSS=1460

:允许从对方接收到的更大报文段,图中为1460字节(指承载的数据,不包含报文段的头部)。

win=8192

滑动窗口

的大小为8192字节。

SACK_PERM=1

:开启选择确认。为什么会使用SACK:tcp确认方式不是一段报文段一确认,而是采用累积确认方式。服务器接收到的报文段无序所以序列号也是不连续,服务器的接收队列消宽会出现空洞情况。为了解决空洞,提前了解当前空洞,应对丢失遗漏,采取重传。提前了解方式就是通过SACK选迅桥誉项信息,SACK信息包含接收方已经成功接收的数据块的序列号范围。而SACK_PERM字段为1表明,选择开启了SACK功能。

网络层

可能会出现丢失、重复、乱序的问题,tcp是提供可靠的数据传输服务的,为了保证数据的正确性,tcp协议会重传它认为的已经丢失的包。重传两种机制:一种基于时间重传,一种基于确认报文段提供的信息重传。

RTT

:数据完全发送完(完成最后一个比特推送到数据链路上)到收到确认信号的时间(往返时间)。

RTO

:重传超时时间(tcp发送数据时设置一个

计时器

,当计时器超时没有收到数据确认信息,引发超时而重传,判断的标准就是RTO)。

思考:发送序列号为1、2、3、4这4个报文段,但是出现了序列号2报文段丢失,怎么办?

发送端接收到seq1的确认报文(ACK=2)后,等待seq=2的确认报文。

接收端当收到序列号为3的报文(2已丢失),发送ack为4的确认报文,发送亩段端正等待ack为2的确认报文,面对跳跃的报文,那么发送端会一直等待,直到超出指定时间,重传报文2。

为什么不跳跃确认呢?

tcp是累积确认方式,如果确认报文3,那么意味着报文1和报文2都已经成功接收。

超时处理方式:

思考:上面计时器是以时间为标准重传,那么可以通过确认报文的次数来决定重传。

发送端接收到seq1的确认报文(ACK=2)后,等待seq=2的确认报文。

接收端收到报文3、4、5,但是没收到报文2,那么接收端发送三个ACK为2的确认报文,发送端收到这个三个确认报文,重传报文2。

思考:如果快速重传中丢失包的地方很多(报文2,报文,7,报文9,报文30,报文300….),那么需要从头到尾都重传,这很蛋疼?

思考:SACK重传对于接收到重复数据段怎样运作没有明确规定,通过DSACK重传可以让发送方知道哪些数据被重复接收了,而且明确是什么原因造成的。

发送端没有收到的ACK包,超过指定时间,重传报文。

接收端都已经收到的发送报文了,又来是重复报文。再向发送端发送一个ACK报文,设置SACK,告知发送端,已经收到了包,只是回应ACK包丢失。

发送端发送包,由于

网络延迟

,一直没有达到接收端。

接收端连续发送三个ACK 200确认报文,触发快速重传,发送端收到了ACK 500的确认报文,表明之前的报文都已经交付成功。

接收端又收到了延迟的报文,再次向发送端发送一个SACK的ACK 500报文。

发送端发现这是重复报文,判断为网络延迟造成的。

计时器重传:根据超时,重传。

快速重传:根据接收三次相同ACK报文,重传。

选择确认重传:根据接收端提供的SACK信息,重传。

DSACK重传:根据重复报文,明确丢失ACK报文还是网络延迟。

Category1:已发送且已确认(已经收到ACK报文的数据)。

Category2:已发送但未收到确认。

Category3:即将发送。

Category4:窗口移动前都不能发送。

可用窗口:46-51字节。

发送窗口:32-51字节。

RCV.NXT:左边界

RCV.WND:接收窗口

RCV.NXT+RCV.WND:右边界

接收端接收到序列号小于左边界,那么被认为重复数据而被丢弃。

接收端接收到序列号大于右边界,那么被认为超出处理范围,丢弃。

注意:tcp协议为累积ACK结构,只有当达到数据序列号等于左边界时,数据才不会被丢弃。

如果窗口更新ACK丢失,对于发送端,窗口左边界右移,已发送数据得到ACK确认之后,左右边界距离减小,发送端窗口会减小,当左右边界相等时,称为零窗口。零窗口之后:接收端发送窗口更新能会发生窗口更新ACK丢失。

>解释:

TCP是通过接收端的通告窗口来实现

流量控制

的,通告窗口指示了接收端可接收的数据量。

当窗口值变为0时,可以有效阻止发送端继续发送,直到窗口大小恢复为非零值。

当接收端重新获得可用空间时,会给发送端传输一个窗口更新告知其可继续发送数据。这样的窗口更新通常都不包含数据(纯ACK),接收端向发送端发送的窗口更新ACK可能丢失。结果双方处于等待状态,发生

死锁

解决方案:

发送端会采用一个持续计时器间歇性地查询接收端,看其窗口是否已增长。触发窗口探测,强制要求接收端返回ACK。发送几次探测,窗口大小还是0,那么断开连接。

出现SWS的情况:

① 接收端通告窗口太小。

② 发送端发送的数据太小。

解决方案:

① 针对接收端:不应通告小窗口值

描述:在窗口可增至一个全长的报文段(接收端MSS)或者接收端缓存空间的一半(取两者中较小值)之前,不能通告比当前窗口更大的窗口值。标准:min(MSS , 缓存空间/2)。

② 针对发送端:不应发送小的报文

至少满足以下其一:

(1)可以发送MSS字节的报文。

window size >= MSS或者 数据大小>=MSS

(2)数据段长度>=接收端通告过的更大窗口值的一半,才可以发送。

收到之前发送的数据的ack回包,再发送数据,否则一直攒数据。

(3) -1 没有未经确认的在传数据或者-2 连接禁用Nagle算法。

tcp基于ACK数据包中的通告窗口大小字段实现了流量控制。

当网络大规模通信负载而瘫痪,默认网络进入拥塞状态,减缓tcp的传输。发送方和接收方被要求承担超负荷的通信任务时,采取降低发送速率或者最终丢弃部分数据的方法。

反映网络传输能力的变量称为拥塞窗口(cwnd)。

通告窗口(awnd)。

发送窗口swnd=min(cwnd,awnd)

目的:tcp在用拥塞避免算法探寻更多可用带宽之前得到cwnd值,帮助tcp建立ACK时钟。

:在传输初始阶段,由于未知网络传输能力,需要缓慢探测可用传输资源,防止短时间内大量数据注入导致拥塞。慢启动算法针对这一问题而设计。在数据传输之初或者重传计时器检测到丢包后,需要执行慢启动。

拥塞窗口值:每收到一个ACK值,cwnd扩充一倍。所以假设没有丢包且每个数据包都有相应ACK值,在k轮后swnd= ,成

指数增长

SS是发送方的更大段大小。

慢启动阶段,cwnd会指数增长,很快,帮助确立一个慢启动阙值(ssthresh)。有了阙值,tcp会进入拥塞避免阶段,cwnd每次增长值近似于成功传输的数据段大小,成

线性增长

实现公式:cwnd+=SS*SS/cwnd

刚建立连接使用慢启动算法,初始窗口为4,收到一次ACK后,cwnd变为8,再收到一次ACK后,cwnd变为16,依次继续,32、64,达到阙值ssthresh为64。

开始使用拥塞避免算法,设置ssthresh为ssthresh/2,值为32。重新从初始窗口4,线性递增到ssthresh=32。

当cwnd ssthresh时,使用拥塞避免算法

应用快速恢复算法时机:启动快速重传且正常未失序ACK段达到之前。启动快速恢复算法。

实现过程:

① 将ssthresh设置为1/2 cwnd,将cwnd设置为ssthresh+3*SS。

② 每接收一个重复ACK,cwnd值暂时增加1 SS。

③当接收到新数据ACK后,将cwnd设置为ssthresh。

TCP/IP详解 TCP的超时与重传()

TCP 重传机制

通过上面我们直达搜:1)时间上的指数避退 2)复位的时间

往返时间测量

RTT(RTO)指的测量

往返时间RTT的例子

21.4.2 RTT估计器 【平滑的RTT和平滑的均值偏差】

Err = M – A = 0.5 – 2 = -1.5

A= A + gErr = 2 – 0.125 * 1.5 = 1.8125

RTO = A+ 4D = 1.825 + 4 *1.125 = 6.3125

采用上面公式计算的Err 、A 和D的值与实际使用的定点计算方法得到结果有一些微小的差别。 后一种方法得到的RTO的值为6s(因为计算机是采用了移位操作,而非6.3125s)

拥塞举例:

在时刻 10、14、 31 附近发生了3个重传。 我们还可以看到在这3个点中只进行了一次报文段的重传, 因为只有一个点下垂低于向上的斜率。

拥塞避免算法

拥塞避免算法和慢启动算法需要对每个连接维持两个变量: 已给拥塞窗口cwnd 和 一个慢启动门限ssthresh 。 算法的工作如下:

拥塞避免算法:线性增长的过程,上面的例子是慢启动和拥塞避免算法的

快速重传与快速恢复算法

快速恢复算法

按每条路由进行度量

新的TCP实现在路由表项中维持粗多我们在前面已经介绍过的指标。 但一个TCP连接关闭时, 如果已经发送改了足够多的数据来获得有意义统计的资料, 且目的节点的路由表项不是一个默认的表项,那么下列信息就曹村在路由表项中以备下次使用: 被平滑的RTT,被平滑的均值偏差以及慢启动门限。 所谓 “足够多的数据”是指一个窗口的数据,这样就可得到16个RTT采样。

当建立一个新的连接时, 无论是主动还是被动,拆局如果该连接将要使用的路由表项已经有这桥燃些度量的值,则用这些度量来对相应的变量进行初始化。

ICMP 的差错 : 源站抑制、 主机不可达、网络不可达

————————

TCP的重新分组

当TCP超时并重传时,它不一定哟啊重传同样的报文段。 相反,TCP允许进行冲农信分组而发送一个较大的报文段, 这有助于提高性能(当然, 这个较大的报文daunt不能够超过接收方声明旅消让的MSS)。 在协议中这是允许的, 因为TCP是使用字节序号而不是使用报文段序号来进行识别它所要发送的数据和进行确认。

有关内容的总结:

几个TCP中的常见的算法的劣迹

TCP定时器: 2mls定时器、 超时定时器、坚持定时器、保活定时器

linux tcp rto的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于linux tcp rto,深入理解Linux TCP RTO算法,tcp重传报文可以多添加数据吗,分析tcp协议原理,TCP/IP详解 TCP的超时与重传()的信息别忘了在本站进行查找喔。


数据运维技术 » 深入理解Linux TCP RTO算法 (linux tcp rto)