【DevOps】Linux 内核网络子系统全面指南与性能调优

目录

一、Linux 内核网络子系统

1. Netfilter

主要特性

工作流程

2. Traffic Control (TC)

主要特性

工作流程

3. Socket

主要特性

工作流程

二、内核参数优化

1. net.ipv4.tcp_window_scaling

2. net.core.netdev_max_backlog

3. net.ipv4.tcp_rmem 和 net.ipv4.tcp_wmem

4. net.ipv4.tcp_fin_timeout

5. net.core.rmem_default 和 net.core.wmem_default

一、Linux 内核网络子系统

Linux 内核的网络子系统是其架构中非常复杂和强大的部分,负责处理所有网络相关的操作。这些操作包括数据包过滤、地址转换、流量控制、服务质量保证,以及为应用程序提供网络通信的接口。下面我们详细介绍几个关键的网络子系统:Netfilter、Traffic Control 和 Socket。

1. Netfilter

Netfilter 是 Linux 内核中一个非常重要的网络子系统,主要用于在内核中实现包过滤、网络地址转换 (NAT) 和其他网络相关的钩子功能。Netfilter 提供了一系列的钩子(hook),这些钩子位于网络协议栈的不同位置,可以捕获网络协议栈中的数据包,进行处理或决定数据包的去向。

主要特性
  • 数据包过滤:Netfilter 通过与 iptables(在较新的内核中是 nftables)的配合,可以实现包括但不限于 IP 地址、端口号、协议类型等条件的数据包过滤。

  • 网络地址转换 (NAT):Netfilter 支持源 NAT (SNAT)、目的 NAT (DNAT) 和端口映射,这对于路由器和防火墙的功能是非常关键的。

  • 状态跟踪:Netfilter 可以跟踪每个网络连接的状态,这使得它可以识别和处理每个连接的数据包,如区分新连接、已建立的连接和结束的连接。

  • 用户空间通信:Netfilter 可以通过 nfnetlink 与用户空间程序通信,允许用户空间程序动态地更改过滤规则或收集网络状态信息。

工作流程

Netfilter 提供了五个主要的钩子点,它们位于网络协议栈的不同层次:

  1. NF_IP_PRE_ROUTING:在路由决策之前,对进入的数据包进行处理。
  2. NF_IP_LOCAL_IN:在确定数据包目的地为本机后进行处理。
  3. NF_IP_FORWARD:在进行路由转发决策后,对需要转发的数据包进行处理。
  4. NF_IP_LOCAL_OUT:在本机产生的数据包即将发送出去前进行处理。
  5. NF_IP_POST_ROUTING:在数据包即将离开网卡前进行处理。

2. Traffic Control (TC)

Traffic Control (TC) 是 Linux 内核的另一个网络子系统,用于实现网络流量控制和服务质量(QoS)。TC 允许 Linux 内核对网络接口的数据包发送队列进行控制,包括带宽限制、延迟管理和数据包排队策略。

主要特性
  • 带宽管理:通过诸如令牌桶过滤器 (TBF)、随机早期检测 (RED) 等机制,控制数据流的速率。

  • 排队策略:包括 FIFO、Stochastic Fairness Queueing (SFQ)、Hierarchical Token Bucket (HTB) 等,用于控制数据包的发送顺序和方式。

  • 分类:TC 使用分类器将数据包分流到不同的类和队列,允许对不同类型的流量实施不同的控制策略。

  • 过滤:通过过滤器确定数据包属于哪个类,过滤器可以基于多种条件,如协议、端口号、IP 地址等。

工作流程
  1. 分类:数据包首先通过分类器进行分类,判定进入哪个类。
  2. 排队:每个类有自己的队列,数据包按照策略进入相应的队列。
  3. 调度:调度器根据策略从队列中取出数据包发送。

3. Socket

Socket 是 Linux 内核提供的用于网络通信的基本接口,属于网络子系统中的应用层接口部分。Socket 抽象了网络通信的细节,使应用程序可以通过标准的接口发送和接收数据,而无需关心底层网络协议的具体实现。

