rto

Linux 内核优化

烈酒焚心 提交于 2020-01-26 16:45:22
声明:本文档来自互联网整理部份加自已实验部份所得: TCP 相关部份 经常使用名词说明: retries( 再试 ) 、 TCP server <---> client通信状态 SYN----------------> <--------------SYN,ACK ACK---------------> 建立连接 Data1----------------> <---------------Data1,ACK Data2----------------> <--------------- 未回复 Data2----------------> 重传 [ 序列參数 tcp_sack, tcp_fack ] [ 重传次数參数 : tcp_retries1,tcp_retries2, tcp_orphan_retries ] 传输数据 FIN------------------> <-----------------FIN,ACK( 有时候 FIN,ACK 分两次 ) ACK-----------------> 断开连接 . 主动关闭 FIN------------------> <-----------------CLOSE_WAIT SYN 表示建立连接, RTT(Round-Trip Time): 往返时延 FIN 表示关闭连接, RTO ( Retransmission

[转帖]4000字详解TCP超时与重传,看完没收获算我输

五迷三道 提交于 2020-01-18 08:25:01
4000字详解TCP超时与重传,看完没收获算我输 https://network.51cto.com/art/202001/608869.htm 上一篇介绍 TCP 的文章「 TCP 三次握手,四次挥手和一些细节 」反馈还不错,还是蛮开心的,这次接着讲一讲关于超时和重传那一部分。 我们都知道 TCP 协议具有重传机制,也就是说,如果发送方认为发生了丢包现象,就重发这些数据包。很显然,我们需要一个方法来「猜测」是否发生了丢包。最简单的想法就是,接收方每收到一个包,就向发送方返回一个 ACK,表示自己已经收到了这段数据,反过来,如果发送方一段时间内没有收到 ACK,就知道很可能是数据包丢失了,紧接着就重发该数据包,直到收到 ACK 为止。 你可能注意到我用的是「猜测」,因为即使是超时了,这个数据包也可能并没有丢,它只是绕了一条远路,来的很晚而已。毕竟 TCP 协议是位于传输层的协议,不可能明确知道数据链路层和物理层发生了什么。但这并不妨碍我们的超时重传机制,因为接收方会自动忽略重复的包。 超时和重传的概念其实就是这么简单,但内部的细节却是很多,我们最先想到的一个问题就是,到底多长时间才能算超时呢? 一、超时是怎么确定的? 一刀切的办法就是,我直接把超时时间设成一个固定值,比如说 200ms,但这样肯定是有问题的,我们的电脑和很多服务器都有交互,这些服务器位于天南海北,国内国外

TCP-IP详解: RTT和RTO的计算方法

℡╲_俬逩灬. 提交于 2020-01-10 10:01:28
基本概念 RTT: 发送一个数据包到收到对应的ACK,所花费的时间 RTO: 发送数据包,启动重传定时器,重传定时器到期所花费的时间,称为RTO 对于segment的重传,重传的时间RTO设定是非常重要的,如果设置太短,可能会导致并没有丢包而重传,如果设置太长了,可能因为等待ACK而浪费掉很多时间,牺牲传输的效率。从思想上来讲,其实我们还是希望重传的时间需要稍稍的大于RTT就可以了。但是这个RTT没有什么可以使用的定值,他是不断变化的。 我们只能动态的进行设置,所以RTO只能是更加RTT来进行动态的设置,看下前辈们研究的RTT的计算方法 经典的算法 RFC793 首先计算一个平滑的RTT称置为SRTT, alpha是一个平滑因子,取值为0.8或者0.9 SRTT = ( ALPHA * SRTT ) + ((1-ALPHA) * RTT) 基于SRTT,计算出对应的RTO RTO = min[UBOUND,max[LBOUND,(BETA*SRTT)] 其中UBOUND是最大值,一般情况下为120s,LBOUND是最小重传值,一般情况下为1s,Beta取值为1.3~2.0. [RFC793] 其实这个算法,在目前Linux系统协议栈的实现中并没有使用了,原因是存在着一些不足之处,具体弊端没有认真研究,有文章指出不明确是使用第一次发送ACK的时间,还是使用重传ACK的时间采样RTT,

容灾恢复是绝大多数企业级应用的基本要求

∥☆過路亽.° 提交于 2019-12-14 23:48:28
容灾恢复是绝大多数企业级应用的基本要求 在没有Kubernetes也没有容器的时候,备份和恢复解决方案通常在虚拟机(VM)级别上实现。当应用程序在单个VM上运行时,容灾系统适用于这样的传统应用程序。但是,当使用Kubernetes对应用程序进行容器化管理时,这样的容灾系统就无法使用了。有效的Kubernetes容灾恢复方案必须针对容器化架构进行重新设计,并按Kubernetes的原生方式来运行。 传统的基于VM的备份和恢复解决方案,使用快照来收集数据,但这些数据对于某个具体容器化应用并不足够。因为任何一个特定的VM都将包含来自多个应用的数据。如果您尝试通过VM快照来备份APP 1,将会同时获取其他应用的多余数据。但这些数据从容器角度来看又不够:APP 1可能还会将数据存储在其他VM上。因此通过对某个单独VM的快照无法捕获所有APP1的数据。 基于分布式体系结构的现代应用需要的容灾方案,需要能够找到特定应用的所有相关数据和配置信息,并能够以零RPO(Recovery Point Objective,复原点目标)和接近零RTO(Recovery Time Object,复原时间目标)的方式进行恢复。 一个有效的Kubernetes容灾解决方案需要具备: 容器粒度的控制 能够备份数据和配置 Kubernetes命名空间感知 针对多云和混合云架构的优化 保持应用的一致性

K8S容灾方案的五个关键点

雨燕双飞 提交于 2019-12-14 23:44:34
容灾恢复是绝大多数企业级应用的基本要求 在没有Kubernetes也没有容器的时候,备份和恢复解决方案通常在虚拟机(VM)级别上实现。当应用程序在单个VM上运行时,容灾系统适用于这样的传统应用程序。但是,当使用Kubernetes对应用程序进行容器化管理时,这样的容灾系统就无法使用了。有效的Kubernetes容灾恢复方案必须针对容器化架构进行重新设计,并按Kubernetes的原生方式来运行。 传统的基于VM的备份和恢复解决方案,使用快照来收集数据,但这些数据对于某个具体容器化应用并不足够。因为任何一个特定的VM都将包含来自多个应用的数据。如果您尝试通过VM快照来备份APP 1,将会同时获取其他应用的多余数据。但这些数据从容器角度来看又不够:APP 1可能还会将数据存储在其他VM上。因此通过对某个单独VM的快照无法捕获所有APP1的数据。 基于分布式体系结构的现代应用需要的容灾方案,需要能够找到特定应用的所有相关数据和配置信息,并能够以零RPO(Recovery Point Objective,复原点目标)和接近零RTO(Recovery Time Object,复原时间目标)的方式进行恢复。 一个有效的Kubernetes容灾解决方案需要具备: 容器粒度的控制 能够备份数据和配置 Kubernetes命名空间感知 针对多云和混合云架构的优化 保持应用的一致性

16.TCP_对FIN_WAIT1的分析

我只是一个虾纸丫 提交于 2019-12-14 19:13:22
TCP处处是坑! 不要觉得你对TCP的实现的代码烂熟于心了就能把控它的所有行为!不知道你有没有发现,目前市面上新上市的关于Linux内核协议栈的书可谓是汗牛充栋,然而无论作者是国内的还是国外,几乎都是碰到TCP就草草略过,反而对IP,ARP,DNS这些大书特书,Why?因为Linux内核里TCP的代码太乱太复杂了,很少有人能看明白80%以上的,即便真的有看过的,其中还包括只懂代码而不懂网络技术的,我就发现很多声称自己精通Linux内核TCP/IP源码,结果竟然不知道什么是默认路由… 所以我打算写一篇文章,趁着这个FIN_WAIT1问题,顺便表达一下我是如何学习网络技术,我是如何解决网络问题的方法论观点,都是形而上,个人看法: 设计覆盖全面的复现实验 通读协议标准文档,理解实现建议 再次实验,预测并确认问题以外的现象 核对代码实现,跟踪代码的Changelog 写一个自己的实现或者乱改代码 … 本文聊聊TCP的FIN_WAIT1以及TCP假连接(死连接)问题。先看FIN_WAIT1。 首先还是从状态机入手,看看和FIN_WAIT1相关的状态机转换图: 我们只考虑常规的从ESTABLISHED状态的转换,很简单的一个单一状态转换: ESTAB状态发送FIN即切换到FIN_WAIT1状态; FIN_WAIT1状态下收到针对FIN的ACK即可离开FIN_WAIT1到达FIN_WAIT2.

Linux - TCP connect() failure with ETIMEDOUT

匿名 (未验证) 提交于 2019-12-03 08:52:47
可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试): 问题: For a TCP client connect() call to a TCP server.. If the client TCP receives no response to its SYN segment, ETIMEDOUT is returned. 4.4BSD, for example, sends one SYN when connect is called, another 6 seconds later, and another 24 seconds later (p. 828 of TCPv2). If no response is received after a total of 75 seconds, the error is returned. In Linux I would like know what is the retry mechanism (how many times and how far apart). Asking because for a TCP client connect() call I am getting ETIMEDOUT error. This socket has O_NONBLOCK option