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

news/2024/5/17 16:56:34 标签: linux, windows, 运维, 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

http://www.niftyadmin.cn/n/5284364.html

相关文章

第一个FLink程序之wordCount

前言 前几篇内容讲解的都是环境的部署安装,下面就关于安装好的环境,开始着手程序的编写和实现。 一、Flink批处理 批处理在flink中来说操作是有界的,比如对一个文件的单词进行统计,首选的话需要创建执行环境,此处使用…

机械臂快速接触刚性环境阻抗对相互作用力的影响

当机械臂快速接触刚性环境时,阻抗对相互作用力的影响尤为显著。由于刚性环境对机械臂产生的阻力,机械臂在接触时会受到一个与运动方向相反的作用力,即接触力。阻抗参数的设置对接触力的大小具有重要影响。 一方面,阻尼参数决定了…

linux分辨率添加

手动添加分辨率 注:添加分辨率需要显卡驱动支持,若显卡驱动有问题,则不能添加 可通过 xrandr 结果判断 # xrandr 若图中第二行” eDP“ 显示为 ” default “ ,则显卡驱动加载失败,不能添加分辨率 1. 添加分辨率 # …

[动态规划] 01背包问题及其优化

题目描述 给一个能承重V的背包,和n件物品,我们用重量和价值的二元组来表示一个物品,第i件物品表示为(Vi,Wi),问:在背包不超重的情况下,得到物品的最大价值是多少&#x…

一键接入淘宝api:商品详情数据采集代码演示

以下是一段使用Python编写的简单代码,通过一键接入淘宝API来采集商品详情数据。在这个示例中,我们将使用requests库来发送HTTP请求并获取数据,使用BeautifulSoup库来解析HTML。 taobao.item_get-获得淘宝商品详情 公共参数 名称类型必须描述…

YOLOv8算法改进【NO.97】借鉴YOLOv7算法的方法添加辅助训练头

前 言 YOLO算法改进系列出到这,很多朋友问改进如何选择是最佳的,下面我就根据个人多年的写作发文章以及指导发文章的经验来看,按照优先顺序进行排序讲解YOLO算法改进方法的顺序选择。具体有需求的同学可以私信我沟通: 第一…

那些年的随笔

平安夜,没有下雪,也不冷,也没有女朋友。不知道来年是否会幸福。 单身这么多年,工作这么多年,知道了孤独,知道了辛苦,知道了人情冷暖。 我们每个人都有着自己的幸福选择。有的人追寻着此时此刻…

HarmonyOS - 基础组件绘制

文章目录 所有组件开发 tipsBlankTextImageTextInputButtonLoadingProgress 本文改编自&#xff1a;<HarmonyOS第一课>从简单的页面开始 https://developer.huawei.com/consumer/cn/training/course/slightMooc/C101667360160710997 所有组件 在 macOS 上&#xff0c;组…