TCP连接超时机制

前言

众所周知,TCP协议是一个可靠的的协议。TCP的可靠性依赖于大量的 Timer 和 Retransmission 。现在咱们就来细说一下TCP协议的那些Timer

img

Connection-Establishment Timer

在TCP三次握手创建一个连接时,以下两种情况会发生超时:

  1. client发送SYN后,进入SYN_SENT状态,等待server的SYN+ACK。
  2. server收到连接创建的SYN,回应SYN+ACK后,进入SYN_RECD状态,等待client的ACK。当超时发生时,就会重传,一直到75s还没有收到任何回应,便会放弃,终止连接的创建。但是在Linux实现中,并不是依靠超时总时间来判断是否终止连接。而是依赖重传次数:
tcp_syn_retries (integer; default: 5; since Linux 2.2)The maximum number of times initial SYNs for an active TCP connection attempt will be retransmitted. This value should not be higher than 255. The default value is 5, which corresponds to approximately 180 seconds.tcp_synack_retries (integer; default: 5; since Linux 2.2)The maximum number of times a SYN/ACK segment for a passive TCP connection will be retransmitted. This number should not be higher than 255.

Retransmission Timer

当三次握手成功,连接建立,发送TCP segment,等待ACK确认。如果在指定时间内,没有得到ACK,就会重传,一直重传到放弃为止。Linux中也有相关变量来设置这里的重传次数的:

tcp_retries1 (integer; default: 3; since Linux 2.2)The number of times TCP will attempt to retransmit a packet on an established connection normally, without the extra effort of getting the network layers involved. Once we exceed this number of retransmits, we first have the network layer update the route if possible before each new retransmit. The default is the RFC specified minimum of 3.tcp_retries2 (integer; default: 15; since Linux 2.2)The maximum number of times a TCP packet is retransmitted in established state before giving up. The default value is 15, which corresponds to a duration of approxi‐mately between 13 to 30 minutes, depending on the retransmission timeout. The RFC 1122 specified minimum limit of 100 seconds is typically deemed too short.

Delayed ACK Timer

当一方接受到TCP segment,需要回应ACK。但是不需要 立即 发送,而是等上一段时间,看看是否有其他数据可以 捎带 一起发送。这段时间便是 Delayed ACK Timer ,一般为200ms。

Persist Timer

如果某一时刻,一方发现自己的 socket read buffer 满了,无法接受更多的TCP data,此时就是在接下来的发送包中指定通告窗口的大小为0,这样对方就不能接着发送TCP data了。如果socket read buffer有了空间,可以重设通告窗口的大小在接下来的 TCP segment 中告知对方。可是万一这个 TCP segment 不附带任何data,所以即使这个segment丢失也不会知晓(ACKs are not acknowledged, only data is acknowledged)。对方没有接受到,便不知通告窗口的大小发生了变化,也不会发送TCP data。这样双方便会一直僵持下去。

TCP协议采用这个机制避免这种问题:对方即使知道当前不能发送TCP data,当有data发送时,过一段时间后,也应该尝试发送一个字节。这段时间便是 Persist Timer 。

Keepalive Timer

TCP socket 的 SO_KEEPALIVE option,主要适用于这种场景:连接的双方一般情况下没有数据要发送,仅仅就想尝试确认对方是否依然在线。目前vipbar网吧,判断当前客户端是否依然在线,就用的是这个option。

具体实现方法:TCP每隔一段时间(tcp_keepalive_intvl)会发送一个特殊的 Probe Segment,强制对方回应,如果没有在指定的时间内回应,便会重传,一直到重传次数达到 tcp_keepalive_probes 便认为对方已经crash了。

tcp_keepalive_intvl (integer; default: 75; since Linux 2.4)The number of seconds between TCP keep-alive probes.tcp_keepalive_probes (integer; default: 9; since Linux 2.2)The maximum number of TCP keep-alive probes to send before giving up and killing the connection if no response is obtained from the other end.tcp_keepalive_time (integer; default: 7200; since Linux 2.2)The number of seconds a connection needs to be idle before TCP begins sending out keep-alive probes. Keep-alives are only sent when the SO_KEEPALIVE socket option is enabled. The default value is 7200 seconds (2 hours). An idle connection is terminated after approximately an additional 11 minutes (9 probes an interval of 75 sec‐onds apart) when keep-alive is enabled.Note that underlying connection tracking mechanisms and application timeouts may be much shorter.

FIN_WAIT_2 Timer

