RTO(Retransmission TimeOut) 为了防止数据报丢失,当TCP发送一个报文时,就启动重传计时器,有2种情况: 1.若在计时器超时之前收到了特定报文的确认,则撤消这个计时器
不过在 SYN 握手阶段,网络连接还没有建立起来,如果此时发生丢包,那么因为系统没有可以参照的 RTT(Round-Trip Time),所以此时只能给出系统缺省设置的 RTO: #define TCP_RTO_MAX...((unsigned)(120*HZ)) #define TCP_RTO_MIN ((unsigned)(HZ/5)) #define TCP_TIMEOUT_INIT ((unsigned)(1*HZ...num_timeout, TCP_RTO_MAX); mod_timer(&req->rsk_timer, jiffies + timeo); return; 可见 RTO 的最大值是...还有一点需要说明的是,在建立连接后,因为目前网络都很快,所以大部分连接的 RTO 都会接近 TCP_RTO_MIN,也就是 200ms,可以通过「ss -int」命令来确认。...关于超时重传还有很多细节需要考虑,下面列出一些资料: TCP/IP重传超时–RTO RTO对tcp超时的影响 linux下超时重传时间(RTO)的实现探究 RTO的计算方法(基于RFC6298和Linux
在衡量系统高可用的时候,我们经常能看到几个专业词汇,例如RPO和RTO,像OceanBase号称可以做到RPO=0,RTO<30s,RPO和RTO代表了什么?...RTO,Recovery Time Objective,他是指灾难发生后,从IT系统当机导致业务停顿之时开始,到IT系统恢复至可以支持各部门运作、恢复运营之时,此两点之间的时间段称为RTO。...可以看出来,RTO和RPO服务于不同的目标,RTO涉及应用程序和系统,但主要描述应用程序停机时间的限制。RPO主要与失败事件后丢失的数据量有关。...因此,从客户的角度,如果某个服务节点发生了故障,肯定希望数据不丢(RPO=0),而且能尽快恢复(RTO 越小越好)。...因此,这种技术不仅能保证RPO=0,而且大大减小了RTO,相比传统“主从复制”技术来说可以提供更强大的高可用能力。
TCP/IP协议 TCP/IP 协议栈是一系列网络协议(protocol)的总和,是构成网络通信的核心骨架,它定义了电子设备如何连入因特网,以及数据如何在它们之间进行传输。...OSI 7层模型和TCP/IP四层网络模型对应关系 计算机网路基础的知识不过多讲解,主要是让大家明白接下来的Linux网络编程数据流属于那一层,具体如下图 TCP/IP协议数据流示意图 我们接下来讲解的...Linux网络编程Tcp协议是属于传输层的协议 Linux Socket 网络编程 TCP协议 TCP是面向连接的可靠的传输层协议。...TCP编程 Linux中的网络编程是通过socket接口来进行的。socket是一种特殊的I/O接口,它也是一种文件描述符。常用于不同机器上的进程之间的通信,当然也可以实现本地机器上的进程之间通信。...使用TCP协议的流程图 根据流程图逐一讲解API接口.
wide': 0 tcp:tcp_retransmit_skb...0 tcp:tcp_send_reset 0 tcp:tcp_receive_reset...5 tcp:tcp_rcv_space_adjust...0 tcp:tcp_retransmit_synack 9 tcp:tcp_probe...] [k] tcp_rcv_state_process + 50.00% 0.00% python [kernel.kallsyms] [k] __tcp_transmit_skb
其中复位标志RST的作用就是“复位相应的TCP连接”。 TCP连接和释放时还有许多细节,比如半连接状态、半关闭状态等。详情请参考这方面的巨著《TCP/IP详解》和《UNIX网络编程》。...原因在于Socket.close()方法的语义和TCP的“FIN”标志语义不一样:发送TCP的“FIN”标志表示我不再发送数据了,而Socket.close()表示我不在发送也不接受数据了。...; 客户端和服务器统一使用TCP短连接。...然后是客户端和服务器统一使用TCP长连接:客户端使用TCP长连接很容易配置(直接设置HttpClient就好),而服务器配置长连接就比较麻烦了,就拿tomcat来说,需要设置tomcat的maxKeepAliveRequests...,固定5分钟tcp连接回收,而且发现连接出错时,重发之前10s内消息。
) { 44 if (tcp_is_sack(tp)) 45 mib_idx = LINUX_MIB_TCPSACKRECOVERYFAIL;...mib_idx = LINUX_MIB_TCPRENOFAILURES; 56 } else { 57 mib_idx = LINUX_MIB_TCPTIMEOUTS...) { 90 icsk->icsk_backoff = 0; 91 icsk->icsk_rto = min(__tcp_set_rto(tp), TCP_RTO_MAX...); 92 } else { 93 /* 正常指数后退超时 */ 94 icsk->icsk_rto = min(icsk->icsk_rto << 1, TCP_RTO_MAX..., TCP_RTO_MAX); 98 /* 连重传都超时了,则重置套接字的下一跳。
在linux中重传次数默认最大为15次,由两个参数控制: net.ipv4.tcp_retries1 = 3 net.ipv4.tcp_retries2 = 15 tcp_retries1 = 3 是指重传了...在Linux源码中,有这样的定义(源码路径include/net/tcp.h,在我这个3.10版本的内核代码中是134、135行): #define TCP_RTO_MAX ((unsigned)(120...而RTO的最大值又由谁来确定呢?那就是tcp_bound_rto(3.10源码路径include/net/tcp.h中600-604行)了。...static inline void tcp_bound_rto(const struct sock *sk) { if (inet_csk(sk)->icsk_rto > TCP_RTO_MAX)...inet_csk(sk)->icsk_rto = TCP_RTO_MAX; } 以上就是RTO的计算逻辑。
查了下linux stderr手册,发现是ETIMEDOUT对应了Connection timed out。...ETIMEDOUT 既然是linux kernel返回的,笔者就立马翻了linux源码。 (这其中有个插曲,就是笔者一开始看的是2.6.24内核源码,发现怎么计算都对不上数据。..., LINUX_MIB_TCPABORTONTIMEOUT); } 至此,基本可以判定就是tcp_write_timeout超时了,也即其中的 retransmits_timed_out判定超时。...+(boundary - linear_backoff_thresh) * TCP_RTO_MAX; 即(TCP_RTO_MIN=200ms,TCP_RTO_MAX=120s) timeout = (...,重传rto是不停的*2,一直到TCP_RTO_MAX(120s)为止,阅读linux代码可知,在笔者的线上情况下,初始rto=srtt>>3 + rttvar(TCP_RTO_MIN)(当然了,实际比这个复杂的多
查了下linux stderr手册,发现是ETIMEDOUT对应了Connection timed out。...ETIMEDOUT 既然是linux kernel返回的,笔者就立马翻了linux源码。 (这其中有个插曲,就是笔者一开始看的是2.6.24内核源码,发现怎么计算都对不上数据。..., LINUX_MIB_TCPABORTONTIMEOUT); } 至此,基本可以判定就是tcp_write_timeout超时了,也即其中的 retransmits_timed_out判定超时。...= tcp_sk(sk)->retrans_stamp; linear_backoff_thresh = (TCP_RTO_MAX/TCP_RTO_MIN); if (boundary <=...+(boundary - linear_backoff_thresh) * TCP_RTO_MAX; 即(TCP_RTO_MIN=200ms,TCP_RTO_MAX=120s) timeout =
, inet_csk(sk)->icsk_rto, TCP_RTO_MAX); return 0; } 又上面代码可知,在tcp_connect设置了重传定时器之后return回了tcp_v4...以下为代码对比: ========================>linux 内核版本2.6.32-431<======================== #define TCP_TIMEOUT_INIT...unsigned int rto_base = syn_set ? TCP_TIMEOUT_INIT : TCP_RTO_MIN; .........timeout = ((2 << boundary) - 1) * rto_base; ...... } ========================>linux 内核版本2.6.32.63<=...TCP_RTO_MIN通过tcp_retries2计算出来的时间。
从linux源码看socket(tcp)的timeout 前言 网络编程中超时时间是一个重要但又容易被忽略的问题,对其的设置需要仔细斟酌。...以下为代码对比: ========================>linux 内核版本2.6.32-431<======================== #define TCP_TIMEOUT_INIT...unsigned int rto_base = syn_set ? TCP_TIMEOUT_INIT : TCP_RTO_MIN; .........timeout = ((2 << boundary) - 1) * rto_base; ...... } ========================>linux 内核版本2.6.32.63<=...TCP_RTO_MIN通过tcp_retries2计算出来的时间。
在 Linux 系统中,提供了一个叫 tcp_retries2 配置项,默认值是 15,如下图: 这个内核参数是控制,在 TCP 连接建立的情况下,超时重传的最大次数。...最小 RTO 和最大 RTO 是在 Linux 内核中定义好了: #define TCP_RTO_MAX ((unsigned)(120*HZ)) #define TCP_RTO_MIN ((unsigned...)(HZ/5)) Linux 2.6+ 使用 1000 毫秒的 HZ,因此TCP_RTO_MIN约为 200 毫秒,TCP_RTO_MAX约为 120 秒。...在 Linux 内核可以有对应的参数可以设置保活时间、保活探测的次数、保活探测的时间间隔,以下都为默认值: net.ipv4.tcp_keepalive_time=7200 net.ipv4.tcp_keepalive_intvl...也就是说在 Linux 系统中,最少需要经过 2 小时 11 分 15 秒才可以发现一个「死亡」连接。
在 Linux 系统中,提供了一个叫 tcp_retries2 配置项,默认值是 15,如下图:这个内核参数是控制,在 TCP 连接建立的情况下,超时重传的最大次数。...最小 RTO 和最大 RTO 是在 Linux 内核中定义好了:#define TCP_RTO_MAX ((unsigned)(120*HZ))#define TCP_RTO_MIN ((unsigned...)(HZ/5))Linux 2.6+ 使用 1000 毫秒的 HZ,因此TCP_RTO_MIN约为 200 毫秒,TCP_RTO_MAX约为 120 秒。...在 Linux 内核可以有对应的参数可以设置保活时间、保活探测的次数、保活探测的时间间隔,以下都为默认值:net.ipv4.tcp_keepalive_time=7200net.ipv4.tcp_keepalive_intvl...也就是说在 Linux 系统中,最少需要经过 2 小时 11 分 15 秒才可以发现一个「死亡」连接。
摘要 重传机制 超时重传 快速重传 SACK重传 Duplicate SACK 重传机制 TCP重传机制主要是为了防止网路包丢弃,重传的工作方式主要借助TCP头部中的序列号和确认号来决定是否重传,重传的触发方式主要由以下几种...什么是RTO? RTT就是数据包的往返时间,RTO就是超时重传时间。 RTO的长短对数据包的重传有什么影响?...但RTT会因为网络的变化而发生变化,所以在Linux系统中为了计算RTO,会对RTT进行两个采样: 通过采样RTT时间,然后加权平均,算出一个平滑RTT值,这个RTT值因网络状况不断变化 采样RTT的波动范围...SACK的使用条件 SACK必须要发送方和接收方同时支持,在linux中可以通过net.ipv4.tcp_sack参数开启(Linux2.4以后默认开启)。...如何开启D-SACK 在Linux下可以通过net.ipv4.tcp_dsack参数开启/关闭这个功能(Linux 2.4后默认打开)。
参考 linux内核关于TCP参数的分析 TCP_TW_RECYCLE It enables fast recycling of TIME_WAIT sockets. ......NOTE: net.ipv4.tcp_tw_recycle has been removed from Linux 4.12....SOURCE: https://vincent.bernat.im/en/blog/2014-tcp-time-wait-state-linux 我看到ubuntu18.04版本是linux 4.15.../pub/scm/linux/kernel/git/torvalds/linux.git/commit/?...回收时间 而根据代码: const int rto = (icsk->icsk_rto icsk_rto >> 1); 可以看到回收的超时时间为3.5 * RTO, RTO
netstat -nat|grep -i "80"|wc -l 查看80的 统计httpd协议的连接数 ps -ef |grep httpd|wc -l 统计状...
即在tcp_timestamps开启(Linux默认开启),tcp_tw_recycle会经常导致下面这种现象。...但在某个版本之后Linux内核仅仅用这个tcp_retries2来计算超时时间,在这段时间的重传次数纯粹由RTO等环境因素决定,重传超时时间在5/15下的表现为: tcp_retries2 对端无响应...开启这个参数后,我们的TCP拥塞窗口会在一个RTO时间空闲之后重置为初始拥塞窗口(CWND)大小,这无疑大幅的减少了长连接的优势。...*sk){ // 如果开启了start_after_idle,而且这次发送的时间-上次发送的时间>一个rto,就重置tcp拥塞窗口 if (sysctl_tcp_slow_start_after_idle...Linux 新版本 /* TCP initial congestion window */ #define TCP_INIT_CWND 10
即在tcp_timestamps开启(Linux默认开启),tcp_tw_recycle会经常导致下面这种现象。 ?...但在某个版本之后Linux内核仅仅用这个tcp_retries2来计算超时时间,在这段时间的重传次数纯粹由RTO等环境因素决定,重传超时时间在5/15下的表现为: tcp_retries2 对端无响应...开启这个参数后,我们的TCP拥塞窗口会在一个RTO时间空闲之后重置为初始拥塞窗口(CWND)大小,这无疑大幅的减少了长连接的优势。...*sk){ // 如果开启了start_after_idle,而且这次发送的时间-上次发送的时间>一个rto,就重置tcp拥塞窗口 if (sysctl_tcp_slow_start_after_idle...Linux 新版本 /* TCP initial congestion window */ #define TCP_INIT_CWND 10 总结 Linux提供了一大堆内参参数供我们进行调优,其默认设置的参数在很多情况下并不是最佳实践
领取专属 10元无门槛券
手把手带您无忧上云