Linux下TIME_WAIT连接优化内核参数tcp_tw_reuse与tcp_tw_recycle区别与联系浅析

概述

最近学习网络相关知识点,很多文章提到针对TCP time wait(后续简称TW)状态连接进行优化的参数tcp_tw_reuse和tcp_tw_recycle,并且不少文章提到了启用tcp_tw_recycle会导致的问题,不建议开启该选项,但是并没有找到一篇能完全解答自己所有疑惑的文章,如:

  1. Linux会丢弃所有来自远端的timestramp时间戳小于上次记录的时间戳(由同一个远端发送的)的任何数据包。也就是说要使用该选项,则必须保证数据包的时间戳是单调递增的,这里的远端定义的是ip还是ip+port? 是一定时间内丢弃时间戳过期packet还是tcp_tw_recycle启用后一直丢弃?
  2. 很多文章都会提到tcp_tw_reuse 仅作用于客户端连接,tcp_tw_recycle则同时作用于客户端与服务端连接,这里客户端、服务端连接具体指的是什么?与TCP三次握手的客户端、服务端概念上有什么区别?

通过学习网上大家的总结+阅读了部分4.9内核源码,这里整理总结一下从各处学习到的知识点及自己的理解。

过多time wait会导致的问题

  1. 客户端主动发起的连接总数受 max open file数限制,过多连接导致达到max open file限制将无法创建新的连接。
  2. 客户端主动发起的连接总数也受可用端口号限制,一般使用端口号为1024~65000,如果过多TW连接将端口号耗尽同样无法再创建新的连接。
  3. 每个TW连接都会占用一定的系统资源-如内存–实际耗费内存很小,这点一般可忽略

tcp_tw_reuse与tcp_tw_recycle相同点

  1. 两者目的均是为了解决系统中过多TW状态 TCP连接的问题。
  2. 两者都需要和tcp_timestamps 同时开启方能生效。
  3. 根据RFC定义,主动关闭连接方其TW状态需维持2MSL时间才正式关闭连接,Linux上MSL默认定义为30s,即TW状态默认需要维持1分钟方能正式关闭,tcp_tw_reuse与tcp_tw_recycle均为通过缩短TW状态时间进行复用来进行优化。
  4. 两个参数默认均为关闭状态

tcp_tw_reuse作用

  1. 仅作用于客户端方主动发起连接,即出向连接。
  2. 连接进入TW状态>1s,且新连接的timestamp大于旧连接记录的timestamp时方能复用连接。
  3. client提前中止TW状态进行复用,发起新连接,server依然处于last ack状态时,交互流程如下:
  4. client发送新SYN => server
  5. client

tcp_tw_recycle作用

  1. 同时作用于client/server发起连接,即出、入向连接
  2. TW状态维持3.5RTO(the retransmission timeout (RTO) interval which is computed from the RTT and its variance)之后就直接可以被过期回收,具体RTO取值是基于网络RTT及其他相关因子综合计算,一般在200ms~120s之间。
  3. TW状态后2MSL会丢弃所有来自远端相同四元组的timestamp小于上次记录timestamp的任何数据包,因而需要保证数据包timestamp是单调递增的
  4. NAT情况下,不同client从同一NAT ip请求,由于NAT不会更改包中的timestamp,而不同机器的时间不可能完全同步,因而不同机器从同一个NAT IP+port发出的包会存在timestamp非单调递增的情况,问题场景举例:
    1. 机器A时间比机器B快1s,机器A先通过NAT机器 ip1:port1 对服务器S ip2: port2 发起tcp连接socket1–使用conn_old(ip1, port1, ip2, port2)四元组表示
    2. 后S主动断开连接进入TW状态,由于开启tcp_tw_recycle,经过3.5RTO后S即可复用conn_old这个连接
    3. NAT机器对应连接在进入LAST ACK并收到S回复的ACK之后关闭了conn_old
    4. 而后机器B通过NAT机器发起conn_new(ip1, port1, ip2, port2)
    5. 此时S收到SYN包发现timestamp 小于conn_old中记录的最终timestamp,于是丢弃conn_new的SYN包
    6. 机器B超时未收到回复,重发SYN包,机器S收到后比较timestamp后继续丢弃….如此往复,最终导致通过NAT机器发起的conn_new(ip1, port1, ip2, port2)在TW状态终止的2MSl内都无法建立新的连接,对于机器B的用户表现就是连接迟迟无法建立成功。
  5. 高版本内核由于新的时间戳生成算法tcp: randomize tcp timestamp offsets for each connection 即便未使用NAT也会导致同一台机器不同socket之间timestamp非单调递增
  6. Linux从4.12版本内核开始已经移除了tcp_tw_recycle支持

文章开始时两个问题的答案

  1. 远端定义为ip+port,无论tcp_tw_reuse还是tcp_tw_recycle,针对回收TW连接对新连接的影响,都是指同一四元组代表的连接(src_ip, src_port, dst_ip, dst_port),在开启tcp_tw_recycle情况下,连接进入TW状态的2MSL时间内,所有收到的小于旧连接最终timestamp的包都会被直接丢弃。
  2. 客户端是指主动发起连接的一方,即TCP三次握手中发出首个SYN包的一方。

