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

Linux 是如何收发网络包的?

之前写过一篇:你不好奇 Linux 是如何收发网络包的? 文章。 当时有些地方写的比较笼统,然后我「把 Linux 接收+发送网络包的流程」这部分内容完善了下,现在重新分享给大家。 发车发车!...事实上,我们比较常见,也比较实用的是四层模型,即 TCP/IP 网络模型,Linux 系统正是按照这套网络模型来实现网络协议栈的。...Linux 发送网络包的流程 如上图的右半部分,发送网络包的流程正好和接收流程相反。...TCP/IP 模型主要分为应用层、传输层、网络层、网络接口层四层,每一层负责的职责都不同,这也是 Linux 网络协议栈主要构成部分。...---- 参考资料: 《深入理解Linux网络》 Linux 网络数据接收流程(TCP)- NAPI:https://wenfh2020.com/2021/12/29/kernel-tcp-receive

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

Linux中一个网络包的发送接收流程

结构体的链表组成,其中一个sk_buff数据结构对应一个网络包;这个结构体后面会详细讲,是Linux实现网络协议栈的核心数据结构。...2. sk_buff数据结构解析 通过对sk_buff数据结构解析,窥见Linux中的一些设计思想; 进行协议头的增添 我们知道,按照网络栈的设定,发送网络包时,每经过一层,都会增加对应协议层的协议首部...,因此Linux采用在sk_buff中的一个Union结构体进行标识: struct sk_buff { union { struct tcphdr *th; // TCP...结构),Linux会尝试将当前包合并到SEND-Q的最后一个sk_buff结构中 (粘包) ; 考虑我们上述的768bytes的结构体为SEND-Q的最后一个sk_buff,当用户进程继续调用write...在真实创建的时候会设置大小2048*2=4096,因为linux除了要考虑用户的应用层数据,还需要考虑linux自身数据结构的开销-协议头部、指针、非线性内存区域结构等... sk_buff结构中通过sk_wmem_queued

1.9K30

Linux的以太网驱动(基于Zynq XC7Z020)

Linux以太网驱动架构 linux以太网架构共包含三个部分 1 linux的网络架构 2 以太网mac数据驱动(收发) 3 以太网phy的驱动 linux的网络驱动架构及流程 申请注册及初始化设备 1...在中断中关闭接收中断并启用napi调度 if (napi_schedule_prep(&bp->napi)) { __napi_schedule(&bp->napi); } 发送 上层协议会将数据保存在sk_buff...中通过 eth_start_xmit(struct sk_buff *skb, struct net_device *dev)函数传下来,eth_start_xmit这个函数包含在之前的注册函数中...ndev->netdev_ops = ðps_netdev_ops; 在这个函数中,我们要做的 1 将sk_buff中传过来的有效数据放入缓冲区 2 将缓冲区的数据通过mac发送出去 以太网mac...发送 发送的数据地址已经保存在sk_buff ,根据其数量,将其分成一块块的数据,每块大小为描述符所指向的缓存大小,再将描述符相应的状态位做上标记(置1或置0)。就可以将数据发送出去了。

1.2K30

Linux 网络设备驱动开发(一) —— linux内核网络分层结构

Linux内核对网络驱动程序使用统一的接口,并且对于网络设备采用面向对象的思想设计。    Linux内核采用分层结构处理网络数据包。...二、与网络有关的数据结构    内核对网络数据包的处理都是基于sk_buff结构的,该结构是内核网络部分最重要的数据结构。 网络协议栈中各层协议都可以通过对该结构的操作实现本层协议数据的添加或者删除。...使用sk_buff结构避免了网络协议栈各层来回复制数据导致的效率低下。...图片    sk_buff结构可以分为两个部分,一部分是存储数据包缓存,在图中表示为PackertData,另一部分是由一组用于内核管理的指针组成。       ...对于一个TCP数据包为例,sk_buff还提供了几个指针直接指向各层协议头。

1.8K21

网卡的 Ring Buffer 详解

网卡处理数据包流程 网卡处理网络数据流程图: 图片来自参考链接1 上图中虚线步骤的解释: 1 DMA 将 NIC 接收的数据包逐个写入 sk_buff ,一个数据包可能占用多个 sk_buff , sk_buff...4 poll 函数对数据进行检查,例如将几个 sk_buff 合并,因为可能同一个数据可能被分散放在多个 sk_buff 中。 5 poll 函数将 sk_buff 交付上层网络栈处理。...3 DMA 将 NIC 接收的数据包逐个写入 sk_buff ,一个数据包可能占用多个 sk_buffsk_buff 读写顺序遵循FIFO(先入先出)原则。...7 poll 函数对数据进行检查,例如将几个 sk_buff 合并,因为可能同一个数据可能被分散放在多个 sk_buff 中。8 poll 函数将 sk_buff 交付上层网络栈处理。...参考链接: https://ylgrgyq.github.io/2017/07/23/linux-receive-packet-1/ https://heapdump.cn/article/3947686

1.5K10

来,今天飞哥带你理解 iptables 原理!

Linux 内核网络栈是一个纯内核态的东西,和用户层功能是天然隔离。但为了迎合各种各样用户层不同的需求,内核开放了一些口子出来供用户干预。...Linux 在内核网络组件中很多关键位置布置了 netfilter 过滤器。Iptables 就是基于 netfilter 来实现的。...一、Iptables 中的五链 Linux 下的 netfilter 在内核协议栈的各个重要关卡埋下了五个钩子。每一个钩子都对应是一系列规则,以链表的形式存在,所以俗称五链。...3.1 nat 假如说我们有一台 Linux,它的 eth0 的 IP 是10.162.0.100,通过这个 IP 可以访问另外其它服务器。...Linux 上的防火墙、nat 等基础功能都是基于它实现的。还有现如今流行的的 Docker、Kubernets、Istio 项目中也经常能见着对它的身影。

1.8K20

Linux 网卡数据收发过程分析

所以,当网卡接收到数据包后,要通知 Linux 内核有数据需要处理。另外,网卡驱动应该提供让 Linux 内核把数据把发送出去的接口。...net_device 结构是 Linux 为了适配不同类型的网卡设备而抽象出来的对象,不同的网卡驱动只需要按 Linux 的规范来填充 net_device 结构的各个成员变量,Linux 内核就能够识别出网卡...int (*stop)(struct net_device *dev); // 关闭设备时调用的接口 // 发送数据接口 int (*hard_start_xmit)(struct sk_buff...return; } ei_receive 函数主要完成以下几个工作: 申请一个 sk_buff 数据包对象,并且设置其 dev 字段为接收数据包的设备。...通过调用 ei_block_input 函数从网卡中读取接收到的数据,并保存到刚申请的 sk_buff 数据包对象中。ei_block_input 函数是由网卡驱动实现的,所以这里不作详细分析。

2.3K30
领券