[linux]常见内核TCP参数描述与配置

简介: [linux]常见内核TCP参数描述与配置

前言

所有的TCP/IP参数都位于/proc/sys/net目录下(请注意,对/proc/sys/net目录下内容的修改都是临时的,任何修改在系统重启后都会丢失),如果需要固化设置,则需要修改/etc/sysctl.conf(也可以在/etc/sysctl.d目录下新建conf文件)

sysctl命令基本使用

# 查看指定参数
sysctl net.ipv4.tcp_tw_reuse
# 查看所有内核参数
sysctl -a
# 临时修改指定内核参数
sysctl -w net.ipv4.tcp_tw_reuse=1
# 重加载 /etc/sysctl.conf文件
sysctl -p
# 重加载所有系统配置文件
sysctl --system

TIME_WAIT问题

linux系统下,TCP连接断开后,会以TIME_WAIT状态保留一定时间,然后才会释放端口。当并发请求过多的时候,就会产生大量的TIME_WAIT状态的连接。如果没有及时断开,会有大量的端口资源的服务器资源被占用。对此我们有必要调整下linux的TCP内核参数,让系统更快地释放TIME_WAIT连接。

统计TCP各种状态的数量

netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

编辑配置文件/etc/sysctl.conf,加入以下内容:

net.ipv4.tcp_syncookies= 1
net.ipv4.tcp_tw_reuse= 1
net.ipv4.tcp_tw_recycle= 1
net.ipv4.tcp_fin_timeout= 30

生效:

sysctl -p
# 如果编辑的文件在 /etc/sysctl.d/ 目录下, 需要改成使用以下命令
sysctl --system

高并发下端口配置优化

net.ipv4.tcp_keepalive_time= 1200
net.ipv4.ip_local_port_range= 1024 65535
net.ipv4.tcp_max_syn_backlog= 8192
net.ipv4.tcp_max_tw_buckets= 5000

参数说明

对于不同的linux发行版,默认值可能不一样。

net.core.somaxconn

一般情况下默认值是128,不同linux发行版可能会有区别。

该参数用于控制处于监听状态的套接字的最大连接队列长度,对于高并发的nginx服务器而言要注意调大该参数值,比如16384,32768。

net.core.xmem_default和net.core.xmem_max

参数 说明 默认值
net.core.rmem_default 系统范围接收数据的内核缓冲区初始大小 262144byte,即256KB
net.core.wmem_default 系统范围发送数据的内核缓冲区初始大小 262144byte,即256KB
net.core.rmem_max 系统范围接收数据的内核缓冲区最大大小 262144byte,即256KB
net.core.wmem_max 系统范围发送数据的内核缓冲区最大大小 262144byte,即256KB

默认值在不同的linux发行版可能会有所不同。

网络环境良好和内存资源充足的情况下,增大上述四个参数的值有助于提高并发能力,减少丢包和延迟。

网络环境较差或内存资源不足的情况下,可以考虑减小上述四个参数的值。

如果xmem_default的值大于xmem_max的值,将以xmem_max为准,且超出的部分内存将被浪费。

net.ipv4.ip_local_port_range

一般情况下默认值为32768 60999,表示本地端口范围为32768到60999,不同linux发行版可能会有所不同。

常见优化配置:net.ipv4.ip_local_port_range = 1024 65535

通过将本地端口号限制在指定的范围内,可以避免与系统或其它应用程序使用的端口号发生冲突。如果服务器上还运行了后端应用程序,注意要错开后端服务的端口号。

net.ipv4.tcp_fastopen

该参数用于启用或禁用 TCP 的快速打开(TCP Fast Open)功能。TCP 快速打开是一种优化的 TCP 握手过程,旨在减少客户端与服务器之间的往返延迟时间,从而加速连接的建立。传统的 TCP 握手过程需要三次往返(3-way handshake)才能建立连接。而 TCP 快速打开通过在初始 SYN 数据包中携带客户端发送的应用层数据,使服务器可以在接收到 SYN 数据包后直接发送 SYN+ACK 数据包,从而减少了一个往返的延迟。

net.ipv4.tcp_fastopen 参数有以下几个取值:

  • 0:表示禁用 TCP 快速打开功能。
  • 1:表示启用 TCP 快速打开功能。
  • 2:表示启用 TCP 快速打开功能,并允许客户端在第一次握手时发送数据包。

需要注意的是,启用 TCP 快速打开功能需要支持该功能的客户端和服务器。如果客户端或服务器不支持 TCP 快速打开,即使在内核中启用了该功能,TCP 连接仍然会回退到传统的三次握手过程。对于linux服务器,内核版本应高于3.7。

net.ipv4.tcp_fin_timeout

一般情况下默认值为60,单位秒,不同linux发行版可能会有所不同。

用于控制TCP/IP协议栈中的FIN-WAIT-2状态的超时时间。

