tcp_recycle与tcp_reuse的简易理解(个人记录用)

这篇具有很好参考价值的文章主要介绍了tcp_recycle与tcp_reuse的简易理解(个人记录用)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一直对Linux的内核参数比较感兴趣,然而工作中接触还是比较少,只能偶尔捡一两个认识下,平常用的较多的是net.ipv4.tcp_tw_recycle与net.ipv4.tcp_tw_reuse

自己以前理解的是:tcp_reuse主要是做tcp连接复用、tcp_recycle主要是快速回收处于time wait状态的链接,至于什么叫连接复用、怎么回收time wait状态的链接,从未深挖过(这可能也是水平一直无法进步的原因),因此写这个文章,后续有新的理解时,方便整合;

前提,需要开启net.ipv4.tcp_timestamps=0参数,这个参数表示是否启用时间戳检查,0为不启用,1为启用,tcp_recycle与tcp_reuse都是依赖于检查时间戳来定义TIME_WAIT的,因此,使用这两个参数,必须设置net.ipv4.tcp_timestamps=1

先写net.ipv4.tcp_tw_tcprecycle(这个相对好理解一些)

由于tcp四次挥手断开时,为保证数据传输完毕与断开时最后的ack请求,能准确到达服务器,因此会等待2msl(为了更好理解time wait状态,附上大佬的图对照下),这个msl是指在客户端收到FIN开始,发出ACK开始计时的,如果客户端发出ACK后,服务端2msl内没有收到ACK,那么服务端会继续发送FIN,这就是重传;

为什么是2msl?msl是指报文生成的最大时间,它是任何报文在网络上存活的最长时间,超过这个时间报文会被丢弃,那么2msl就是报文一来一回的时间,因此TIME_WAIT要等待2msl,超时则触发重传FIN,Linux对msl时间定义为30s,那么2msl就是60s,所以,TIME_WAIT状态至少要维持一分钟才能关闭(基本上是这样,本人对网络协议不是很熟悉,浅显之谈)

只有发起断开连接请求的一方才会进入TIME_WAIT状态,如下图,客户端发起断开连接请求并且在服务端发出FIN后,客户端就会进入TIME_WAIT状态,如果2msl后客户端没有收到任何新的数据包,那么客户端会进入close状态

tcp_recycle与tcp_reuse的简易理解(个人记录用),Linux内核参数积累,tcp/ip,网络,服务器

图非原创,侵删,来源于:超超超详细讲解TCP三次握手与四次挥手(大图解),值得收藏 - 知乎

重点来了

net.ipv4.tcp_tw_recycle就是用于快速回收处于TIME_WAIT状态的连接,让四次挥手不需要等待服务端确认ACK,不用等这2msl,这样有利于高并发状态下快速组建新的tcp链接

这样是比较浅显易懂的,那么tcp_recycle是根据什么来识别断开连接时的时间?也就是根据什么作为标志位?

时间戳!是的,tcp_recycle是根据客户端最后一次挥手时,发出ACK的时间戳作为标志位,时间戳超过这个点,那么就认为这个链接已经处于确认ACK中,无需等待了

开启net.ipv4_tcp_tw_tcpcycle的坏处?

之前有遇到过tcp_recycle参数开启导致服务端丢包问题,但是一直不了解根因,坏处基本答不上来,直到看了这位老哥的文章:深挖由tcp_tw_recycle引发的业务超时问题 - 知乎

个人理解就是,对端送的数据包中,时间戳可以是无序的,如果数据包中的时间戳并不准确(如NAT情况下,NAT不会更改包中的timestamp,而不同机器的时间不可能完全同步,NAT比较复杂,这里不做深究),那么就会造成tcp_recycle将对端于发送的数据包识别成TIME_WAIT之前的链接,造成系统层面的丢包。

如果需要开启,那么需要确保客户端与服务端之间,做了时间同步,或者时间一致,并且数据包中的时间戳必须是有序的,否则会造成系统层面丢包

 接下来说net.ipv4.tcp_tw_reuse

理解tcp_recycle后,reuse这块就更好理解了,这个参数与tcp_recycle类似,都是对处于TIME_WAIT状态的连接进行处理,但是tcp_recycle主要在于断开连接,tcp_reuse在于复用连接

tcp_reuse的作用域小于tcp_recycle,tcp_recycle作用于双向断开连接都可以生效,tcp_reuse仅用于出向连接,也就是作用于客户端主动发起断开连接的情况下生效,服务端主动断开时,这个参数是无意义的;

由于net.ipv4.tcp_tw_recycle是用于断开处于TIME_WAIT状态的连接,因此参数比较危险,会导致丢包,在数据包时间戳处于无序状态时更会引发生产事故,因此在Linux内核4.x后,这个参数已经被弃用,但目前市面上3.x版本内核还是比较常见,很多企业还是会涉及这个问题。

