Linux 性能优化实战
倪朋飞
资深 Linux 专家,Kubernetes 项目维护者
87257 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 65 讲
结束语 (1讲)
Linux 性能优化实战
15
15
1.0x
00:00/00:00
登录|注册

33 | 关于 Linux 网络,你必须知道这些(上)

思考
Linux网络收发流程
Linux网络栈
TCP/IP网络模型
OSI网络模型
Linux网络工作原理

该思维导图由 AI 生成,仅供参考

你好,我是倪朋飞。
前几节,我们一起学习了文件系统和磁盘 I/O 的工作原理,以及相应的性能分析和优化方法。接下来,我们将进入下一个重要模块—— Linux 的网络子系统。
由于网络处理的流程最复杂,跟我们前面讲到的进程调度、中断处理、内存管理以及 I/O 等都密不可分,所以,我把网络模块作为最后一个资源模块来讲解。
同 CPU、内存以及 I/O 一样,网络也是 Linux 系统最核心的功能。网络是一种把不同计算机或网络设备连接到一起的技术,它本质上是一种进程间通信方式,特别是跨系统的进程间通信,必须要通过网络才能进行。随着高并发、分布式、云计算、微服务等技术的普及,网络的性能也变得越来越重要。
那么,Linux 网络又是怎么工作的呢?又有哪些指标衡量网络的性能呢?接下来的两篇文章,我将带你一起学习 Linux 网络的工作原理和性能指标。

网络模型

说到网络,我想你肯定经常提起七层负载均衡、四层负载均衡,或者三层设备、二层设备等等。那么,这里说的二层、三层、四层、七层又都是什么意思呢?
实际上,这些层都来自国际标准化组织制定的开放式系统互联通信参考模型(Open System Interconnection Reference Model),简称为 OSI 网络模型。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入介绍了Linux网络的工作原理和性能指标。首先,作者解释了OSI网络模型和TCP/IP网络模型的关系,以及TCP/IP模型的四层结构。随后,详细解释了Linux通用IP网络栈的结构,包括应用程序、套接字、传输层、网络层、网络接口层和网卡驱动程序等组成部分。文章还阐述了Linux网络包的接收流程,包括网卡接收网络帧、中断处理程序分配内核数据结构、协议栈逐层处理网络帧等过程。另外,还介绍了网络包的发送流程,从应用程序调用Socket API发送网络包到驱动程序通过DMA发送网络帧。最后,鼓励读者思考自己对Linux网络的理解以及如何分析网络性能瓶颈。整体而言,本文对于想要深入了解Linux网络的读者具有很高的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Linux 性能优化实战》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(41)

  • 最新
  • 精选
  • 渡渡鸟_linux
    我结合网络上查阅的资料和文章中的内容,总结了下网卡收发报文的过程,不知道是否正确: 1. 内核分配一个主内存地址段(DMA缓冲区),网卡设备可以在DMA缓冲区中读写数据 2. 当来了一个网络包,网卡将网络包写入DMA缓冲区,写完后通知CPU产生硬中断 3. 硬中断处理程序锁定当前DMA缓冲区,然后将网络包拷贝到另一块内存区,清空并解锁当前DMA缓冲区,然后通知软中断去处理网络包。 ----- 当发送数据包时,与上述相反。链路层将数据包封装完毕后,放入网卡的DMA缓冲区,并调用系统硬中断,通知网卡从缓冲区读取并发送数据。

    作者回复: 对的

    2019-03-07
    9
    94
  • 安排
    当一个网络帧到达网卡后,网卡会通过 DMA 方式,把这个网络包放到收包队列中;然后通过硬中断,告诉中断处理程序已经收到了网络包。 接着,网卡中断处理程序会为网络帧分配内核数据结构(sk_buff),并将其拷贝到 sk_buff 缓冲区中;然后再通过软中断,通知内核收到了新的网络帧。 接下来,内核协议栈从缓冲区中取出网络帧,并通过网络协议栈,从下到上逐层处理这个网络帧。 老师你好,上面的一段话有些疑问想请教一下。 收包队列是属于哪里的存储空间,是属于物理内存吗,还是网卡中的存储空间,通过dma方式把数据放到收包队列,我猜这个收包队列是物理内存中的空间。这个收包队列是由内核管理的吧,也就是跟某一个进程的用户空间地址没关系? 那sk_buf缓冲区又是哪里的存储空间,为什么还要把收包队列拷贝到这个缓冲区呢,这个缓冲区是协议栈维护的吗?也属于内核,跟进程的用户空间地址有关系吗? socket的接收发送缓冲区是映射到进程的用户空间地址的吗?还是由协议栈为每个socket在内核中维护的缓冲区? 还有上面说到的这些缓冲区跟cache和buf有什么关系?会被回收吗? 内核协议栈的运行是通过一个内核线程的方式来运行的吗?是否可以看到这个线程的名字?

    作者回复: 问题比较多,放到答疑篇里面统一回复吧

    2019-02-26
    31
  • Penn
    中断不均,连接跟踪打满

    作者回复: 嗯 这是最常见的两个问题

    2019-02-06
    7
    12
  • zhoufeng
    老师好,一直不太明白skb_buff和sk_buff的区别,这两者有关系吗

    作者回复: sk_buff一般是说内核数据接口,而 skb则是套接字缓存(socket buffer)

    2019-04-10
    2
    8
  • 饼子
    遇到了程序分配大量链接,占用完程序最大打开文件数量,使用lsof 查看分析的

    作者回复: 嗯嗯,文件数量或者连接数量都可以看到

    2019-02-20
    6
  • 使用InfiniBand网卡和InfiniBand交换机的时候, mtu如果配置65520的时候,通过http下载对象存储小文件比较慢,但是配置9000的时候大小文件都比较快。https://github.com/antirez/redis/issues/2385 Redis works very slow with MTU higher than packet size. 请问老师是什么原因

    作者回复: MTU大小的问题都是分片和重组导致的。后面有案例讲到分析内核中网络协议栈的行为,你可以到时候试着分析下这种场景

    2019-02-13
    3
  • 空空
    老师过年好! 曾经在Linux3.10测试netlink收发包效率,发现一个问题,正常情况下每收一个包大概需要10us,但是每隔8秒会出现一次收包时间30-50ms,就是因为固定间隔8秒会出现一次收包时间过长,导致收包效率降低。请教一下老师每隔8秒系统会做什么?或者是因为什么系统配置?希望老师解答一下疑惑,谢谢!

    作者回复: 这个不好说,后面有讲到延迟增大的分析思路,到时候可以分析看看

    2019-02-08
    2
    3
  • 道无涯
    本机有两张网卡,如果路由配成第二张网卡也走第一张网卡,会不会导致第二张网络收不到数据?

    作者回复: 收包取决于机器外部的路由(比如交换机和路由器),机器内部的配置可能会影响回包路径

    2019-02-06
    3
  • 老师您好,请问最后一张图下方的两个大圈圈代表的是什么意思,是代表loop吗

    作者回复: ring buffer

    2019-02-06
    2
    3
  • Geek_33409b
    系统出口带宽被打满,导致大量请求超时

    作者回复: DDoS 😊

    2019-02-06
    3
收起评论
显示
设置
留言
41
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部