Linux TCP 内核参数详解与设置建议
以下参数为系统级 TCP 内核参数,通常无需修改,使用默认值即可。仅在特定场景(如高并发服务器、NAT网关、遭受特定攻击)下,才需要根据实际情况进行调整。
连接建立与重试相关
tcp_syn_retries (INTEGER)
默认值:5
说明:对于一个主动发起的连接(客户端),内核在放弃前发送 SYN 包的重试次数。不应大于 255。默认值 5 对应约 180 秒。对于负载高且网络状况良好的环境,可考虑降低为 2 以加快连接失败感知。
tcp_synack_retries (INTEGER)
默认值:5
说明:对于接收到的连接请求(服务端),内核发送 SYN+ACK 包以完成三次握手的重试次数。不应大于 255。其值可参考 tcp_syn_retries 进行调整。
tcp_max_syn_backlog (INTEGER)
默认值:1024 (内存 > 128MB 的系统)
说明:半连接队列(SYN_RECV 状态)的最大长度。若服务器常出现过载或遭受 SYN Flood 攻击,可适当增大此值。注意:若设置大于 1024,可能需要同步调整内核源码中的 TCP_SYNQ_HSIZE 宏定义。
连接保活与超时相关
tcp_keepalive_time (INTEGER)
默认值:7200 (2小时)
说明:当 SO_KEEPALIVE 套接字选项启用时,TCP 发送首个保活探测报文前的空闲时间。为防范空连接攻击,在 NAT 或 Web 服务器场景下,常调整为 1800(30分钟)或更小。
tcp_keepalive_intvl (INTEGER)
默认值:75
说明:保活探测报文发送的时间间隔。
tcp_keepalive_probes (INTEGER)
默认值:9
说明:在认定连接已失效前,发送保活探测报文的最大次数。结合以上两个参数,总探测时长约为 tcp_keepalive_time + tcp_keepalive_intvl * tcp_keepalive_probes。
tcp_fin_timeout (INTEGER)
默认值:60
说明:本端主动关闭连接后,进入 FIN-WAIT-2 状态的最大保持时间。对于高并发服务器,降低此值(如 30)有助于更快释放资源,但需注意可能影响某些长延迟网络中的连接正常关闭。
TIME-WAIT 状态相关
tcp_tw_reuse (BOOLEAN)
默认值:0
说明:是否允许将处于 TIME-WAIT 状态的套接字重新用于新的出向 TCP 连接。对于需要快速重启并绑定相同端口(避免“地址已在使用”错误)的服务可能有帮助。
tcp_tw_recycle (BOOLEAN)
默认值:0
说明:启用快速的 TIME-WAIT 状态套接字回收。此参数在 NAT 环境下曾被认为有益,但在现代 Linux 内核(4.12+)中已被移除,且因其基于时间戳的机制可能导致 NAT 后方客户端连接问题,强烈不建议启用。
tcp_max_tw_buckets (INTEGER)
默认值:180000
说明:系统同时允许存在的 TIME-WAIT 套接字最大数量。超过此限制时,新的 TIME-WAIT 套接字会被立即销毁。此参数主要用于防范简单的 DoS 攻击,不应随意降低。在作为 NAT 网关或代理服务器时,若 TIME-WAIT 连接数确实很高,可适当增加此值。
拥塞控制与性能优化
tcp_sack (BOOLEAN)
默认值:1
说明:启用选择性确认(Selective Acknowledgment),有助于从多个报文丢失中快速恢复,提升吞吐量,但会略微增加 CPU 开销。建议在广域网环境中保持开启。
tcp_timestamps (BOOLEAN)
默认值:1
说明:启用 TCP 时间戳选项。这对于精确计算 RTT(往返时间)、防止序列号回绕以及 PAWS(保护防止旧的重复报文段)机制至关重要。除非在特定异构网络环境中遇到兼容性问题,否则应保持开启。注意: tcp_tw_recycle 依赖于此选项。
tcp_window_scaling (BOOLEAN)
默认值:1
说明:启用 TCP 窗口缩放选项,允许窗口大小超过 65535 字节,对于高速网络(如千兆、万兆)至关重要。在低速或局域网环境中,关闭它可能减少开销,但通常建议保持开启。
缓冲区大小调整
tcp_wmem (3个 INTEGER: min, default, max)
默认值:4096 16384 4194304 (或 131072,取决于内核版本)
说明:为 TCP 套接字发送缓冲区预留的内存大小(字节)。max 值不影响全局 net.core.wmem_max。高吞吐服务器可适当增加,例如 4096 16384 4194304。
tcp_rmem (3个 INTEGER: min, default, max)
默认值:4096 87380 4194304 (或 6291456,取决于内核版本)
说明:为 TCP 套接字接收缓冲区预留的内存大小(字节)。max 值通常建议为 default 的两倍或更大,以适应高带宽延迟积(BDP)网络。
tcp_mem (3个 INTEGER: low, pressure, high)
说明:控制 TCP 整体内存使用(页面单位)。通常系统会自动计算,仅在特殊情况下需要手动调整。
安全与DoS攻击防护
tcp_syncookies (BOOLEAN)
默认值:1 (多数现代发行版默认开启)
说明:当半连接队列溢出时,启用 SYN Cookie 来抵御 SYN Flood 攻击。对于未遭受攻击的高负载服务器,应优先考虑调整 tcp_max_syn_backlog 等参数来提升性能,而非依赖 syncookies,因为其违背了 TCP 协议并可能影响某些高级功能(如窗口缩放)。仅在检测到 SYN Flood 攻击时临时启用。
tcp_abort_on_overflow (BOOLEAN)
默认值:0
说明:当全连接队列(accept queue)溢出时,是否直接发送 RST 复位连接。设置为 1 可让客户端快速失败,给予服务端处理现有连接缓冲的机会,但可能导致合法的连接被意外拒绝。需谨慎评估后启用。
tcp_max_orphans (INTEGER)
默认值:8192
说明:系统能管理的、不属于任何进程的 TCP 套接字(孤儿连接)最大数量。超过此值,新的孤儿连接会被重置。主要用于防范 DoS 攻击,不应依赖或随意降低。
常见场景配置示例
针对 SYN Flood 攻击的临时加固
# 启用 SYN Cookie(临时措施)
sysctl -w net.ipv4.tcp_syncookies=1
# 增大半连接队列
sysctl -w net.ipv4.tcp_max_syn_backlog=2048
# 减少 SYN+ACK 重试次数,加速失败
sysctl -w net.ipv4.tcp_synack_retries=2
# 减少主动 SYN 重试次数
sysctl -w net.ipv4.tcp_syn_retries=2
高并发服务器优化(需结合应用测试)
# 允许 TIME-WAIT 套接字重用(仅对出向连接有效)
sysctl -w net.ipv4.tcp_tw_reuse=1
# 调整保活参数,更快释放无效连接
sysctl -w net.ipv4.tcp_keepalive_time=600
sysctl -w net.ipv4.tcp_keepalive_intvl=30
sysctl -w net.ipv4.tcp_keepalive_probes=3
# 缩短 FIN-WAIT-2 状态超时
sysctl -w net.ipv4.tcp_fin_timeout=30
# 增加本地端口范围
sysctl -w net.ipv4.ip_local_port_range="1024 65535"
# 调整缓冲区大小(根据内存和网络调整)
sysctl -w net.ipv4.tcp_rmem="4096 87380 6291456"
sysctl -w net.ipv4.tcp_wmem="4096 16384 4194304"
重要提示:
- 所有修改可通过
sysctl -w 参数=值临时生效,或写入/etc/sysctl.conf文件后执行sysctl -p永久生效。 - 调整前请充分理解参数含义,并在测试环境验证。
tcp_tw_recycle参数在现代内核中已废弃且有害,切勿启用。- 性能优化没有银弹,需结合监控数据(如
ss -s,netstat -s)和应用特点进行针对性调整。