tcp_tw_recycle慎用,记一次故障引发的教训(lesson)

tcp_tw_recycle 慎用

有一次线上问题,表现为有些设备有时能连上,有时又不行,某些设备又一直能连上。
后来经过长时间跟踪,发现是因为开启了tcp_tw_recycle,导致tcp握手异常。

tcp_tw_recycle 介绍

net.ipv4.tcp_tw_recycle 是 Linux 内核中的一个 TCP 参数,用于加速 TCP TIME-WAIT 状态套接字的回收。在打开该选项时,内核会更快地回收处于 TIME-WAIT 状态的连接,以便可以更快地重新使用这些连接资源。

参数说明

  • net.ipv4.tcp_tw_recycle:该选项启用(1)或禁用(0)快速回收 TIME-WAIT 状态的套接字。

打开该选项的影响

优点
  • 减少 TIME-WAIT 连接:加快 TIME-WAIT 状态套接字的回收,可以减少大量短连接时产生的 TIME-WAIT 状态连接数。
  • 提高端口重用率:有助于在高并发连接场景下提高端口的重用率,减轻服务器压力。
缺点
  • NAT 兼容性问题tcp_tw_recycle 会严格检查连接的时间戳,这对于 NAT(网络地址转换)环境可能导致严重问题。因为不同的客户端可能会通过同一个 NAT 设备进行连接,这些客户端的时间戳可能不一致,从而导致连接被拒绝。
  • 时间戳相关问题:打开该选项后,内核会检查 TCP 时间戳以便判断连接是否可以回收,这可能导致对使用 NAT 的客户端(如移动设备或同一局域网内的多个设备)产生访问问题。

使用 tcp_tw_recycle 的问题场景

  • NAT 环境下的问题:如果你的服务有大量客户端通过 NAT 设备连接,例如通过家庭路由器或公司防火墙连接到互联网,开启 tcp_tw_recycle 可能会导致这些客户端的连接被拒绝,表现为连接超时或无法建立连接。
    在 NAT(网络地址转换)环境中,多个客户端可能共享同一个 IP 地址。当这些客户端同时与服务器建立 TCP 连接时,服务器看到的源 IP 地址是相同的。如果 tcp_tw_recycle 被启用,并且同时 tcp_timestamps(默认情况下是启用的)也被启用,服务器可能会因为时间戳的不同而错误地识别连接,导致连接被拒绝或断开。这是因为 tcp_tw_recycle 和 tcp_timestamps 一起使用时,会基于时间戳来区分不同的连接,但在 NAT 环境中,这些时间戳可能不是唯一的。

连接不稳定:启用 tcp_tw_recycle 可能会导致连接不稳定。由于该参数会尝试更快地回收 TIME-WAIT 状态的连接,这可能会干扰正常的 TCP 连接过程,导致连接被拒绝或断开。特别是在高并发或网络状况不佳的情况下,这种不稳定性可能会更加明显。
与某些应用程序或服务的兼容性问题:某些应用程序或服务可能依赖于特定的 TCP 行为。启用 tcp_tw_recycle 可能会改变这些行为,导致与这些应用程序或服务的兼容性问题。

  • 现代内核弃用:在 Linux 内核 4.12 及更高版本中,该选项已经被移除,因为它带来的问题多于好处。代替方案是使用 tcp_tw_reuse 参数。

推荐做法

  • 禁用 tcp_tw_recycle:在大多数情况下,尤其是涉及 NAT 的环境,建议不要启用 tcp_tw_recycle
  • 启用 tcp_tw_reuse:如果需要优化 TIME-WAIT 状态的连接,建议使用 net.ipv4.tcp_tw_reuse 参数,它在安全性和兼容性方面更为合理。

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

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

相关文章

world machine学习笔记(3)

打开 可以打开场景设置,项目设置平铺构建设置 场景设置: 输出范围 设置中心点和范围 设置分辨率 项目设置: 设置地图颜色,单位,最高地形高度 点击这个图形进行预览设置 该按钮还有其他的功能 world machine基础流程…

知识分享:大数据信用花导致的评分不足多久能恢复

随着金融风控领域越来越科技化,基于大数据技术的金融风控成为了贷前风控不可或缺的重要环节,相信很多人在申贷的时候都听说过大数据信用和综合评分等词语,那大数据信用花导致的评分不足多久能恢复呢?本文带大家一起去了解一下。 首先&#x…

【AI大模型】这可能是最简单的本地大模型工具,无须部署,一键使用

目录 前言 LM-Studio​编辑 那么问题来了,为什么我要在本地部署大模型? 隐私性: 定制性: 成本和体验的优化: 工具功能特点和使用方式介绍: 首页提供搜索功能和一些模型的推荐 模型下载管理&#x…

【Python】 探索Python中的整数最大值和最小值

基本原理 在Python中,整数(int)类型是一种基本数据类型,用于表示整数。Python的整数类型是动态的,这意味着它们可以自动扩展以存储非常大的数值。然而,尽管Python的整数可以非常大,但它们仍然有…

使用VirtualBox+vagrant创建CentOS7虚拟机

1.VirtualBox 1.1.什么是VirtualBox VirtualBox 是一款开源虚拟机软件。VirtualBox 是由德国 Innotek 公司开发,由Sun Microsystems公司出品的软件,使用Qt编写,在 Sun 被 Oracle 收购后正式更名成 Oracle VM VirtualBox。 1.2.下载Virtual…