当主动关闭方想关闭TCP connection,发送FIN并且得到相应ACK,从FIN_WAIT_1状态进入FIN_WAIT_2状态,此时不能发送任何data了,只等待对方发送FIN。可以万一对方一直不发送FIN呢?这样连接就一直处于FIN_WAIT_2状态,也是很经典的一个DoS。因此需要一个Timer,超过这个时间,就放弃这个TCP connection了。

tcp_fin_timeout (integer; default: 60; since Linux 2.2)This specifies how many seconds to wait for a final FIN packet before the socket is forcibly closed. This is strictly a violation of the TCP specification, but required to prevent denial-of-service attacks. In Linux 2.2, the default value was 180.

TIME_WAIT Timer

TIME_WAIT Timer存在的原因和必要性,主要是两个方面:

主动关闭方发送了一个ACK给对方,假如这个ACK发送失败,并导致对方重发FIN信息,那么这时候就需要TIME_WAIT状态来维护这次连接,因为假如没有TIME_WAIT,当重传的FIN到达时,TCP连接的信息已经不存在,所以就会重新启动消息应答,会导致对方进入错误的状态而不是正常的终止状态。假如主动关闭方这时候处于TIME_WAIT,那么仍有记录这次连接的信息,就可以正确响应对方重发的FIN了。
一个数据报在发送途中或者响应过程中有可能成为残余的数据报,因此必须等待足够长的时间避免新的连接会收到先前连接的残余数据报,而造成状态错误。
但是我至今疑惑的是:为什么这个超时时间的值为2MSL?如果为了保证双方向的TCP包要么全部响应完毕,要么全部丢弃不对新连接造成干扰,这个时间应该是:

被动关闭方LAST_ACK的超时时间 + 1MSL

因为被动关闭方进入LAST_ACK状态后,假设一直没有收到最后一个ACK,会一直重传FIN,一直重传次数到达TCP_RETRIES放弃,将这个时间定义为「被动关闭方LAST_ACK的超时时间」,接着必须等待最后一个重传的FIN失效,需要一个MSL的时间。这样才能保证所有重传的FIN包失效,不干扰新连接吧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/22116.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

golang http 连接超时和传输超时