在TCP协议中,当一段的连接主动关闭后,会进入FIN-WAIT-2状态,等待对方的确认,以确保双方都完成了连接关闭。当FIN-WAIT-2状态持续超过该参数值是,连接会被内核强制关闭,这对于释放系统资源,提高连接处理能力非常重要。

较小的参数值可以更快地释放系统资源,但可能导致一些连接在网络不稳定的情况下被错误地关闭。

net.ipv4.tcp_keepalive_time

一般情况下默认值为7200,单位秒,不同linux发行版可能会有所不同。

该参数用于控制TCP/IP协议栈中的 TCP keepalive 检测时间间隔。TCP keepalive是一种机制,用于检测处于空闲状态的连接是否仍然有效。当一段时间内没有数据传输时,TCP Keepalive会发送一些特定的探测报文到对方,以确认连接的状态。这对于检测死连接、清理空闲连接和提高连接可靠性很重要。

如果该参数值默认2小时,如果修改为很小的值,将会带来频繁的keepalive检测,这会增加网络流量和系统负载,不必要的连接也可能被中断。同时也会增加系统安全问题,攻击者可以利用Keepalive探测报文进行DoS攻击或网络扫描。

net.ipv4.tcp_max_tw_buckets

不同linux发行版可能会有所不同,可能是65536或180000。

该参数用于控制 TIME_WAIT 状态的 TCP 连接的最大数量。当TIME_WAIT数超过该参数值,新的连接请求可能会被丢弃或拒绝。

较小的值会加快清理TIME_WAIT,但可能会有连接异常。一般情况下默认即可,根据实际情况可以考虑减少或增多。

net.ipv4.tcp_max_syn_backlog

一般情况下默认值为1024,不同linux发行版可能会有所不同。

该参数用于控制TCP/IP协议栈中SYN队列的最大长度。在 TCP 握手过程中,当客户端发送 SYN 报文请求建立连接时,服务器端会将这些 SYN 请求放入 SYN 队列中等待处理。net.ipv4.tcp_max_syn_backlog 参数指定了 SYN 队列的最大长度,即能够同时等待处理的 SYN 请求的最大数量。较小的 net.ipv4.tcp_max_syn_backlog 值可能会导致 SYN 队列溢出,从而无法处理所有的连接请求。这可能会导致客户端无法成功建立连接,出现连接超时或连接被拒绝的情况。

net.ipv4.tcp_syncookies

一般情况下默认为0,表示关闭,不同linux发行版可能会有所不同。置为1表示开启。

表示开启SYNCookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击。

当系统遭受SYN Flood攻击时,攻击者会发送大量的TCP SYN请求,消耗服务器资源并导致服务不可用。

启用SYN Cookie机制后,当服务器接收到一个新的 TCP SYN 请求时,会根据该请求生成一个 SYN Cookie,并将 SYN Cookie 发送回给客户端。客户端在后续的请求中需要携带该 SYN Cookie。服务器在收到后续请求时,会验证 SYN Cookie 的合法性,并根据其中的信息还原出原始的 SYN 请求。

通过使用 SYN Cookie 机制,服务器可以在不消耗太多资源的情况下抵御 SYN Flood 攻击,确保系统的稳定性和可用性。

启用 SYN Cookie 机制也可能带来一些问题,一些网络设备可能无法正确处理SYN Cookie的连接请求,导致连接无法建立或其它问题。

net.ipv4.tcp_synack_retries

一般情况下默认为5,不同linux发行版可能会有所不同。

该参数用于设置在连接建立过程中,发送 SYN-ACK(同步应答)包后等待客户端 ACK(确认应答)包的最大重试次数。

在 TCP 连接的三次握手过程中,服务器收到客户端的 SYN(同步)包后,会回复一个 SYN-ACK 包作为应答。然后服务器等待客户端发送 ACK 包来确认连接的建立。如果服务器在等待期间未收到 ACK 包,它将重试发送 SYN-ACK 包,重试次数由 net.ipv4.tcp_synack_retries 参数确定。

网络环境糟糕的情况下可以考虑增加参数值,以允许更多的重试次数,增加连接建立的成功率。

减小参数值有助于快速建立连接和减少资源占用。

net.ipv4.tcp_syn_retries

一般情况下默认为6,不同linux发行版可能会有所不同。

该参数用于设置在连接建立过程中,发送 SYN(同步)包后等待对方响应的最大重试次数。当客户端发送 SYN 包后,如果没有收到服务器的 SYN-ACK(同步应答)包,客户端会重试发送 SYN 包,重试次数由 net.ipv4.tcp_syn_retries 参数确定。

net.ipv4.tcp_timestamps

一般情况下默认为1,表示开启,不同linux发行版可能会有所不同。置为0表示关闭。

启用后允许在TCP报文中添加时间戳信息,用于测量报文的往返时间(RTT)和计算报文的时序。

net.ipv4.tcp_tw_reuse