转载请注明出处,原文地址:https://www.cnblogs.com/AcAc-t/p/tcp_tw_reuse_and_tcp_tw_recycle_introduction.html

参考:

签名:拥抱开源,拥抱自由

Original: https://www.cnblogs.com/AcAc-t/p/tcp_tw_reuse_and_tcp_tw_recycle_introduction.html
Author: 及时
Title: Linux下TIME_WAIT连接优化内核参数tcp_tw_reuse与tcp_tw_recycle区别与联系浅析

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/578241/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • USB转双串口产品设计-RS232串口

    基于USB转2路串口芯片CH342,可以为各类主机扩展出2个独立的串口。CH342芯片支持使用操作系统内置的CDC串口驱动,也支持使用厂商提供的VCP串口驱动程序,可支持Windo…

    Linux 2023年6月7日
    094
  • RPA工单查询和下载流程机器人

    bash;gutter:true;1、登录业务系统,输入用户名和密码2、进入下载模块3、输入下载查询条件4、进入文件明细单5、下载文件视频地址:https://www.bilibi…

    Linux 2023年6月7日
    0143
  • ThinkPHP5浏览器关闭,继续执行php脚本

    ignore_user_abort(); //即使Client断开(如关掉浏览器),PHP脚本也可以继续执行. set_time_limit(0); //执行时间为无限制,php默…

    Linux 2023年6月7日
    091
  • python3安装pyhook3遇到的问题

    一、 解决办法:安装好:使用C++的桌面开发即可完成。 打开官方网址:Visual Studio: 面向软件开发人员和 Teams 的 IDE 和代码编辑器 (microsoft….

    Linux 2023年6月13日
    0107
  • [python] arch linux install mysql and use with python

    1. 概述 2. 安装 MySQL / MariaDB 3. 运行 MySQL / MariaDB 4. 配置 MySQL / MariaDB 5. 使用 MySQL / Mari…

    Linux 2023年6月8日
    093
  • 巧用 JuiceFS Sync 命令跨云迁移和同步数据

    近年来,云计算已成为主流,企业从自身利益出发,或是不愿意被单一云服务商锁定,或是业务和数据冗余,或是出于成本优化考虑,会尝试将部分或者全部业务从线下机房迁移到云或者从一个云平台迁移…

    Linux 2023年6月14日
    0104
  • pyQt的基本使用

    1. 基本窗口 import sys from PyQt5.QtWidgets import QApplication, QWidget if __name__ == ‘__mai…

    Linux 2023年6月7日
    0107
  • Java基础系列–04_数组

    一维数组:(1)数组:存储同一种数据类型的多个元素的容器。(2)特点: 每一个元素都有编号,从0开始,最大编号是数组的长度-1。编号的专业叫法: 索引(3)定义格式A:数据类型[]…

    Linux 2023年6月7日
    092
  • winServer 监控Serv-U服务脚本(停止自动启动)

    Windows Server 服务器监控服务脚本,每60s查询一次,若服务停止即再启动 Serv-U 服务监控 脚本如下: @echo off rem 定&a…

    Linux 2023年6月7日
    087
  • Nginx几种负载均衡方式介绍

    Nginx几种负载均衡方式介绍 前言 负载均衡就是Nginx将请求分摊到不同的服务器中,保证服务的可用性,缓解服务压力,保证服务的响应速度,即使某一个应用服务不可用,也可以保证业务…

    Linux 2023年6月6日
    0113
  • 【Python】【Flask】【字符串索引】计算人民币与美元的相互计算

    简介 Python Code 导包 设置首页 计算的接口 问题0:设置请求方式 问题1:关于接收数据可能存在的问题 问题2:返回结果 启动 完整代码 HTML Code 问题分析 …

    Linux 2023年6月14日
    099
  • Java学习笔记_Lambda学习

    在Java8之前,如果想”让参数具备行为能力”,即将代码块作为参数进行传递,这是很不方便的。比较普遍的方式就是创建一个类的实例对象,让实例去调用这个方法,从…

    Linux 2023年6月7日
    0104
  • 【Docker搭建】2. 在Docker中安装Redis5.0

    1. 安装Docker,详细 请看安装教程 。若已安装,请看 2. 2. 拉取 Redis 镜像 docker pull redis:5.0.5 3. 设置 Redis 配置文件 …

    Linux 2023年6月13日
    084
  • ELK-企业级日志分析系统

    ELK 企业级日志分析系统 1.常见日志处理方式 rsyslog: Ryslog是一个强大而安全的日志处理系统。Rsylog通过多个物理或虚拟服务器在网络上接收日志,并监视不同服务…

    Linux 2023年6月13日
    087
  • lvs

    1.lvs简介 2.结构体系 3.lvs工作模式及原理 4.配置lvs 4.1 部署lvs-nat模式的httpd负载集群—http协议 4.2 部署lvs-dr模式的…

    Linux 2023年6月13日
    092
  • 面试题:深拷贝、浅拷贝、引用拷贝的区别

    引用拷贝 浅拷贝 深拷贝 小结 作者:小牛呼噜噜 | https://xiaoniuhululu.com计算机内功、JAVA底层、面试相关资料等更多精彩文章在公众号「小牛呼噜噜 」…

    Linux 2023年6月6日
    097
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球