首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

网络数据包的接收过程

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()中执行。

28110

网络数据包的接收过程

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()中执行。

30810
您找到你想要的搜索结果了吗?
是的
没有找到

使用 ebpf 深入分析容器网络 dup 包问题

既然把黑盒般的内核研究透彻是一件难于上青天的事情,那么我们是否可以尝试开发出一种工具旨在让 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

1.2K41

OVS BUG撸码回忆录 •上篇

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

1.3K70

Linux内核编程_linux内核开发工具

【转载】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已经提供了很多现成的东西,可以保证快速开发。但是内核本身架构是一个通用计算机,不是专门针对网络处理的。

13K20

使用 ebpf 深入分析容器网络 dup 包问题

既然把黑盒般的内核研究透彻是一件难于上青天的事情,那么我们是否可以尝试开发出一种工具旨在让 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

95240

使用 ebpf 深入分析容器网络 dup 包问题

既然把黑盒般的内核研究透彻是一件难于上青天的事情,那么我们是否可以尝试开发出一种工具旨在让 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

1.3K10

Netfileter & iptables 实现(一)— Netfilter实现

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 之上的。

1.5K20

Linux 网络中断下半部处理

在 上一篇文章 中,我们介绍了网卡接收和发过数据在 Linux 内核中的处理过程,我们先来回顾一下网卡接收和发送数据的过程,如 图1 所示: ?...为了避免这种情况出现,Linux 内核把中断处理分为:中断上半部 和 中断下半部,上半部在关闭中断的情况下进行,而下半部在打开中断的情况下进行。...对于 Linux 内核的中断处理机制可以参考我们之前的文章 Linux中断处理,这里就不详细介绍了。在本文中,我们只需要知道网络中断下半部处理例程为 net_rx_action 函数即可。...pt_prev) { atomic_inc(&skb->users); // 如处理IP协议数据包的 ip_rcv...ptype; } } if (pt_prev) { // 如处理IP协议数据包的 ip_rcv

2.3K50

IP 数据包接收过程

... } 从上面的代码可以看到,在 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

1.1K30

IP协议源码分析

当然,这篇文章并不是介绍 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

70020

云原生场景下,nettrace怎么快速进行网络故障诊断?

工具简介 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点 看腾讯技术、学专家经验 点赞|分享|在看 传递好技术

2.3K40

在云原生场景中,nettrace 如何快速进行网络故障诊断

在开源 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和操作系统相关话题感兴趣,扫描下方二维码,加入鹅厂技术社区用户群,可了解最新社区动态,与鹅厂志同道合的朋友们一起畅聊内核技术

1.8K20

OpenCloudOS 如何利用 nettrace 进行网络故障诊断

在开源 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

1.6K30
领券