【Kafka】消息的顺序性、可靠性、幂等性

目录 消息顺序性消息可靠性生产者丢失消息消费者丢失消息Kafka丢失消息 消息幂等性 消息顺序性 消息追加到partition尾部,单个partition是有序的,但多个partition如何进行有序的获取一些消息? 解决方案 一个topic只设置一个partition&…

驱动执行报“Attribute var: Invalid permissions 0665”

问题:执行驱动的时候会报下面这个错误 WARNING: CPU: 0 PID: 123 at fs/sysfs/group.c:61 internal_create_group0x170/0x264() Attribute var: Invalid permissions 0665 问题分析:查看 fs/sysfs/group.c:61的代码,发现是我设置 module_par…

数组-在两个长度相等的有序数组中找到上中位数

题目描述 解题思路 此题目直接遍历两个列表,时间复杂度为O(n);使用二分法去比较两个递增列表的中位数,缩小两个数组中位数范围,时间复杂度O(logn),这里我们的算法实现使用二分法。 通过举例子来说明解题算法&#xf…

Linux驱动学习之模块化,参数传递,符号导出

1.模块化 1.1.模块化的基本概念: 模块化是指将特定的功能或组件独立出来,以便于开发、测试和维护。在Linux设备驱动中,模块化允许将驱动程序作为内核模块动态加载到系统中,从而提高了系统的灵活性和可扩展性。 1.2.Linux内核模…

Vue 3 组件基础与模板语法详解

title: Vue 3 组件基础与模板语法详解 date: 2024/5/24 16:31:13 updated: 2024/5/24 16:31:13 categories: 前端开发 tags: Vue3特性CompositionAPITeleportSuspenseVue3安装组件基础模板语法 Vue 3 简介 1. Vue 3 的新特性 Vue 3引入了许多新的特性,以提高框…

netmask一键修改子网掩码(KALI工具系列八)

目录 1、KALI LINUX简介 2、netmask工具简介 3、在KALI中使用netmask 3.1 目标主机IP(win) 3.2 KALI的IP 4、命令示例 4.1 查看版本 4.2 修改etho的子网掩码 4.3 查看状态信息 4.4 查看子网掩码 4.5 查看范围 4.6 DNS查看 5.、总结 1、KAL…

Java JUnit单元测试

Java JUnit 单元测试 测试分类 黑盒测试 不需要写代码,给输入值,看程序是否能够输出期望的值 白盒测试 需要写代码,关注程序具体的执行流程 Junit单元测试 JUnit 是由 Erich Gamma 和 Kent Beck 编写的一个测试框架(regressi…

【JavaEE进阶】——一万字带你深刻理解Spring IoCDI

目录 🚩Spring是什么 🎈什么是容器? 🎈什么是 IoC? 📝传统开发思路 📝IOC思想 📝IoC 优势 🎈DI 介绍 🚩IoC 详解 🎈Bean的存储 &#x…

Vue2全局封装modal弹框

Vue2全局封装modal弹框使用&#xff1a; 一.components下封装 1.index.js import ModalCheck from ./modal-check.vue export default ModalCheck2.modal-check.vue <template><div><Modalv-model"selSingleShow":title"editTitle(convertCa…

Python中的yield关键字,掌握生成器的精髓

Python 中的 yield 关键字用于定义一个生成器&#xff08;generator&#xff09;。生成器是一种特殊的迭代器&#xff0c;它允许你逐个产生值&#xff0c;而不是一次性创建并返回一个包含所有值的列表。使用 yield 的函数被称为生成器函数&#xff0c;它们在执行时不会直接返回…

四信云-设备维保管理系统上线,实现设备全生命周期管理

在当今的制造业中&#xff0c;设备是企业生产的核心要素&#xff0c;是企业竞争力的基石。 随着企业发展规模不断扩大&#xff0c;设备数量急速增长&#xff0c;传统的手工管理方式已经无法满足企业需求&#xff0c;设备管理系统的出现则填补了市场需求空白&#xff0c;其目标…

优先级队列(堆)的实现

1.什么是优先级队列 队列是一种先进先出(FIFO)的数据结构&#xff0c;但有些情况下&#xff0c;操作的数据可能带有优先级&#xff0c;一般出队 列时&#xff0c;可能需要优先级高的元素先出队列&#xff0c;该中场景下&#xff0c;使用队列显然不合适&#xff0c;比如&#x…

框架vnode,工厂模式实现的例子

工厂模式&#xff0c; vue3 <div><span>静态文字</span><span :id"hello" class"bar">{{ msg }}</span> </div> import { createElementVNode as _createElementVNode, toDisplayString as _toDisplayString, open…

堆的实现

前言&#xff1a;本文讲述堆实现的几个难点&#xff0c;注意本文主要是以实现为主&#xff0c;建议有些基本概念认识的人阅读。 目录 1.堆 2.堆的实现 堆结构的定义&#xff1a; 要实现的接口&#xff1a; 接口的实现&#xff1a; 堆的初始化和销毁&#xff1a; 向堆中插…

人工智能-YOLOv10-行人和车辆检测-yolo改进测距测速代码和原理

YOLOv10: 实时端到端目标检测技术的全新突破 YOLOv10代表了实时目标检测领域的重大进展&#xff0c;是YOLO系列模型的最新迭代&#xff0c;专为追求极致效率与精度平衡的应用场景设计。此项目由北京大学机器智能研究组&#xff08;THU-MIG&#xff09;的Ao Wang、Hui Chen、Li…