Linux内核网络
JinrongLiang
开放、自由、分享
展开
-
Linux内核学习资料
1. 书籍1.1 入门《Linux内核设计与实现》《深入理解Linux内核》1.2 提高《深入Linux内核架构》1.3 方向深入Linux子系统内存——《深入理解Linux虚拟内存管理》网络——《深入理解LINUX网络内幕》驱动方向《Linux设备驱动程序》2. 网站2.1 官方下载内核源代码、补丁、跟踪内核bughttps://www.kernel.org/Linux新闻https://lwn.net/Linux内核开发邮件列表http://vger.kernel原创 2021-11-09 15:46:55 · 750 阅读 · 0 评论 -
Linux内核网络性能优化
1. 前言2. Linux网络协议栈3. DPDK4. XDP5. CPU负载均衡5.1 NAPI5.2 RSS5.3 RPS5.4 RFS5.5 XPS6. 网络套接字7. 总结参考链接:https://blog.selectel.com/introduction-dpdk-architecture-principles/https://medium.com/@jain.sm/express-data-path-xdp-introduction-d41b77ffbabf原创 2021-03-30 17:26:36 · 1198 阅读 · 0 评论 -
Linux内核网络数据发送(六)——网络设备驱动
Linux内核网络数据发送(六)——网络设备驱动1. 前言2. 驱动回调函数注册3. `ndo_start_xmit` 发送数据4. `igb_tx_map`1. 前言本文主要介绍设备通过 DMA 从 RAM 中读取数据并将其发送到网络,主要分析dev_hard_start_xmit 通过调用 ndo_start_xmit来发送数据的过程。2. 驱动回调函数注册驱动程序实现了一系列方法来支持设备操作,例如:发送数据(ndo_start_xmit)获取统计信息(ndo_get_stats64原创 2020-11-23 16:22:13 · 4621 阅读 · 0 评论 -
Linux内核网络数据发送(五)——排队规则
Linux内核网络数据发送(五)——排队规则1. 前言2. `qdisc_run_begin()` and `qdisc_run_end()`:仅设置 qdisc 状态位3. `__qdisc_run()`:真正的 qdisc 执行入口4. `qdisc_restart`:从 qdisc 队列中取包,发送给网络驱动4.1 `dequeue_skb()`:从 qdisc 队列取待发送 skb4.2 `sch_direct_xmit()`:发送给网卡驱动4.3 `handle_dev_cpu_collision原创 2020-11-09 16:33:43 · 2688 阅读 · 0 评论 -
Linux内核网络数据包发送(四)——Linux netdevice 子系统
Linux内核网络数据包发送(四)——Linux netdevice 子系统1. 前言2. `dev_queue_xmit` and `__dev_queue_xmit`2.1 `netdev_pick_tx`2.2 `__netdev_pick_tx`2.2.1 Transmit Packet Steering (XPS)2.2.2 `skb_tx_hash`3. 继续`__dev_queue_xmit`4. `__dev_xmit_skb`5. 调优: Transmit Packet Steering原创 2020-11-02 15:29:49 · 2730 阅读 · 1 评论 -
Linux内核网络数据包发送(三)——IP协议层分析
Linux内核网络数据包发送(三)——IP协议层分析1. 前言2. `ip_send_skb`3. `ip_local_out` and `__ip_local_out`3.1 netfilter and nf_hook3.2 目的(路由)缓存4. `ip_output`5. `ip_finish_output`Path MTU Discovery6. `ip_finish_output2`7. `dst_neigh_output`7.1 `neigh_hh_output`7.2 `n->output原创 2020-10-26 18:22:58 · 2128 阅读 · 0 评论 -
Linux内核网络数据包发送(二)——UDP协议层分析
Linux内核网络数据包发送(二)——UDP协议层分析1. 前言2. `udp_sendmsg`2.1 UDP corking2.2 获取目的 IP 地址和端口2.3 Socket 发送:bookkeeping 和打时间戳2.4 辅助消息(Ancillary messages)2.5 设置自定义 IP 选项2.6 多播或单播(Multicast or unicast)2.7 路由2.8 `MSG_CONFIRM`: 阻止 ARP 缓存过期2.9 uncorked UDP sockets 快速路径:准备待发送原创 2020-10-08 11:06:51 · 2307 阅读 · 1 评论 -
Linux内核网络数据包发送(一)
Linux内核网络发送数据之socket层1. 前言2. 数据包发送宏观视角3. 协议层注册4. 通过 socket 发送网络数据4.1 `sock_sendmsg`, `__sock_sendmsg`, `__sock_sendmsg_nosec`4.2 `inet_sendmsg`5. 总结1. 前言本文首先从宏观上概述了数据包发送的流程,接着分析了协议层注册进内核以及被socket的过程,最后介绍了通过 socket 发送网络数据的过程。2. 数据包发送宏观视角从宏观上看,一个数据包从用户程序原创 2020-09-28 14:33:22 · 1884 阅读 · 0 评论 -
Linux内核网络中数据报在协议层的处理
1. 前言协议层注册接下来我们看协议层注册自身的实现。本文会拿 IP 层作为例子,因为它最常用,大部分读者都很熟悉。2. IP协议层IP 层在函数 inet_init 中将自身注册到 ptype_base 哈希表。net/ipv4/af_inet.c:dev_add_pack(&ip_packet_type);struct packet_type 的变量 ip_packet_type 定义在 net/ipv4/af_inet.c:static struct packet_type ip_原创 2020-09-21 19:05:44 · 1508 阅读 · 0 评论 -
内核网络中的GRO、RFS、RPS技术介绍和调优
内核网络技术GRO、GSO、RSS、RPS、RFS、XPS0. 前言1. GRO(Generic Receive Offloading)2. GSO3. RSS4. RPS(Receive Packet Steering)0. 前言本文主要介绍内核网络中GRO、GSO、RSS、RPS、RFS、XPS等技术,并针对其对应的规则进行网络调优。1. GRO(Generic Receive Offloading)Large Receive Offloading (LRO) 是一个硬件优化,GRO 是 LRO原创 2020-09-15 17:48:08 · 3871 阅读 · 0 评论 -
Linux网络设备子系统
本文主要介绍Linux网络设备子系统的数据处理,从网络设备子系统的初始化开始,从硬中断到软中断,分别介绍了NAPI 和 `napi_schedule`、数据在网络设备子系统的监测和调优以及网络数据的处理。原创 2020-09-01 19:05:04 · 1792 阅读 · 0 评论 -
Linux内核网络中的软中断ksoftirqd
1. 前言之前分享过Linux内核网络数据包的接收过程,当执行到网卡通过硬件中断(IRQ)通知CPU,告诉它有数据来了,CPU会根据中断表,调用已经注册的中断函数,这个中断函数会调到驱动程序(NIC Driver)中相应的函数。驱动先禁用网卡的中断,表示驱动程序已经知道内存中有数据了,告诉网卡下次再收到数据包直接写内存就可以了,不要再通知CPU了,这样可以提高效率,避免CPU不停的被中断。由于硬中断处理程序执行的过程中不能被中断,所以如果它执行时间过长,会导致CPU没法响应其它硬件的中断,于是内核引入软原创 2020-08-24 18:34:03 · 7202 阅读 · 1 评论 -
如何放出Linux内核中的链表大招
前言上回,我们说到Linux内核中max()宏的终极奥义,Linux内核链表也不甘示弱,那么接下来,让我们看看Linux内核中的链表大招。如何放出Linux内核中的链表大招前言一、链表简介(1)单链表(2)双链表(3)循环链表二、Linux内核中的链表数据结构1、内核链表的定义2、内核链表的使用(1)声明和起始化(2)插入链表(3)删除链表三、内核链表的使用案例4、一、链表简介链表(Lin...原创 2020-08-20 20:53:03 · 680 阅读 · 0 评论 -
Linux内核网络设备驱动
本文首先从宏观上介绍数据包的接收过程,然后详细介绍了Linux网络设备驱动的工作过程,最后介绍网卡监控与调优,包括网络数据包总数、丢包、错包数量的相关统计。1. 接收数据包过程概述介绍数据包收包过程,有助于我们了解Linux内核网络设备在数据收包过程中的位置,下面从宏观的角度介绍数据包从被网卡接收到进入 socket 接收队列的整个过程:加载网卡驱动,初始化数据包从外部网络进入网卡网卡(通过DMA)将包拷贝到内核内存中的ring buffer产生硬件中断,通知系统收到了一个包驱动调用 NAP原创 2020-08-17 19:05:17 · 1965 阅读 · 0 评论 -
使用perf监控Linux内核网络丢弃的数据包
本文将使用perf监控Linux内核网络丢弃的数据包,如果还没有安装perf,请先按一下步骤安装:根据提示,安装所需的依赖,要注意的是,内核版本不同,安装命令略有差异:sudo apt install linux-tools-5.3.0-62-genericsudo apt install linux-cloud-tools-5.3.0-62-genericperf的用法帮助信息:下面用perf监控丢弃的数据包,使用 perf 监视 kfree_skb 事件:sudo perf re原创 2020-08-11 17:12:10 · 1773 阅读 · 0 评论 -
Linux内核网络丢包查看工具dropwatch的安装和使用
本文将安装并使用dropwatch工具,来收集并查看Linux内核网络中丢包的数量和位置。安装sudo apt-get install -y libnl-3-dev libnl-genl-3-dev binutils-dev libreadline6-devgit clone https://github.com/pavel-odintsov/drop_watch.git进入/drop_watch/src目录后执行make:使用dropwatch安装完成后使用以下命令运行:sudo原创 2020-08-11 16:12:23 · 5730 阅读 · 0 评论 -
Linux网络常用工具分类介绍
Linux网络命令较多,单纯的介绍网络命令的用法也没什么意思。本文将常见的网络命令进行分类,并做出思维导图,对每个分类的命令选择性的介绍其用途、常见选项和用法举例。BTW,不建议死记硬背每个命令,了解一下有哪些分类,该分类下有哪些命令就好了,具体用到了再查。1. 网络配置1.1 ip1.2 ifconfig2. 连通性测试2.1 ping用途用于网络连通性测试,常见参数用法举例2.2 traceroute3. 网络连接3.1 netstat3.2 nc4. 流量统计4.1原创 2020-07-09 22:40:28 · 2007 阅读 · 0 评论 -
Linux内核网络(一)——初探内核网络
本文将从宏观上介绍Linux内核网络协议栈和网络设备驱动程序,介绍了两个很重要的结构(net_device和sk_buff),更深入更详细的内容将在以后的文章中介绍。首先,我们需要了解网络分层模型。OSI 模型中将网络划分为七层,从下到上依次为:物理层(Physical)、数据链路层(Date Link)、网络层(Network)、传输层(Transport)、会话层(Session)、表示层(...原创 2020-04-29 20:45:21 · 3711 阅读 · 1 评论