当前位置: 首页 > news >正文

Linux系统中跟TCP相关的内核参数

1. TCP保活机制

参考 《Nginx(三) 配置文件详解 - 基础模块》3.18章节


  • net.ipv4.tcp_keepalive_intvl:设置两次相邻探活检测的间隔时间。默认是75秒,单位是秒。
  • net.ipv4.tcp_keepalive_probes:设置探活最多检测次数。默认是9次,单位是次。
  • net.ipv4.tcp_keepalive_time:设置TCP连接保活时长。默认是7200秒,单位是秒。

2. TCP Fast Open Cookie 


  • net.ipv4.tcp_fastopen可选值是0、1、2、3,默认是1。设置为0时表示关闭Fast Open Cookie功能,设置为1时表示仅作为客户端时使用Fast Open Cookie功能,设置为2时表示仅作为服务端时使用Fast Open Cookie功能,设置为3时表示无论作为客户端还是服务端时都使用Fast Open Cookie功能。请注意,Fast Open Cookie需要客户端和服务端同时开启才有效,开启后可以用TCP报文首部的Fast Open Cookie选项字段来声明是否使用FOC。FOC生效后,使用HTTP协议通信时,可以减少因三次握手而带来的1个RTT时间消耗(因为三次握手建立连接后,HTTP 请求必须在一个RTT后才能发送)。如果服务器仅作为服务端时,建议设置为2,如果是代理服务器,建议设置为3。

  • net.ipv4.tcp_fastopen_blackhole_timeout_sec = 3600

  • net.ipv4.tcp_fastopen_key = 00000000-00000000-00000000-00000000

3. 设置重传次数最大值


  • net.ipv4.tcp_orphan_retries:FIN报文重传次数最大值,默认值是0,特指8次。如果FIN报文重传次数达到该值且规定等待时间已结束,连接将直接关闭。如果是孤儿连接,重传次数虽未超过8次,但该连接自首次发出FIN报文开始,存活时间已超tcp_fin_timeout设定的时间,那么此时该连接也将会直接关闭。
  • net.ipv4.tcp_retries1报文超时重传次数达到该值且规定等待时间已结束,指示IP层进行MTU探测、刷新路由等。默认是3次。
  • net.ipv4.tcp_retries2:报文超时重传次数达到该值且规定等待时间已结束,连接将会直接关闭。默认是15次。
  • net.ipv4.tcp_syn_retries:SYN报文重传次数最大值,默认是6次。如果SYN报文重传次数达到该值且规定等待时间已结束,连接将直接关闭。
  • net.ipv4.tcp_synack_retries:SYN+ACK报文重传次数最大值,默认是2次。如果SYN+ACK报文重传次数达到该值且规定等待时间已结束,连接将直接关闭。

4. 孤儿连接

        当进程调用 close() 函数关闭连接后,相关句柄已经释放,无论该连接是处于 FIN_WAIT1 状态,还是确实关闭了,此连接已经与进程无关,由内核和另一端完成四次挥手交互,此时这个连接叫做孤儿连接。

        使用 close() 函数关闭连接是完全断开连接,同时关闭读和写,无法继续传输数据,是不优雅的,而 shutdown() 函数是优雅关闭连接,可以控制是关闭读还是写。


  • net.ipv4.tcp_max_orphans:指定系统内核最多能接管多少个孤儿连接。默认是16384个。如果孤儿连接数量超过该值,新增的孤儿连接将不再通过四次挥手来关闭连接,而是直接发送 RST 报文进行强制关闭,并发出警告信息。
  • net.ipv4.tcp_fin_timeout:指定孤儿连接在内核中的最大生存时间,单位是秒,默认是60秒,对应两个MSL,该参数也是设置服务器主动关闭TCP连接时在TIME_WAIT状态的2MSL等待时间。如果在60秒内还未关闭,连接将直接关闭。
  • net.ipv4.tcp_orphan_retries请参考第3章节。

5. 防御SYN Flood攻击