系统层面运维来讲,这部分知识基本上已经够用了,仅做个人记录用,欢迎大神批判,学习ing...文章来源地址https://www.toymoban.com/news/detail-801341.html

到了这里,关于tcp_recycle与tcp_reuse的简易理解(个人记录用)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 简易TCP服务器搭建

    目录 一、套接字及其分类 二、相关接口函数 三、TCP服务器搭建流程 1、创建套接字socket() 2、保存服务器信息 3、套接字绑定 4、监听客户端连接请求 5、接收客户端连接请求 6、数据收发 7、关闭套接字 四、运行结果         所谓套接字(Socket),就是对网络中不同主机上的

    2023年04月18日
    浏览(58)
  • 网络编程『简易TCP网络程序』

    🔭个人主页: 北 海 🛜所属专栏: Linux学习之旅、神奇的网络世界 💻操作环境: CentOS 7.6 阿里云远程服务器 随着数字时代的来临,TCP网络程序已成为程序员不可或缺的技术领域。本博客将带领读者深入研究,从最基础的字符串回响开始,逐步探索至多进程、多线程服务器

    2024年02月04日
    浏览(47)
  • 网络编程 -- 简易TCP网络程序

      字符串回响程序类似于 echo 指令,客户端向服务器发送消息,服务器在收到消息后会将消息发送给客户端,该程序实现起来比较简单,同时能很好的体现 socket 套接字编程的流程。      这个程序我们已经基于 UDP 协议实现过了,换成 TCP 协议实现时,程序的结构是没有变化

    2024年04月25日
    浏览(42)
  • 零基础搭建个人影音媒体平台,实现远程访问Jellyfin播放器的简易方法

    随着移动智能设备的普及,各种各样的使用需求也被开发出来,从最早的移动听音乐、看图片(MP3时代),到之后的移动视频需求(MP4时代)到现在的移动流媒体需求(智能手机看视频)。但当我们习惯这些需求后,忽然发现自己不知不觉间成了待割的韭菜(3台设备就要加钱

    2024年02月11日
    浏览(36)
  • LinuxC TCP实现简易聊天室

    目录 1.概述 1.1聊天室设计内容 2.系统设计 2.1系统功能设计 2.1.1用户管理 2.1.2聊天室管理 2.1.3聊天管理 2.2系统数据结构设计 2.3系统主要函数设计 3.系统实现 3.2功能模块的程序流程图及运行界面 3.2.1功能模块流程图  3.2.2运行界面 4.源代码 4.1客户端 4.2服务器 注:存在问题 1

    2024年02月09日
    浏览(39)
  • C# Tcplistener,Tcp服务端,Tcp心跳包服务器简易封装

    我最近有个需求要写Tcp服务端,我发现Tcp服务端的回调函数比较麻烦,简化Tcp的服务,我打算自己封装一个简单的Tcp服务端。 C# TCP应用编程三 异步TCP应用编程 C# Tcpclient Tcplistener 服务器接收多个客户端消息通讯 关于C#Socket断开重连问题 我最近有个Tcp服务端的项目,发现TcpL

    2024年01月19日
    浏览(36)
  • 【计算机网络】简易TCP网络小程序

    1.1.1 服务端创建套接字 我们将TCP服务器封装成一个类,当我们定义出一个服务器对象后需要马上对服务器进行初始化,而初始化TCP服务器要做的第一件事就是创建套接字。 TCP服务器在调用socket函数创建套接字时,参数设置如下: 协议家族选择 AF_INET ,因为我们要进行的是网

    2024年02月16日
    浏览(80)
  • C# Tcplistener,Tcp服务端简易封装

    我最近有个需求要写Tcp服务端,我发现Tcp服务端的回调函数比较麻烦,简化Tcp的服务,我打算自己封装一个简单的Tcp服务端。 C# TCP应用编程三 异步TCP应用编程 C# Tcpclient Tcplistener 服务器接收多个客户端消息通讯 关于C#Socket断开重连问题 我最近有个Tcp服务端的项目,发现TcpL

    2024年02月04日
    浏览(35)
  • 简易TCP客户端和服务器端通信

    #includeiostream #include winsock2.h   #include ws2tcpip.h   #includestdlib.h using namespace std; #define  BUF_SIZE  1024 int main() {     cout \\\"客户端\\\" endl;     //设置Winsock版本,     WSADATA   wsaData;     if (WSAStartup(MAKEWORD(2, 2), wsaData) != 0)     {         cout \\\"error\\\" endl;         exit(1);     }     //创建通

    2024年04月29日
    浏览(47)
  • 分布式和微服务的区别(简易理解)

    是一种系统的部署方式,主要将同一个服务拆分成可以部署到多台机器,这样就可以分摊单台机器的负载压力,将服务拆分的方式一般有垂直拆分、水平拆分,一般采用集群、主备的方式进行部署。 理解 分布式结构就是按照业务功能,拆分成独立的子服务,独立的库表,可

    2024年02月16日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包