主要特性
  • 多种类型:支持多种类型的 Socket,包括流式套接字 (SOCK_STREAM)、数据报套接字 (SOCK_DGRAM) 和原始套接字 (SOCK_RAW)。

  • 多种协议:支持多种网络协议,如 IPv4、IPv6、TCP、UDP 等。

  • 阻塞与非阻塞操作:Socket 可以在阻塞模式和非阻塞模式下工作,允许应用根据需要选择合适的工作方式。

  • 安全特性:支持通过 SSL/TLS 等协议提供加密通信。

工作流程
  1. 创建 Socket:应用程序通过 socket() 系统调用创建一个 Socket。
  2. 配置 Socket:通过各种系统调用 (如 bind()listen()connect()) 配置 Socket 的属性和行为。
  3. 数据传输:使用 send() 和 recv() (或 write() 和 read()) 系统调用进行数据的发送和接收。
  4. 关闭 Socket:通过 close() 系统调用关闭 Socket。

这些子系统合作,形成了 Linux 内核中强大而灵活的网络功能,支持从简单的数据传输到复杂的网络应用。

二、内核参数优化

在 Linux 系统中,通过调整内核参数来优化网络性能是一种常见且有效的方法。内核参数可以控制 TCP/IP 栈和其他网络子系统的行为,从而改善网络吞吐量、降低延迟、增加连接的稳定性和响应速度。下面是对您提到的两个参数的详细介绍,以及其他一些常用的内核参数和它们的优化作用。

1. net.ipv4.tcp_window_scaling

  • 参数说明net.ipv4.tcp_window_scaling 是一个布尔值参数,用于启用或禁用 TCP 窗口缩放功能。

  • 作用:TCP 窗口缩放是一种机制,允许 TCP 连接动态调整其接收窗口大小,从而适应不同的网络延迟和带宽条件。这个功能在高延迟或高带宽的网络环境(如卫星通信、长距离光纤连接)中尤其重要,可以显著提高数据传输效率。

  • 默认值:通常默认为 1(启用)。

  • 调整建议

    • 在网络环境稳定且网络延迟较低的局域网环境中,这个选项的效果不明显,但在宽带较大的网络中,启用窗口缩放可以提高传输性能。
    • 如果要启用 TCP 窗口缩放,确保 sysctl 设置为 net.ipv4.tcp_window_scaling = 1

2. net.core.netdev_max_backlog

  • 参数说明net.core.netdev_max_backlog 设置了在内核处理之前,网络设备驱动能够队列的接收包的最大数量。

  • 作用:这个参数决定了网络设备接收队列的最大长度,对于高速网络或是在突发大量网络请求时,增加这个参数的值可以减少因队列溢出而导致的丢包,从而提高网络性能。

  • 默认值:默认值可能在 1000 左右,具体值依据不同的内核和系统配置而变化。

  • 调整建议

    • 在高速网络环境中或大量并发连接的服务器上,可以适当增加这个值,例如设置为 2000 或更高,如 3000
    • 修改方式:sysctl -w net.core.netdev_max_backlog=2000 或通过编辑 /etc/sysctl.conf 文件添加 net.core.netdev_max_backlog = 2000 并重新加载配置 sysctl -p

3. net.ipv4.tcp_rmem 和 net.ipv4.tcp_wmem

  • 参数说明

    • net.ipv4.tcp_rmem:这个参数控制 TCP 接收缓冲区的最小值、默认值和最大值,单位是字节。
    • net.ipv4.tcp_wmem:这个参数控制 TCP 发送缓冲区的最小值、默认值和最大值,单位是字节。
  • 作用:调整这些参数可以优化 TCP 的缓冲区大小,适应不同的网络环境,特别是在高带宽和高延迟的网络中,增大这些值可以提高网络性能。

  • 默认值:通常形式为 4096 87380 6291456

  • 调整建议

    • 对于高性能服务器,可以将这些值调整为更大,例如 4096 65536 16777216(对应最小、默认、最大)。
    • 修改方式:
      sysctl -w net.ipv4.tcp_rmem="4096 65536 16777216"
      sysctl -w net.ipv4.tcp_wmem="4096 65536 16777216"
      

