最近要给团队做一个长期的内部分享,主题就是Linux内核中数据包的处理流程。 这几天抽空画了一部分流程图。...我本人对网卡驱动兴趣不大,但skb path又无法脱离网卡驱动,这里选择了Intel的e1000网卡驱动:原因有二,一是Intel网卡驱动是内核里面写得最清楚,可读性最高的;二是e1000是Intel里面比较简单的驱动
代码demo.c #include #include #include #include #include #include #include #include #include #include #include #include...priv->stats.rx_dropped++; return; } skb_reserve(skb, 2); memcpy(skb_put(skb, len), buf..., len); skb->dev = dev; skb->protocol = eth_type_trans(skb, dev); // 不需要检查checksum skb-
/module.h> #include #include #include #include... #include #include #include #include... #include #include #include #include #include #include #include #include len), skb->data, skb->len); // skb_put():来动态扩大sk_buff结构体里中的数据区,避免溢出 /*8)设置新的
基本介绍 第三类是标准的网络接口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);
1.3 安装对应版本的linux内核镜像 (1)目标机上安装对应版本的linux内核镜像 下载地址:http://security.ubuntu.com/ubuntu/pool/main/l/linux.../ (2)客户机上安装对应版本的带有符号表的linux内核镜像 下载地址:http://ddebs.ubuntu.com/pool/main/l/linux/,并且源码下载,建立软链接使得调试的时候能够跟踪源码...减少Linux 内核传输层和网络层的计算工作,将这些计算工作offload(卸载)到物理网卡。UDP协议层本身不对大的数据报进行分片,而是交给IP层去做。...六 影响版本 http://www.securityfocus.com/bid/100262 影响linux kernel 4.12.3之前的版本,在4.14的版本将移除UFO机制。...七 参考资料 Linux 内核源码剖析- TCP.IP 实现, 樊东东, 莫澜, 上册, 2011 A Guide to Kernel Exploitation Attacking the Core http
在这三个参数中,我们主要来将视线放在 struct sk_buff *skb 上。 熟悉 Linux Kernel 协议栈实现的同学肯定对 sk_buff 这个数据结构非常非常熟悉了。...实际上我们现在有很多 Centos 7 + Linux 3.10 这样的传统的搭配,那么他们怎么办呢? Linux 3.10 live's matter!.../if_ether.h> #include #include #include #include...#include #include #include #include %} function.../ptrace.h> #include #include #include #include <net/
现在很多人都在诟病Linux内核协议栈收包效率低,不管他们是真的懂还是一点都不懂只是听别人说的,反正就是在一味地怼Linux内核协议栈,他们的武器貌似只有DPDK。...但是,即便Linux内核协议栈收包效率真的很低,这是为什么?有没有办法去尝试着优化?而不是动不动就DPDK。 我们从最开始说起。...Linux内核并没有在横向上将锁的粒度做划分,而是在纵向上,采用两个层次的锁机制: 我们看到的Linux内核在处理收包逻辑时的backlog,其实抽象出来就是上面的二级锁,它是不是很像Windows的...事实上这是一种非常常见且通用的设计,除了Windows的IRQL,Linux中断的上半部/下半部也是这种基于思想设计的。...当然,Linux内核协议栈无法摆脱这两点问题,也就回答了本文的题目中的第一个问题, “Linux内核UDP收包为什么效率低?” 。 不同的上下文异步操作同一份数据,锁是必不可少的。
而很多时候,如果你对Linux底层的理解不深的话,遇到很多线上性能瓶颈你会觉得狗拿刺猬,无从下手。 我们今天用图解的方式,来深度理解一下在Linux下网络包的接收过程。...本文基于Linux 3.10,源代码参见https://mirrors.edge.kernel.org/pub/linux/kernel/v3.x/,网卡驱动采用Intel的igb网卡举例。...Linux实现的是链路层、网络层和传输层这三层。 在Linux内核实现中,链路层协议靠网卡驱动来实现,内核协议栈来实现网络层和传输层。内核对更上层的应用层提供socket接口来供用户进程访问。...二 Linux启动 Linux驱动,内核协议栈等等模块在具备接收网卡数据包之前,要做很多的准备工作才行。...这块相对比较简单,剩下大部分的戏份都是由Linux内核其它模块来表演了。 首先在开始收包之前,Linux要做许多的准备工作: 1.
前言 Linux内核网络 UDP 协议层通过调用 ip_send_skb 将 skb 交给 IP 协议层,本文通过分析内核 IP 协议层的关键函数来分享内核数据包发送在 IP 协议层的处理,并分享了监控...3.2 目的(路由)缓存 dst 代码在 Linux 内核中实现协议无关的目标缓存。...以上两种情况,最后都会到 dev_queue_xmit,它将 skb 发送给 Linux 网络设备子系统,在它 进入设备驱动程序层之前将对其进行更多处理。...将头数据复制到 skb 后,skb_push 将更新 skb 内指向数据缓冲区的指针。最后调用 dev_queue_xmit 将 skb 传递给 Linux 网络设备子系统。...else goto out_kfree_skb; } 如果以太网头写入成功,将调用 dev_queue_xmit 将 skb 传递给 Linux
本文作者张彦飞,原题“图解Linux网络包接收过程”,内容有少许改动。...相信这对你的工作将会有非常大的帮助(本文将以Linux为例,源码基于Linux 3.10,源代码参见:https://mirrors.edge.kernel.org/pub/linux/kernel/v3...对于Linux来说,它实现的是链路层、网络层和传输层这三层。 在Linux内核实现中,链路层协议靠网卡驱动来实现,内核协议栈来实现网络层和传输层。...我们用Linux的视角来看到的TCP/IP网络分层模型应该是下面这个样子的: 在Linux的源代码中,网络设备驱动对应的逻辑位于driver/net/ethernet。...Linux内核网络收包总览: 如上图所示:当网卡上收到数据以后,Linux中第一个工作的模块是网络驱动。网络驱动会以DMA的方式把网卡上收到的帧写到内存里。
Linux 网络架构 Linux 网络初始化 网络设备子系统初始化 网卡驱动初始化 协议栈初始化 数据包的接收过程 硬中断处理 ksoftirqd 软中断处理 协议栈处理 应用层处理 总结 这里深度理解一下在...Linux 网络架构 在Linux内核实现中,链路层协议靠网卡驱动来实现,内核协议栈来实现网络层和传输层。内核对更上层的应用层提供socket接口来供用户进程访问。...我们用Linux的视角来看到的TCP/IP网络分层模型应该是下面这个样子的。...Linux 网络初始化 网络设备子系统初始化 linux内核通过调用subsys_initcall来初始化各个子系统,其中网络子系统的初始化会执行到net_dev_init函数: //net/core/...总结 首先在开始收包之前,Linux要做许多的准备工作: 创建ksoftirqd线程,为它设置好它自己的线程函数,后面指望着它来处理软中断呢 协议栈注册,linux要实现许多协议,比如arp,icmp,
现在很多人都在诟病Linux内核协议栈收包效率低,不管他们是真的懂还是一点都不懂只是听别人说的,反正就是在一味地怼Linux内核协议栈,他们的武器貌似只有DPDK。...但是,即便Linux内核协议栈收包效率真的很低,这是为什么?有没有办法去尝试着优化?而不是动不动就DPDK。 我们从最开始说起。...Linux内核并没有在横向上将锁的粒度做划分,而是在纵向上,采用两个层次的锁机制: ?...事实上这是一种非常常见且通用的设计,除了Windows的IRQL,Linux中断的上半部/下半部也是这种基于思想设计的。...当然,Linux内核协议栈无法摆脱这两点问题,也就回答了本文的题目中的第一个问题, “Linux内核UDP收包为什么效率低?” 。 不同的上下文异步操作同一份数据,锁是必不可少的。
在 上一篇文章 中,我们介绍了网卡接收和发过数据在 Linux 内核中的处理过程,我们先来回顾一下网卡接收和发送数据的过程,如 图1 所示: ?...为了避免这种情况出现,Linux 内核把中断处理分为:中断上半部 和 中断下半部,上半部在关闭中断的情况下进行,而下半部在打开中断的情况下进行。...NET_RX_DROP; } netif_rx 函数的参数就是要上送给网络协议栈的数据包,netif_rx 函数主要完成以下几个工作: 获取当前 CPU 的待处理的数据包队列,在 Linux 内核初始化时...对于 Linux 内核的中断处理机制可以参考我们之前的文章 Linux中断处理,这里就不详细介绍了。在本文中,我们只需要知道网络中断下半部处理例程为 net_rx_action 函数即可。...for (;;) { struct sk_buff *skb; local_irq_disable(); skb = __skb_dequeue
前言 我们可以使用BPF对Linux内核进行跟踪,收集我们想要的内核数据,从而对Linux中的程序进行分析和调试。...与其它的跟踪技术相比,使用BPF的主要优点是几乎可以访问Linux内核和应用程序的任何信息,同时,BPF对系统性能影响很小,执行效率很高,而且开发人员不需要因为收集数据而修改程序。...print_function from bcc import BPF from time import sleep # define BPF program bpf_program = """ #include <uapi/linux...master/INSTALL.md bcc程序编写指导手册 https://github.com/iovisor/bcc/blob/master/docs/reference_guide.md 参考书《Linux...内核观测技术 BPF》 本文来源于陈莉君老师“Linux内核之旅”。
带着疑问,我去查阅 Linux 源码的实现,下面就是关闭一个 TCP 连接的过程。...return filp_close(filp, files); ... } sys_close() 函数最终会调用 file_close() 函数来关闭文件(由于在 Linux 中 socket...ops) sock->ops->release(sock); ... } sock_release() 函数也很简单,就是调用对应 协议族 的 release() 方法,因为 Linux...= NULL) { u32 len = TCP_SKB_CB(skb)->end_seq - TCP_SKB_CB(skb)->seq - skb->h.th->fin;...TCP_SKB_CB(skb)->seq = tp->write_seq; TCP_SKB_CB(skb)->end_seq = TCP_SKB_CB(skb)->seq + 1;
前言我们可以使用BPF对Linux内核进行跟踪,收集我们想要的内核数据,从而对Linux中的程序进行分析和调试。...与其它的跟踪技术相比,使用BPF的主要优点是几乎可以访问Linux内核和应用程序的任何信息,同时,BPF对系统性能影响很小,执行效率很高,而且开发人员不需要因为收集数据而修改程序。...print_functionfrom bcc import BPFfrom time import sleep# define BPF programbpf_program = """#include <uapi/linux...;fn_name="trace_kfree_skb"指定了当内核函数kfree_skb有返回值时,执行程序中的trace_kfree_skb函数;4....命名约定,首先是指定要跟踪的子系统,这里是“skb:”,然后是子系统中的跟踪点“kfree_skb”:图片5.
Linux icmp 学习笔记 之一 icmp协议相关的格式 分类: linux 网络 2014-04-17 23:45 487人阅读 评论(0) 收藏 举报 Linux icmp...该报文的最终目的地不是一个应用程序或者目的设备上的用户,而是目的设备上的网际协议软件,一般icmp报文的接收是linux内核里的icmp接收模块来处理的,而icmp请求报文的发送即可以是内核里相关子系统也可以是应用层的程序发送...a) type类型 icmp类型目前有40个,下面几个是比较常用的,也是目前linux支持的类型。...4)、路由重定向(5)、时间戳请求与应答(13、14) 2、 主要的ICMP格式 a) 回显请求与应答 其中type值表示是一个回显请求或应答,code值为0,而identifier在linux...icmp 学习笔记 之二 icmp数据处理流程 分类: linux 网络 2014-04-21 00:27 925人阅读 评论(0) 收藏 举报 在分析icmp数据包处理流程之前
本篇简单分析Linux(2.6.32版本)中的IPIP隧道的实现过程,期望有所借鉴,造出轮子:-) 一....IPIP的初始化 Linux中的IPIP隧道文件主要分布在tunnel4.c和ipip.c文件中。...因为是三层隧道,在IP报文中填充的三层协议自然就不能是常见的TCP和UDP,所以,Linux抽象了一个隧道层,位置就相当于传输层,主要的实现就是在tunnel4.c中。...} if (skb->sk) skb_set_owner_w(new_skb, skb->sk); dev_kfree_skb...(skb); skb = new_skb; old_iph = ip_hdr(skb); } skb->transport_header
一、网络包接收过程 在图解Linux网络包接收过程一文中我们详细介绍了网络包是如何从网卡到达用户进程中的。这个过程我们可以简单用如下这个图来表示。...在25 张图,一万字,拆解 Linux 网络包发送过程一文中,我们详细描述过网络包的发送过程。发送过程可以汇总成简单的一张图。...skb_loop_sk(ptype, skb))) { if (pt_prev) { deliver_skb(skb2, pt_prev, skb->dev); pt_prev =...在 Linux 里,支持很多种协议族,在 include/linux/socket.h 中可以找到所有的定义。这里创建的是 packet 类型的 socket。...//file: include/linux/socket.h #define AF_UNSPEC 0 #define AF_UNIX 1 /* Unix domain sockets */ #define
领取专属 10元无门槛券
手把手带您无忧上云