参考 TCP三次握手、四次挥手及状态转换详解


  • net.core.somaxconn:增大TCP全连接队列/accept队列大小,也是增大TCP半连接队列的关键参数。默认值是128。
  • net.core.tcp_max_syn_backlog :增大TCP半连接队列/SYN队列大小。默认值是1024。
  • net.ipv4.tcp_syncookies:设置是否开启syncookies。开启syncookies后,不使用半连接队列就可建立TCP连接。默认值是1,表示仅当 SYN 半连接队列溢出时,才启用它。设置为0时表示关闭,设置为2时表示无条件开启。
  • net.core.netdev_max_backlog:设置每个网卡接收队列的最大长度,防止网卡接收过载。默认值是1000个。内核从网卡收到数据包后,在交由协议栈(如IP、TCP)处理前会先将数据包放入一个缓冲队列中,当接数据包的速率大于内核协议栈处理的速率时,这个缓冲队列会不断增长,但不能超过netdev_max_backlog 参数设置的值,否则数据包将被丢弃。默认情况下,netdev_max_backlog 参数的值是与系统的内存大小和 CPU 数量相关的动态值。它会根据系统的硬件配置进行自适应调整,通常情况下不需要手动设置。除非这台服务器需要处理大量的网络请求,我们才将该值调大。
  • net.ipv4.tcp_synack_retries:降低SYN+ACK报文重传次数。默认是2次。请参考第3章节。

6. accept队列已满策略


  • net.ipv4.tcp_abort_on_overflow:该参数用于设置当accept队列已满时,是否要将后续请求建立的TCP连接置为RST,即返回RST报文。可选值是0或1,默认值是0,表示关闭。当accept队列已满时,如果该参数设置为0,服务端会丢弃掉客户端返回的ack报文。如果设置为1,服务端将发送RST报文给客户端,要求重置连接并重新建立连接。谨慎开启该配置! 

7. 窗口放大


  • net.ipv4.tcp_window_scaling:设置是否开启窗口放大功能。可选值是0或1,默认是1,表示开启窗口放大功能。

8. 优化TIME-WAIT


  • net.ipv4.tcp_tw_reuse:设置是否复用处于 TIME_WAIT 状态的TCP连接,可选值是0或1,默认是0,表示禁止复用连接。请注意,该配置仅适用于主动发起建立TCP连接的一方,也就是仅适用于客户端。开启该选项后,主动发起建立连接的一方在调用 connect() 函数时,如果选择到的端口,已经被相同四元组的连接占用,那么就判断该连接是否处于TIME_WAIT状态,如果该连接处于 TIME_WAIT 状态并且 TIME_WAIT 状态持续时间已超过1秒,那么就重用这个连接,然后就可以正常使用该端口了。所以该选项只适用于主动发起建立连接的一方。如果服务器仅作为服务端,就完全没必要开启该功能。如果服务器是一台代理服务器,建议开启该功能。
  • net.ipv4.tcp_timestamps:设置是否开启TCP时间戳功能,可选值是0或1,默认是1,表示开启时间戳功能。开启后,TCP 头部就会使用时间戳选项,便于精确计算RTT,而且还能避免出现因序列号回绕(PAWS)而引起的延迟报文生效的问题。该参数是开启tcp_tw_reuse功能的前提,在开启tcp_tw_reuse功能前,必须将tcp_timestamps设置为1
  • net.ipv4.tcp_max_tw_buckets:设置处于TIME_WAIT状态的TCP连接的最大值,默认值是5000。当系统中处于 TIME_WAIT 状态的TCP连接数超过该值时,新关闭的连接就不再经历 TIME_WAIT状态,而是直接关闭,这个方法比较暴力。
  • net.ipv4.tcp_fin_timeout:该参数用于设置2MSL时间,请参考第4章节。

9. 快速重传

参考 《TCP 核心工作机制》


  • net.ipv4.tcp_sack:设置是否开启选择性确认SACK,可选值是0或1,默认是1,表示开启SACK。
  • net.ipv4.tcp_dsack:设置是否开启D-SACK(选择性确认时标识重复收到的数据),可选值是0或1,默认是1,表示开启D-SACK。
  • net.ipv4.tcp_comp_sack_delay_ns:设置在压缩SACK报文期间,SACK报文的延迟发送时间。单位是ns(纳秒),默认值是1000000ns,也就是1ms。
  • net.ipv4.tcp_comp_sack_nr:设置压缩SACK报文的最大数量。默认值是44。