4. net.ipv4.tcp_fin_timeout

  • 参数说明net.ipv4.tcp_fin_timeout 指定了等待一个 TCP 连接完全终止前的超时时间,单位是秒。

  • 作用:这个参数影响 TIME-WAIT 状态的持续时间。减少这个值可以快速回收套接字,但是太小可能导致旧的重复数据段出现在新的连接中。

  • 默认值:通常默认为 60 秒。

  • 调整建议

    • 对于处理大量短连接的服务器,可以适当减少这个值,例如设置为 30 或更低,如 15
    • 修改方式:sysctl -w net.ipv4.tcp_fin_timeout=30

5. net.core.rmem_default 和 net.core.wmem_default

  • 参数说明

    • net.core.rmem_default:指定接收套接字缓冲区的默认大小(字节)。
    • net.core.wmem_default:指定发送套接字缓冲区的默认大小(字节)。
  • 作用:这些参数控制非 TCP 套接字的默认缓冲区大小,对于 UDP 通信等场景下,增大这些值可以提高性能。

  • 默认值:通常为 212992

  • 调整建议

    • 对于需要大量 UDP 通信的应用,可以增加这些值,如设置为 262144 或更大。
    • 修改方式:
      sysctl -w net.core.rmem_default=262144
      sysctl -w net.core.wmem_default=262144
      

通过合理调整这些参数,可以显著提高 Linux 系统的网络性能,尤其是在高负载、高并发的网络服务器环境中。每一次调整后,都应该进行充分的测试,以确保新的配置不仅提升了性能,而且保持了系统的稳定性和可靠性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/10097.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第33次CSP认证Q1:词频统计

🍄题目描述 在学习了文本处理后,小 P 对英语书中的 𝑛n 篇文章进行了初步整理。 具体来说,小 P 将所有的英文单词都转化为了整数编号。假设这 𝑛n 篇文章中共出现了 𝑚m 个不同的单词,则把它们…

网络编程套接字 (二)---udosocket

本专栏内容为:Linux学习专栏,分为系统和网络两部分。 通过本专栏的深入学习,你可以了解并掌握Linux。 💓博主csdn个人主页:小小unicorn ⏩专栏分类:网络 🚚代码仓库:小小unicorn的代…

C++学习第二十九课:C++ 输入输出流详解:从基础到高级应用

在 C 中,流(stream)是一种用于实现输入输出操作的抽象概念。流可以看作是字节的流动,这些字节可以从一个地方流向另一个地方,例如从键盘输入到程序中,或者从程序输出到屏幕。C 提供了一套完整的流库来处理各…

Qt中正则表达式的用法

一.基本功能介绍: 在Qt中,可以使用QRegularExpression类来处理正则表达式。以下是一些常用的正则表达式用法: 1.创建正则表达式对象: QRegularExpression regex("pattern"); 2.匹配字符串: QString str …

LeetCode 2960.统计已测试设备:看测试了多少次

【LetMeFly】2960.统计已测试设备:看测试了多少次 力扣题目链接:https://leetcode.cn/problems/count-tested-devices-after-test-operations/ 给你一个长度为 n 、下标从 0 开始的整数数组 batteryPercentages ,表示 n 个设备的电池百分比…

【QEMU系统分析之实例篇(十七)】

系列文章目录 第十七章 QEMU系统仿真的机器创建分析实例 文章目录 系列文章目录第十七章 QEMU系统仿真的机器创建分析实例 前言一、QEMU是什么?二、QEMU系统仿真的机器创建分析实例1.系统仿真的命令行参数2.配置加速器configure_accelerators()do_configure_icount…

蓝桥杯13届JAVA A组 国赛

​​​​​​​ package 蓝桥杯国赛; // 贪心选个数最少的进行摆 // 2:1 ,3:1, 4:1,5 : 3,6:3,7:1 // 选 1,7,4,2,3,5,9 // 然后都选满10个 public class 火彩棒数字 {public static void main(String[] a…

【CTFHub】HTTP 请求方式 302跳转 cookie WP

1.请求方式 打开给出的URL进入一个页面,提示原方法是GET,用CTFHUB方法就能获得flag 思路:抓包,将GET方法改成CTFHUB方法进行重新发送请求,查看响应情况 1.打开代理服务器 2.打开BurpSuite 刷新页面获得拦截 3.发送…

【Excel VBA】深入理解 VBA 中的 CallByName 函数

