33 | 关于 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
《Linux 性能优化实战》,新⼈⾸单¥68
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(41)
- 最新
- 精选
- 渡渡鸟_linux我结合网络上查阅的资料和文章中的内容,总结了下网卡收发报文的过程,不知道是否正确: 1. 内核分配一个主内存地址段(DMA缓冲区),网卡设备可以在DMA缓冲区中读写数据 2. 当来了一个网络包,网卡将网络包写入DMA缓冲区,写完后通知CPU产生硬中断 3. 硬中断处理程序锁定当前DMA缓冲区,然后将网络包拷贝到另一块内存区,清空并解锁当前DMA缓冲区,然后通知软中断去处理网络包。 ----- 当发送数据包时,与上述相反。链路层将数据包封装完毕后,放入网卡的DMA缓冲区,并调用系统硬中断,通知网卡从缓冲区读取并发送数据。
作者回复: 对的
2019-03-07994 - 安排当一个网络帧到达网卡后,网卡会通过 DMA 方式,把这个网络包放到收包队列中;然后通过硬中断,告诉中断处理程序已经收到了网络包。 接着,网卡中断处理程序会为网络帧分配内核数据结构(sk_buff),并将其拷贝到 sk_buff 缓冲区中;然后再通过软中断,通知内核收到了新的网络帧。 接下来,内核协议栈从缓冲区中取出网络帧,并通过网络协议栈,从下到上逐层处理这个网络帧。 老师你好,上面的一段话有些疑问想请教一下。 收包队列是属于哪里的存储空间,是属于物理内存吗,还是网卡中的存储空间,通过dma方式把数据放到收包队列,我猜这个收包队列是物理内存中的空间。这个收包队列是由内核管理的吧,也就是跟某一个进程的用户空间地址没关系? 那sk_buf缓冲区又是哪里的存储空间,为什么还要把收包队列拷贝到这个缓冲区呢,这个缓冲区是协议栈维护的吗?也属于内核,跟进程的用户空间地址有关系吗? socket的接收发送缓冲区是映射到进程的用户空间地址的吗?还是由协议栈为每个socket在内核中维护的缓冲区? 还有上面说到的这些缓冲区跟cache和buf有什么关系?会被回收吗? 内核协议栈的运行是通过一个内核线程的方式来运行的吗?是否可以看到这个线程的名字?
作者回复: 问题比较多,放到答疑篇里面统一回复吧
2019-02-2631 - Penn中断不均,连接跟踪打满
作者回复: 嗯 这是最常见的两个问题
2019-02-06712 - zhoufeng老师好,一直不太明白skb_buff和sk_buff的区别,这两者有关系吗
作者回复: sk_buff一般是说内核数据接口,而 skb则是套接字缓存(socket buffer)
2019-04-1028 - 饼子遇到了程序分配大量链接,占用完程序最大打开文件数量,使用lsof 查看分析的
作者回复: 嗯嗯,文件数量或者连接数量都可以看到
2019-02-206 - 佳使用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-133 - 空空老师过年好! 曾经在Linux3.10测试netlink收发包效率,发现一个问题,正常情况下每收一个包大概需要10us,但是每隔8秒会出现一次收包时间30-50ms,就是因为固定间隔8秒会出现一次收包时间过长,导致收包效率降低。请教一下老师每隔8秒系统会做什么?或者是因为什么系统配置?希望老师解答一下疑惑,谢谢!
作者回复: 这个不好说,后面有讲到延迟增大的分析思路,到时候可以分析看看
2019-02-0823 - 道无涯本机有两张网卡,如果路由配成第二张网卡也走第一张网卡,会不会导致第二张网络收不到数据?
作者回复: 收包取决于机器外部的路由(比如交换机和路由器),机器内部的配置可能会影响回包路径
2019-02-063 - 威老师您好,请问最后一张图下方的两个大圈圈代表的是什么意思,是代表loop吗
作者回复: ring buffer
2019-02-0623 - Geek_33409b系统出口带宽被打满,导致大量请求超时
作者回复: DDoS 😊
2019-02-063
收起评论