最近要给团队做一个长期的内部分享,主题就是Linux内核中数据包的处理流程。 这几天抽空画了一部分流程图。...我本人对网卡驱动兴趣不大,但skb path又无法脱离网卡驱动,这里选择了Intel的e1000网卡驱动:原因有二,一是Intel网卡驱动是内核里面写得最清楚,可读性最高的;二是e1000是Intel里面比较简单的驱动
认识 Linux, 了解 Linux 的相关背景 1.发展史 学习Linux系统编程,你可能要问Linux从哪里来?它是怎么发展的?在这里简要介绍Linux的发展史。...严格来讲,Linux只是操作系统内 核本身,但通常采用“Linux内核”来表达该意思。而Linux则常用来指基于Linux内核的完整操作系统,它 包括GUI组件和许多其他实用工具。...随着Linux操作系统飞速发展,各种集成 在Linux上的开源软件和实用工具也得到了应用和普及,因此,Linux也成为了开源软件的代名词。...国内如中标麒麟Linux、红旗 Linux、深度Linux等系统软件厂商都推出的Linux桌面操作系统,目前已经在政府、企业、OEM等领域得 到了广泛应用。...Linux来实现,而这一切均归功与Linux与开源的力量。
在linux系统中,有一些特殊程序,启动后就会持续在后台执行,等待用户或者其他软件调用使用,这种程序我们称为服务。...linux系统中服务的管理工具 systemV systemd 一、systemV与init systemV,systemV当中有一个叫init的程序,这个程序可以让系统中的service命令去调用/etc...servername on/off 指定一个服务在哪个运行级别启动 chkconfig --list servername 查看一个服务在哪些运行级别启动 分类 按照功能分类 系统服务:这些服务的服务对象是linux...系统本身,或者linux系统的用户 网络服务:网络服务的服务对象是网络中的其他客户端 按照启动方法分类 独立系统服务:这类服务一经启动,除非系统关闭或者管理者手动结束,否则会一直在后台执行,不管是否用到...而这些服务就需要用户手动去处理 运行级别分类 init会根据用户指定的运行级别,来启动不同的服务,在linux系统中包含了0-6,一共7个运行级别 0 关机 1 单用户 2 无网络的多用户
Eth1在通过网线连接到以太网交换机的同时也被则加入了Linux Bridge,这相当于用一条网线将Linux Bridge上的一个端口(Eth1)连接到了本地站点的以太网交换机上,Eth1上收到的所有数据包都会被发送到...Linux Bridge上,Linux Bridge发给Eth1的数据包也会被发送到以太网交换机上。...Linux Bridge上还有一个Tap虚拟网卡,用于V**程序接收从Linux Bridge上收到的数据包。...由于Eth1被加入了V**主机上的Linux Bridge,因此Linux Bridge收到该ARP请求。 Linux Bridge对该ARP请求进行泛洪,发送到连到其上面的Tap虚拟网卡上。...这两个Linux Bridge和两个以太网交换机一起将左右两个站点的主机连接在一起,形成了一个局域网。
Linux是什么?Linux是一个操作系统。操作系统是管理和控制计算机硬件与软件资源的计算机程序,其他软件都在操作系统的支持下运行。...更加准确一点,Linux是一个操作系统的内核,Linux核心和很多软件一起构成一个完整的操作系统。Windows 10 和 MAC OS X 都是操作系统。在Linux诞生之前,不得不提Unix。...1991年的10月5日,linus在comp.os.minix新闻组上发布消息,正式向外宣布Linux内核的诞生。可以到Linux Kernel了解更多消息。
在 上一篇文章 中,我们介绍了网卡接收和发过数据在 Linux 内核中的处理过程,我们先来回顾一下网卡接收和发送数据的过程,如 图1 所示: ?...为了避免这种情况出现,Linux 内核把中断处理分为:中断上半部 和 中断下半部,上半部在关闭中断的情况下进行,而下半部在打开中断的情况下进行。...一般来说,网卡驱动向内核注册的中断处理服务属于 中断上半部,如前面介绍的 NS8390网卡驱动 注册的 ei_interrupt 中断处理服务,而本文主要分析网卡 中断下半部 的处理。...数据包上送 在上一篇文章中,我们介绍过 ei_interrupt 中断处理服务首先会创建一个 sk_buff 数据包对象保存从网卡中接收到的数据,然后调用 netif_rx 函数将数据包上送给网络协议栈处理...对于 Linux 内核的中断处理机制可以参考我们之前的文章 Linux中断处理,这里就不详细介绍了。在本文中,我们只需要知道网络中断下半部处理例程为 net_rx_action 函数即可。
我们貌似就只有用 eBPF/SystemTap 配合 kprobe 的一条路可以走了 基础的 trace Kprobe 在继续下面的代码实际操作之前,我们首先要来认识一下 Kprobe 先引用一段官方文档的介绍...OK,Hook 点确认后,在开始正式编码前,我们来大概介绍下 ip_finish_output ip_finish_output 首先来看下这个函数 static int ip_finish_output...在这三个参数中,我们主要来将视线放在 struct sk_buff *skb 上。 熟悉 Linux Kernel 协议栈实现的同学肯定对 sk_buff 这个数据结构非常非常熟悉了。...sk_buff 的一些指针的操作,我们就能很方便的获取到其中不同 layer 的 header 和具体的 payload OK,现在让我们正式的来开始实现我们所需要的功能 eBPF + KProbe 首先简单介绍下...这也是名字中 e 的来历(extend) 本质上而言,eBPF 在内核维护了一层 VM,可以加载特定规则生成的代码,让内核变得更具有可编程性(后面我争取写一篇 eBPF 从入门到入土的介绍文章) Tips
前言我们可以使用BPF对Linux内核进行跟踪,收集我们想要的内核数据,从而对Linux中的程序进行分析和调试。...与其它的跟踪技术相比,使用BPF的主要优点是几乎可以访问Linux内核和应用程序的任何信息,同时,BPF对系统性能影响很小,执行效率很高,而且开发人员不需要因为收集数据而修改程序。...本文将介绍保证BPF程序安全的BPF验证器,然后以BPF程序的工具集BCC为例,介绍常见BPF程序,具体为kprobes和tracepoints类型的BPF程序的使用及程序编写示例。2....print_functionfrom bcc import BPFfrom time import sleep# define BPF programbpf_program = """#include <uapi/linux...总结本文主要介绍了保证BPF程序安全的BPF验证器,然后以BPF程序的工具集BCC为例,分享了kprobes和tracepoints类型的BPF程序的使用及程序编写示例。
1.expect是linux中一个交互命令,一般在 /usr/bin/expect路径下,如果该路径未加入到环境中需要先添加,其作用场景常用于交互执行输入指令 常用命令: expect
不同类型的Linux系统对各日志存放路径及文件名页不尽相同,对于ubuntu和Centos系统默认将生成的日志保存在“/var/log”目录。...如表下所示为Linux系统的默认日志类型及其存放信息如下所示: 系统默认日志类型 /var/log/messages 记录Linux内核消息及各种应用程序的公共日志信息 /var/log/cron 记录...crond 计划任务产生的事件信息 var/log/dmesg 记录 Linux 操作系统在引导过程中的各种事件信息 /var/log/lastlog 记录每个用户最近的登录事件 /var/log/secure
linux目录结构介绍 "/" :Linux文件系统的入口.也是最高一级的目录...."/root":Linux超级权限用户root的跟目录. "/sbin":基本的系统维护命令,只能由超级用户使用. "/srv":存放一些服务器启动之后需要提取的数据.
Linux 中的 xargs 命令是一个非常有用的命令行工具,可以将一些参数集合传递给其他命令作为参数,并利用指定的命令进行处理。...总结 xargs 命令是Linux中非常有用的一个命令,它可以帮助我们批量处理文件或者其他任务。在使用的时候,需要注意文件名中可能包含的特殊字符,以及被传递的命令是否支持多个参数的情况。
The use of a Linux virtual file system (vfs) to represent the cgroup hierarchy provides for a familiar...(via task_lock()) - inside an rcu_read_lock() section via rcu_dereference() 3.3 子系统API 每个子系统应该: - 在linux
tcpdump 是 Linux 系统提供一个非常强大的抓包工具,熟练使用它,对我们排查网络问题非常有用。...tcpdump 常用的选项有: -i 指定要捕获的目标网卡名,网卡名可以使用前面章节中介绍的 ifconfig 命令获得;如果要抓所有网卡的上的包,可以使用 any 关键字。
一、Linux介绍 1、常见的操作系统 •Windows 它微软公司开发的一款桌面操作系统(闭源系统)。...•Linux Linux是一个开源的操作系统,目前是市面上占有率极高的服务器操作系统。目前其分支有很多。...Linux系统能做到很长时间不关机一点也不卡顿; 安全性:开源系统,所有人都可以贡献自己的源代码为Linux系统打补丁; 3、Linux简介(了解) 3.1、Linux操作系统 •人 物 Linus...Linux的开发作者,李纳斯·托瓦兹。...加入其开源计划(GNU计划) •1992年 GNU/Linux 3.3、Linux分支 目前分支比较多,常见的有centos(社区企业网络操作系统)、RedHat、乌班图、debian等等。
1.Linux的发展史 Linux,一般指GNU/Linux(单独的Linux内核并不可直接使用,一般搭配GNU套件,故得此称呼),是一种免费使用和自由传播的类UNIX操作系统,其内核由林纳斯·本纳第克特...2.1 Linux之父 Linux的诞生显得充满了偶然。...国内如中标麒麟Linux、红旗Linux、深度Linux等系统软件厂商都推出的Linux桌面操作系统,目前已经在政府、企业、OEM等领域得到了广泛应用。...、openSUSE、Gentoo、Linux Mint、Scientific Linux和Oracle Linux等。...以下是部分发行版本的详细介绍: Ubuntu。以其用户友好性和易用性著称,适合Linux新手,提供了强大的社区支持和广泛的软件包。 Red Hat Enterprise Linux(RHEL)。
前言 我们可以使用BPF对Linux内核进行跟踪,收集我们想要的内核数据,从而对Linux中的程序进行分析和调试。...与其它的跟踪技术相比,使用BPF的主要优点是几乎可以访问Linux内核和应用程序的任何信息,同时,BPF对系统性能影响很小,执行效率很高,而且开发人员不需要因为收集数据而修改程序。...本文将介绍保证BPF程序安全的BPF验证器,然后以BPF程序的工具集BCC为例,分享kprobes和tracepoints类型的BPF程序的使用及程序编写示例。 2....总结 本文主要介绍了保证BPF程序安全的BPF验证器,然后以BPF程序的工具集BCC为例,分享了kprobes和tracepoints类型的BPF程序的使用及程序编写示例。...内核观测技术 BPF》 本文来源于陈莉君老师“Linux内核之旅”。
基本介绍 第三类是标准的网络接口Linux设备,本章介绍的内核,其余的交互网络接口描述 网络接口,必须使用特定的内核数据结构本身注册,与外部分组交换数据线打电话时准备 经常使用的文件上的网络接口操作是没有意义的...>) FDDI设备使用alloc_fddidev() 令牌环设备使用alloc_trdev() register_netdev...该结构定义在中 传递经全hard_start_xmit的套接字缓冲区包括了物理数据包,并拥有完整的传输层数据包头 该传输函数仅仅运行了对数据包的一致性检查。...dev_kfree_skb_any(struct sk_buff *skb); 不使用接收中断 为了能提高Linux在宽带系统上的性能。...sk_buff *skb); void dev_kfree_skb(struct sk_buff *skb); void dev_kfree_skb_irq(struct sk_buff *skb);
本文将介绍在Linux系统中,以一个UDP包的接收过程作为示例,介绍数据包是如何一步一步从应用程序到网卡并最终发送出去的。 socket层 socket(...)...这是一个函数指针,会指向具体驱动发送数据的函数 Device Driver ndo_start_xmit会绑定到具体网卡驱动的相应函数,到这步之后,就归网卡驱动管了,不同的网卡驱动有不同的处理方式,这里不做详细介绍...从sendto函数的帮助文件里面看到这样一句话:(Normally, this does not occur in Linux....这里的device queue应该指的是Traffic Control里面的queue,说明在linux里面,默认的SO_SNDBUF值已经够queue用了,疑问的地方是,queue的长度和个数是可以配置的...txqueuelen: 很多地方都说这个是控制qdisc里queue的长度的,但貌似只是部分类型的qdisc用了该配置,如linux默认的pfifo_fast。
所以,当网卡接收到数据包后,要通知 Linux 内核有数据需要处理。另外,网卡驱动应该提供让 Linux 内核把数据把发送出去的接口。...net_device 结构是 Linux 为了适配不同类型的网卡设备而抽象出来的对象,不同的网卡驱动只需要按 Linux 的规范来填充 net_device 结构的各个成员变量,Linux 内核就能够识别出网卡...net_device 结构 net_device 结构是 Linux 内核对网卡设备的抽象,但由于历史原因,net_device 结构的定义十分复杂。...当网卡从网络接收到数据包后,需要产生一个中断来通知 Linux 内核有数据包需要处理,而 irq 就是网卡驱动注册到内核中断服务的中断号。...总结 本文主要简单的介绍了网卡设备接收和发送数据包的过程,而网卡设备的初始化过程并没有涉及。当然网卡设备的初始化过程也非常重要,可能会在后面的文章继续分析。
领取专属 10元无门槛券
手把手带您无忧上云