动态调用方法与属性:深入理解 VBA 中的 CallByName 函数 昨天在介绍Choose函数在复杂的VBA应用程序开发中,有时我们需要根据运行时的情况来决定调用哪个对象的哪个方法或属性。这种灵活性可以通过 CallByName 函数实现。在本篇博客中,田辛老…

网络Http和Socket通讯(基于面试)

每日一句:想得到世上最好的东西,先得让世界看到最好的你 目录 面试问OSI或TCP/IP,怎么回答? 面试问HTTP? 面试问Get类型,Pot类型区别? 面试什么是Socket套接字? 面试问什么是数据粘包&…

qt for android 的架构原理

qt for android实现架构,分享这几幅很不错图。来自于 《Qt 林斌:整合Android IVI平台打造统一的Qt数字座舱体验》 1.实现架构图 2.qt for android能力 3.java 和 qt混合开发 4. AutoMotive

46寸硅片为什么要留平边(flat)?

知 识星球(星球名: 芯片制造与封测社区,星球号: 63559049)里的学员问: 2, 4, 6寸硅片都有 平 边,它们有什么作用 ? 硅片的平边(Flat&…

经典权限五张表案例分析

文章目录 模块分析模块分析 描述五张表的关系重要知识讲解抽取成一个BaseServletSpringIOC思想(底层)实现代码IOC概述 SPI机制(为学习框架做思想和技术铺垫)SPI引入1. 标准/规范2. 具体的实现3. 调用 SPI介绍SPI练习JDBC4.0免注册驱动原理Servlet实现方式三 ServletContainerIn…

idea使用前的全局配置,一次配置,多次使用

前提:每次导入一个新的项目,就需要重新设置编码、maven、jdk、git版本等信息。实际每个项目所用到的配置信息是一致的,除非换一家公司,不然不会改动到这些内容。 idea版本:2024.1.1 1.1、全局Maven配置 IDEA启动页面…

微火一文盘点:为何全域运营系统会成为创业新风口?

当前,微火全域运营已经成为创业的新风口,想要做微火全域运营服务商的创业者数量日益增多。据目前了解到的最新消息,微火全域运营系统的市场占有率已经超过了48%,并且还在持续不断地上涨中。 所谓微火全域运营系统,就是…

InLine Chat功能优化对标Github Copilot,CodeGeeX带来更高效、更直观的编程体验!

VSCode中的CodeGeeX 插件上线InLine Chat功能后,收到不少用户的反馈,大家对行内交互编程这一功能非常感兴趣。近期我们针对这个功能再次进行了深度优化,今天详细介绍已经在VSCode插件v2.8.0版本上线的 CodeGeeX InLine Chat功能,以…

蓝桥杯成绩已出

蓝桥杯的成绩早就已经出来了,虽然没有十分惊艳 ,但是对于最终的结果我是心满意足的,感谢各位的陪伴,关于蓝桥杯的刷题笔记我已经坚持更新了49篇,但是现在即将会告别一段落,人生即将进入下一个规划。我们一起…

Spring框架学习笔记(一):Spring基本介绍(包含IOC容器底层结构)

1 官方资料 1.1 官网 https://spring.io/ 1.2 进入 Spring5 下拉 projects, 进入 Spring Framework 进入 Spring5 的 github 1.3 在maven项目中导入依赖 <dependencies><!--加入spring开发的基本包--><dependency><groupId>org.springframework<…

jni 返回二维byte数组

在JNI中返回二维byte数组&#xff0c;你需要在Java中准备一个相应的二维数组来接收这个返回值。在JNI层面&#xff0c;你可以创建一个二维的byte数组&#xff0c;并使用GetByteArrayRegion和SetByteArrayRegion来操作它。 以下是一个简单的例子&#xff1a; public class Jni…

基于STC12C5A60S2系列1T 8051单片机实现一主单片机与一从单片机进行双向串口通信功能

基于STC12C5A60S2系列1T 8051单片机实现一主单片机与一从单片机进行双向串口通信功能 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机串口通信介绍STC12C5A60S2系列1T 8051单片机串口通信的结构基于STC12C5A60S2系列1T 8051单片机串口通信的特殊功能寄存器…