golang 测试代码 package mainimport ("net/http""net/url""fmt""io/ioutil""time""net""crypto/tls" )func TimeoutDialer(cTimeout time.Duration, rwTimeout time.Duration) func(net, addr string…

dbeaver的连接超时(Connection timed out: connect)

项目场景: hiveserver2启动了, 虚拟机 里能启动beeline,并且能连接hive2, 但是就是连接不了win上的dbeaver 问题描述: Could not open client transport with JDBC Uri: jdbc:hive2://192.168.2.104:10001/gmall;authnoSasl: java.net.ConnectExcepti…

Postman 请求超时

Postman发送连接时返回Error: Request timed out 服务器端已经启动,通过Postman进行测试时报错。在查阅各个网站资料后解决方法有两种,一是修改setting中的ssl将其关闭,二是将响应时间改为30000等,都没有解决问题。通过尝试&#…

网页上为何出现连接超时,怎么解决呢?

网页出现连接超时是因为本地网络不稳定或网页服务器堵塞等原因造成的。 定义: 网络连接超时就是在程序默认的等待时间内没有得到服务器的响应。 网络连接超 1. 网络断开,不过经常显示无法连接。 2. 网络阻塞,导致你不能在程序默认等待时间内…

postman或浏览器可以访问,java不能访问的post请求,连接超时

搞了半天,网上的模拟浏览器请求,代理ip都试了一遍;一直是连接超时; 最后终于找到了解决方案: -Djava.net.preferIPv4Stacktrue 在jdk上配置jvm参数禁用ipv6;具体什么原因我也不知道;

HttpClient 连接超时重试处理

记录一次HttpClient 连接超时重试问题 原代码如下: public static void main(String[] args) throws UnsupportedEncodingException {HttpClient httpClient new HttpClient();httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(5000);St…

解决 ping命令-请求超时 问题

​ ​ ​ 在连接局域网的过程中,我们经常使用 ping ip地址 的命令来测试网络情况,但总是遇到请求超时的情况。 当遇到这种情况时: ​ ​ 第一步:检查设备,所有设备检查无误且两台电脑能正常上网,进…

解决MobaXtermSSH连接超时(Network error:Conection timed out )

报错描述 Network error:Conection timed out 解决MobaXtermSSH连接超时,无法连linux IP地址的问题 使用的是MobaXterm远程连接我使用VMware创建的虚拟机。 ssh测试 1.检测一下linux系统上有没有安装ssh,一般情况是可以自动安装的,但是由于c…

Efficient Teacher

这里是针对YOLOv5的半监督目标检测实现 Efficient Teacher包含一篇论文(https://arxiv.org/pdf/2302.07577.pdf)和一套开源代码库(https://github.com/AlibabaResearch/efficientteacher)。其中,论文讲解了如何针对YOLOv5进行半监督训练,开源代码库可以…

一个巨型的ESP8266模块,围观围观

作者:晓宇,排版:晓宇 微信公众号:芯片之家(ID:chiphome-dy) 01 巨型ESP8266 ESP8266几乎无人不知,无人不晓了吧,相当一部分朋友接触物联网都是从ESP8266开始的&#xff…

入局AI时代,先从了解AI工具入手(200 个免费的 AI 工具分享)

这些工具是从业人员提升创造力和生产力的新领域!从生成独特的图像到将文本转换为语音,这些工具可以快速帮助你实现曾经难以想象的结果。 它们代表了人与机器之间的桥梁,这种合作可以开启新的可能性领域。拥抱 AI工具,可以极大的升…

资源盘点丨9个经典视觉-语言多模态预训练数据集

在 ChatGPT 引爆社会与学术界的热点后,“大模型”与“多模态”也成为了搜索量攀升的热门词汇。这些体现了大众对人工智能的广泛关注。 事实上,人工智能的进步离不开深度学习方法在各个具体任务上的进展。其中,尤其是预训练任务的方法&#x…

SolidEdge C#.NET 二次开发系列教程(一) 安装部署插件

SE二次开发国内的教程简直太少了,为了学习这块,废了不少功夫,走了不少弯路。 特此开贴写教程以示后人。 se插件开发完成后就是如何部署,安装和部署和其他的.net插件类似。 1.走到这步你基本离成功很近了。 准备好你的dll插件的 Gu…

纵使AI再强悍,低代码风韵犹存

互联网沉默已久,ChatGPT的出现激起千层浪,沉寂已久的互联网迎来新一轮的机遇。毫不夸张地说,任何一家以技术见长的企业,人工智能绝对占有一席之地。 目录 人工智能很强悍 低代码风韵犹存 快速开发平台,大有看头 AI…

Chatgpt商业版开源部署教程

基于 ChatGpt-Web 项目二开的可商业化的 ChatGpt Web 应用(含后端) github上的大佬基于 ChatGpt-Web 项目二开的可商业化的 ChatGpt Web 应用(含后端) 修复部分了bug 卡密、支付、对话、模型等 历史对话同步功能 演示图片 主要…

ChatGPT基础知识系列之Transformer模型详解

ChatGPT之Transformer模型详解 Transformer由论文《Attention is All You Need》提出,现在是谷歌云TPU推荐的参考模型。论文相关的Tensorflow的代码可以从GitHub获取,其作为Tensor2Tensor包的一部分。 1.Transformer 整体结构 首先介绍 Transformer 的整体结构,下图是 Tr…

聚观早报|王慧文要做「中国版 OpenAI」;Temu斥资近亿元赞助超级碗

点击蓝字 / 关注我们今日要闻:王慧文要做「中国版 OpenAI」;Temu斥资近亿元赞助超级碗;新东方在线股价收跌2.8%;ChatGPT带动的AIGC创业热潮要来了;传谷歌拆分其AR部门 王慧文要做「中国版 OpenAI」 2 月 13 日&#x…

上帝掷骰子吗?

“上帝掷骰子吗?” 这句名言出自物理学家爱因斯坦之口。都说现代人经常陷于迷茫,其实我们并不孤单,因为作为史上最伟大的物理学家之一、相对论的创始人,爱因斯坦在面对量子力学的随机性和不确定性,同样感到迷茫。 一本…

2023年十大流媒体发展趋势展望

点击上方“LiveVideoStack”关注我们 ▲扫描图中二维码或点击阅读原文▲ 了解音视频技术大会更多信息 编者按:经历了三年疫情,2023年流媒体将如何发展?虽然本文主要针对海外市场,但依然值得国内借鉴,比如AIGC、远程制播…

3名离职员工窃取公司游戏源码,半年狂赚 1.5 亿,网友:“自立门户也不带这样玩的!”...

整理 | 朱珂欣 出品 | CSDN程序人生(ID:coder_life) 对于游戏公司而言,安全、抄袭问题总是「防不胜防」。 不仅要抵御黑客攻击、排查自身的安全漏洞,还要警惕员工拿着代码跑了! 近日,据上海市…