一般情况下默认为0,表示关闭,不同linux发行版可能会有所不同。置为1表示开启。

允许重用TIME_WAIT Socket,也就是可以重用TIME_WAIT占用的端口。

启用net.ipv4.tcp_tw_reuse也可能带来一些问题。例如,如果处于TIME_WAIT连接上仍然存在未完全处理的数据包,重用该端口可能导致数据包被传递到错误的连接上,从而导致数据错乱或安全问题。

net.ipv4.tcp_tw_recycle

一般情况下默认为0,表示关闭,不同linux发行版可能会有所不同。置为1表示开启。

启用快速回收TIME_WAIT Socket,内核根据一定规则释放TIME_WAIT的端口资源。具体的回收规则可以根据net.ipv4.tcp_timestamps参数和其它相关参数进行调整。

当多个客户端位于同一个NAT网络后面时,启用快速回收可能导致来自不同客户端的连接被错误服用,导致数据错乱或安全问题。

net.ipv4.tcp_rmem和net.ipv4.tcp_wmem

用于设置tcp接收缓冲区和发送缓冲区的大小,有三个值组成,分别是最小值、默认值和最大值。类似于net.core.xmem_default和net.core.xmem_max。不过net.core是系统全局参数,适用于所有类型的socket,包括tcp和udp。

参考

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
2月前
|
监控 Linux 开发者
理解Linux操作系统内核中物理设备驱动(phy driver)的功能。
综合来看,物理设备驱动在Linux系统中的作用是至关重要的,它通过与硬件设备的紧密配合,为上层应用提供稳定可靠的通信基础设施。开发一款优秀的物理设备驱动需要开发者具备深厚的硬件知识、熟练的编程技能以及对Linux内核架构的深入理解,以确保驱动程序能在不同的硬件平台和网络条件下都能提供最优的性能。
137 0
|
5月前
|
并行计算 Linux
Linux内核中的线程和进程实现详解
了解进程和线程如何工作,可以帮助我们更好地编写程序,充分利用多核CPU,实现并行计算,提高系统的响应速度和计算效能。记住,适当平衡进程和线程的使用,既要拥有独立空间的'兄弟',也需要在'家庭'中分享和并行的成员。对于这个世界,现在,你应该有一个全新的认识。
241 67
|
4月前
|
安全 Linux
Slax Linux如何获取增强的会话管理与启动参数选项
以上就是关于在Slax Linux中获取增强的会话管理与启动参数选项的全过程。虽然在这个过程中可能会遇到暗礁和风浪,但只要我们用心驾驶,总能找到前行的道路。在旅程中,记得享受这中间的点点滴滴,因为这些都是你成长的痕迹。祝你在这片“数码海洋”中一帆风顺!
92 26
|
4月前
|
关系型数据库 MySQL Java
安装和配置JDK、Tomcat、MySQL环境,以及如何在Linux下更改后端端口。
遵循这些步骤,你可以顺利完成JDK、Tomcat、MySQL环境的安装和配置,并在Linux下更改后端端口。祝你顺利!
331 11
|
5月前
|
Linux Shell
shell_42:Linux参数移动
总的来说,参数移动是Linux shell脚本中的一个重要概念,掌握它可以帮助我们更好地处理和管理脚本中的参数。希望这个解释能帮助你理解和使用参数移动。
87 18
|
3月前
|
存储 负载均衡 算法
Linux2.6内核进程调度队列
本篇文章是Linux进程系列中的最后一篇文章,本来是想放在上一篇文章的结尾的,但是想了想还是单独写一篇文章吧,虽然说这部分内容是比较难的,所有一般来说是简单的提及带过的,但是为了让大家对进程有更深的理解与认识,还是看了一些别人的文章,然后学习了学习,然后对此做了总结,尽可能详细的介绍明白。最后推荐一篇文章Linux的进程优先级 NI 和 PR - 简书。
106 0
|
3月前
|
Linux 网络安全 开发工具
在Linux下配置gitee与Github的远程仓库
注意,git push后,是输入你的账号与密码。这个步骤可以通过特殊设置省去,但是一开始还是不要太省。
169 0
|
5月前
|
存储 Linux
Linux内核中的current机制解析
总的来说,current机制是Linux内核中进程管理的基础,它通过获取当前进程的task_struct结构的地址,可以方便地获取和修改进程的信息。这个机制在内核中的使用非常广泛,对于理解Linux内核的工作原理有着重要的意义。
228 11
|
2月前
|
监控 Linux 网络安全
Linux命令大全:从入门到精通
日常使用的linux命令整理
641 14
|
3月前
|
Linux 网络安全 数据安全/隐私保护
使用Linux系统的mount命令挂载远程服务器的文件夹。
如此一来,你就完成了一次从你的Linux发车站到远程服务器文件夹的有趣旅行。在这个技术之旅中,你既探索了新地方,也学到了如何桥接不同系统之间的距离。
483 21