Linux 网络架构 Linux 网络初始化 网络设备子系统初始化 网卡驱动初始化 协议栈初始化 数据包的接收过程 硬中断处理 ksoftirqd 软中断处理 协议栈处理 应用层处理 总结 这里深度理解一下在...Linux 网络架构 在Linux内核实现中,链路层协议靠网卡驱动来实现,内核协议栈来实现网络层和传输层。内核对更上层的应用层提供socket接口来供用户进程访问。...我们用Linux的视角来看到的TCP/IP网络分层模型应该是下面这个样子的。...Linux 网络初始化 网络设备子系统初始化 linux内核通过调用subsys_initcall来初始化各个子系统,其中网络子系统的初始化会执行到net_dev_init函数: //net/core/...后面我们会看到软中断中会通过ptype_base找到ip_rcv函数地址,进而将ip包正确地送到ip_rcv()中执行。
后面我们会看到软中断中会通过ptype_base找到ip_rcv函数地址,进而将ip包正确地送到ip_rcv()中执行。...扩展一下,如果看一下ip_rcv和udp_rcv等函数的代码能看到很多协议的处理过程。...ip_rcv 函数地址就是存在这个 hash table中的。...对于ip包来讲,就会进入到ip_rcv(如果是arp包的话,会进入到arp_rcv)。...内核线程ksoftirqd线程发现有软中断请求到来,先关闭硬中断 5. ksoftirqd线程开始调用驱动的poll函数收包 6. poll函数将收到的包送到协议栈注册的ip_rcv函数中 7. ip_rcv
相信这对你的工作将会有非常大的帮助(本文将以Linux为例,源码基于Linux 3.10,源代码参见:https://mirrors.edge.kernel.org/pub/linux/kernel/v3...后面我们会看到软中断中会通过ptype_base找到ip_rcv函数地址,进而将ip包正确地送到ip_rcv()中执行。...扩展一下,如果看一下ip_rcv和udp_rcv等函数的代码能看到很多协议的处理过程。...ip_rcv 函数地址就是存在这个 hash table中的。...对于ip包来讲,就会进入到ip_rcv(如果是arp包的话,会进入到arp_rcv)。
既然把黑盒般的内核研究透彻是一件难于上青天的事情,那么我们是否可以尝试开发出一种工具旨在让 Linux 主机网络对一般开发运维人员来说成为一个彻底的白盒?...通过 Linux 内核提供的 ebpf 去 hook 关键路径函数 优点:轻量,安全,易于编写及调试。...缺点:ebpf 不支持循环,有些功能需要通过比较 trick 的方式实现;ebpf 当前属于比较新的技术,很多特性需要高版本内核的支持才更加完善,具体可参考『BPF Features by Linux...出现该问题的关键点在于,为了使 cbr0 能够抓到数据包,br_handle_frame_finish 多 clone 出了一份 skb,往上走到了 Node 节点的 ip_rcv 。...BPF Features by Linux Kernel Version https://github.com/iovisor/bcc/blob/master/docs/kernel-versions.md
packet_type ip_packet_type __read_mostly = { .type = cpu_to_be16(ETH_P_IP), .func = ip_rcv...linux内核为了高性能,很喜欢用rwlock的改进版rcu,这种思想是值得借鉴的。 ...switch (rx_handler(&skb)) // 交给rx_handler处理,例如ovs, linux bridge等 此类接口处理报文在协议栈之前,因此netfilter对此类接口不起作用,...所以在云环境(openstack)中,需要在虚拟机tap口与虚拟交换机之间增加Linux bridge设备来使报文经过协议栈(netfilter起作用)来实现security group。...ptype; //很喜欢这种写法 } } }->deliver_skb{ pt_prev->func // 如ip,则对应的就是ip_rcv
function 跟踪器可以跟踪内核函数的调用情况,可用于调试或者分析 bug ,还可用于了解和观察 Linux 内核的执行过程。...追加到跟踪函数中: # cd /sys/kernel/debug/tracing # echo ip_rcv >> set_ftrace_filter # cat set_ftrace_filter...# cat set_ftrace_filter dev_attr_store dev_attr_show ip_rcv # echo '!...github.com/rostedt/trace-cmd.git](https://github.com/rostedt/trace-cmd.git) export CROSS_COMPILE=aarch64-linux-gnu...,除了使用上一节的trace-cmd report命令,还可以使用kernelshark图形化的形式来查看,可以在板子上使用trace-cmd record 记录事件,把得到的trace.data放到linux
1.1 接收过程 Linux 在网络包接收在 IP 层的入口函数是 ip_rcv。网络在这里包碰到的第一个 HOOK 就是 PREROUTING。当该钩子上的规则都处理完后,会进行路由选择。...我们来看下详细的代码,先看 ip_rcv。...//file: net/ipv4/ip_input.c int ip_rcv(struct sk_buff *skb, ......){ .........在 ip_rcv 中经过 PREROUTING 链,然后路由后发现不是本设备的包,那就进入 ip_forward 函数进行转发,在这里又会遇到 FORWARD 链。...我们来过一下源码,先是进入 IP 层入口 ip_rcv,在这里遇到 PREROUTING 链。
【转载】Linux内核编程与应用编程对比 转载链接1:http://www.arrowapex.cn/archives/66.html 在此之前也不清楚linux内核编程跟用户应用程序编程之间有什么不同...于是我去查看了相关代码,当PF_PACKET的接受包函数,会检查skb是否被共享,如果是共享的就clone一份,ip_rcv入口处也有类似的代码。...那么当该应用程序运行时,就意味着ip_rcv会检测发现这个skb是共享的,于是就会clone一份。这就是该应用程序运行时与不运行时,内核处理数据包流程的最大区别。...于是,我修改ip_rcv的代码,不再坚持skb是否是共享,而是直接clone。果然,内核在不启动该应用程序时候,依然崩溃。这样就证明了,问题还是出自自己的代码处,而且是与skb相关的代码。...对于在linux内核实现网关的某些功能时,我发现,虽然linux已经提供了很多现成的东西,可以保证快速开发。但是内核本身架构是一个通用计算机,不是专门针对网络处理的。
Netfilter挂载点) 在 图1 中,蓝色部分就是 Netfilter 挂载钩子函数的位置,所以 Netfilter 定义了 5 个常量来表示这 5 个位置,如下代码: // 文件:include/linux...前面我们介绍过,Netfilter 通过链表来存储钩子函数,而钩子函数是通过结构 nf_hook_ops 来描述的,其定义如下: // 文件:include/linux/netfilter.h struct...比如数据包进入 IPv4 协议层的处理函数 ip_rcv 函数中就调用了 NF_HOOK 宏来处理数据包,代码如下: // 文件:net/ipv4/ip_input.c int ip_rcv(struct...return NF_HOOK(PF_INET, NF_IP_PRE_ROUTING, skb, dev, NULL, ip_rcv_finish); } 如上代码所示,在 ip_rcv 函数中调用了 NF_HOOK...六、总结 本文主要介绍了 Netfilter 的实现,因为 Netfilter 是 Linux 网络数据包过滤的框架,而 iptables 就是建立在 Netfilter 之上的。
在 上一篇文章 中,我们介绍了网卡接收和发过数据在 Linux 内核中的处理过程,我们先来回顾一下网卡接收和发送数据的过程,如 图1 所示: ?...为了避免这种情况出现,Linux 内核把中断处理分为:中断上半部 和 中断下半部,上半部在关闭中断的情况下进行,而下半部在打开中断的情况下进行。...对于 Linux 内核的中断处理机制可以参考我们之前的文章 Linux中断处理,这里就不详细介绍了。在本文中,我们只需要知道网络中断下半部处理例程为 net_rx_action 函数即可。...pt_prev) { atomic_inc(&skb->users); // 如处理IP协议数据包的 ip_rcv...ptype; } } if (pt_prev) { // 如处理IP协议数据包的 ip_rcv
... } 从上面的代码可以看到,在 ip_init 函数中调用了 dev_add_pack(&ip_packet_type) 函数来注册了 IP 协议的处理接口,而 IP 协议的处理接口为 ip_rcv...(pt_prev) { atomic_inc(&skb->users); // 如处理IP协议数据包的 ip_rcv...return; } 现在就非常清晰了,就是根据数据包的网络层协议类型,然后从 ptype_base 数组中找到对应的处理接口处理数据包,如 IP 协议的数据包就调用 ip_rcv 函数处理。...处理IP数据包 通过上面的分析,我们知道当内核接收到一个 IP 数据包后,会调用 ip_rcv 函数处理这个数据包,下面我们来分析一下 ip_rcv 函数的实现: int ip_rcv(struct...inhdr_error: IP_INC_STATS_BH(IpInHdrErrors); drop: kfree_skb(skb); out: return NET_RX_DROP; } ip_rcv
当然,这篇文章并不是介绍 IP协议 的原理,有关 IP协议 的原理可以参考经典的书籍《TCP/IP协议详解》,而这篇文章主要介绍的是 Linux 内核怎么实现 IP协议。...接下来,我们通过源码来分析 Linux 内核是怎么实现 IP协议 的,我们主要分析 IP 数据包的发送与接收过程。...IP数据包的接收 IP数据包的接收是通过 ip_rcv() 函数完成的,当网卡接收到数据包后,会上送到内核协议栈的链路层,链路层会根据链路层协议(如以太网协议)解析数据包。...然后再将解析后的数据包通过调用 ip_rcv() 函数上送到网络层的 IP协议,ip_rcv() 函数的实现如下: int ip_rcv(struct sk_buff *skb, struct net_device...inhdr_error: IP_INC_STATS_BH(IpInHdrErrors); drop: kfree_skb(skb); out: return NET_RX_DROP; } ip_rcv
工具简介 1)背景 在一些场景下(特别是云原生场景),Linux 系统中的网络部署变得越来越复杂。...需要对内核有一定了解,入手难;dropwatch:功能单一,只能查看网络丢包问题,且无法得到丢包原因和解决方案; 在此背景下,笔者结合多年的 Kernel 网络协议栈故障定位经验,基于 eBPF 开发了 Linux...值得一提的是,Linux操作系统OpenCloudOS 8.6(点击阅读原文下载体验OpenCloudOS ISO)增加了内核对网络工具nettrace的支持,允许开发者通过 bpf 进行网络丢包原因跟踪...netif_receive_skb_core] ICMP: 169.254.128.15 -> 172.27.0.6 ping request, seq: 48220[1272349.614585] [ip_rcv...| 从Linux零拷贝深入了解Linux-I/O 技术盲盒:前端|后端|AI与算法|运维|工程师文化 关注我并点亮星标 工作日晚8点 看腾讯技术、学专家经验 点赞|分享|在看 传递好技术
在开源 Linux 操作系统 OpenCloudOS 8.6 中,增加了内核对网络工具 nettrace 的支持,允许开发者通过 bpf 进行网络丢包原因跟踪,内核也同时回合相关的丢包跟踪点。...背景在一些场景下(特别是云原生场景),Linux 系统中的网络部署变得越来越复杂。...,需要对内核有一定了解,入手难dropwatch:功能单一,只能查看网络丢包问题,且无法得到丢包原因和解决方案在此背景下,笔者结合多年的 Kernel 网络协议栈故障定位经验,基于 eBPF 开发了 Linux...netif_receive_skb_core] ICMP: 169.254.128.15 -> 172.27.0.6 ping request, seq: 48220[1272349.614585] [ip_rcv...OpenCloudOS ISO 下载地址如果在使用过程中遇到技术问题,或您对Linux和操作系统相关话题感兴趣,扫描下方二维码,加入鹅厂技术社区用户群,可了解最新社区动态,与鹅厂志同道合的朋友们一起畅聊内核技术
本篇简单分析Linux(2.6.32版本)中的IPIP隧道的实现过程,期望有所借鉴,造出轮子:-) 一....IPIP的初始化 Linux中的IPIP隧道文件主要分布在tunnel4.c和ipip.c文件中。...因为是三层隧道,在IP报文中填充的三层协议自然就不能是常见的TCP和UDP,所以,Linux抽象了一个隧道层,位置就相当于传输层,主要的实现就是在tunnel4.c中。...IPIP的接收 我们之前说到过,对应从网卡收上来的报文,过完链路层后就会到ip_rcv()中,大概是这样的路线: ip_rcv()->ip_rcv_finish()->ip_local_deliver
> #include #include #include #include #define PTCP_WATCH_PORT 80 /* HTTP port */ static struct nf_hook_ops nfho; static.../git/torvalds/linux.git$ cd linux/$ git checkout v3.13 Kernel sources from your distro....E.g. in Debian you can just install linux-sourcepackage (sources will be installed to /usr/src)....Netfilter hook is called in ip_rcv() function (here), so you are basically working in IPv4 layer (which
在开源 Linux 操作系统 OpenCloudOS 8.6 中,增加了内核对网络工具 nettrace 的支持,允许开发者通过 bpf 进行网络丢包原因跟踪,内核也同时回合相关的丢包跟踪点。...背景 在一些场景下(特别是云原生场景),Linux 系统中的网络部署变得越来越复杂。...需要对内核有一定了解,入手难 dropwatch:功能单一,只能查看网络丢包问题,且无法得到丢包原因和解决方案 在此背景下,笔者结合多年的 Kernel 网络协议栈故障定位经验,基于 eBPF 开发了 Linux...netif_receive_skb_core] ICMP: 169.254.128.15 -> 172.27.0.6 ping request, seq: 48220 [1272349.614585] [ip_rcv... ] ICMP: 169.254.128.15 -> 172.27.0.6 ping request, seq: 56464 [1273732.110189] [ffff889be8fbcd00][ip_rcv
领取专属 10元无门槛券
手把手带您无忧上云