10. 拥塞控制


  •  net.ipv4.tcp_congestion_control = cubic
  • net.ipv4.tcp_allowed_congestion_control = reno cubic
  • net.ipv4.tcp_available_congestion_control = reno cubic

11. 设置缓冲区


  • tcp_wmem:设置发送缓冲区大小/范围,默认值是“4096    16384    4194304”,3个参数单位都是字节Byte。
  • tcp_rmem:设置接收缓冲区大小/范围,默认值是“4096    87380    6291456”,3个参数单位都是字节Byte。
  • tcp_mem:设置TCP缓冲区大小/范围,默认值是“42147    56197    84294”,3个参数值单位都是页面,一个页面是4kb,
  • tcp_moderate_rcvbuf:设置是否开启接收缓冲区动态调整功能,可选值是0或1,默认是1,表示开启。
  • net.ipv4.tcp_adv_win_scale = 1

相关文章:

  • 千帆起航:探索百度智能云千帆AppBuilder在AI原生应用开发中的革新之路
  • 虚拟机Windows Server 2012 与ubuntu的安装与布置
  • 【期末复习】微信小程序复习大纲( 1- 5 章)
  • C#/WPF 播放音频文件
  • R语言【base】——invisible将控制台的输出模式调整为隐藏,只允许赋值后输出,返回对象的(临时)不可见副本
  • 《Nature》预测 2024 科技大事:GPT-5预计明年发布等
  • 持续集成交付CICD:Jira 远程触发 Jenkins 实现更新 GitLab 分支
  • vue3实现本地开发使用的px转换成vw,px转换成rem方法整理
  • 基于 Flink SQL 和 Paimon 构建流式湖仓新方案
  • 深入了解 Git 分支合并冲突解决步骤
  • Http 请求体和响应体中重要的字段
  • proto与json的互相转换
  • OSI 七层参考模型及TCP/IP 四层模型
  • nosql-redis整合测试
  • 盒子 Box
  • Computed property XXX was assigned to but it has no setter
  • Java程序员幽默爆笑锦集
  • JS实现简单的MVC模式开发小游戏
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • magento 货币换算
  • Object.assign方法不能实现深复制
  • session共享问题解决方案
  • vue 配置sass、scss全局变量
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 从0到1:PostCSS 插件开发最佳实践
  • 第2章 网络文档
  • 基于HAProxy的高性能缓存服务器nuster
  • 将 Measurements 和 Units 应用到物理学
  • 用 Swift 编写面向协议的视图
  • 用jquery写贪吃蛇
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • ionic入门之数据绑定显示-1
  • Python 之网络式编程
  • 第二十章:异步和文件I/O.(二十三)
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • 树莓派用上kodexplorer也能玩成私有网盘
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (正则)提取页面里的img标签
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • .h头文件 .lib动态链接库文件 .dll 动态链接库
  • .MSSQLSERVER 导入导出 命令集--堪称经典,值得借鉴!
  • .NET CORE 3.1 集成JWT鉴权和授权2
  • .NET 中选择合适的文件打开模式(CreateNew, Create, Open, OpenOrCreate, Truncate, Append)
  • .NET/C# 解压 Zip 文件时出现异常:System.IO.InvalidDataException: 找不到中央目录结尾记录。
  • .netcore 如何获取系统中所有session_如何把百度推广中获取的线索(基木鱼,电话,百度商桥等)同步到企业微信或者企业CRM等企业营销系统中...
  • .set 数据导入matlab,设置变量导入选项 - MATLAB setvaropts - MathWorks 中国
  • [ARC066F]Contest with Drinks Hard
  • [C#]猫叫人醒老鼠跑 C#的委托及事件
  • [C++] 如何使用Visual Studio 2022 + QT6创建桌面应用
  • [C++]二叉搜索树
  • [CF407E]k-d-sequence
  • [hive]中的字段的数据类型有哪些
  • [Linux] LVS+Keepalived高可用集群部署