首页
学习
活动
专区
圈层
工具
发布

Linux 是如何收发网络包的?

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

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

    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

    2.5K30

    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.7K30

    Linux 网络层收发包流程及 Netfilter 框架浅析

    2.3 sk_buff 结构 在 Linux 内核中,系统使用 sk_buff 数据结构对数据包进行存储和管理。...使用图形表示 sk_buff 的结构如下: 在 sk_buff 数据结构中包含了诸多关于数据包存储,定位和管理的指针,数据包在网络协议栈各层次之间进行传输的过程中,内核通过操作指针的方式对数据包进行逐层解析...struct sk_buff *skb,                    const struct net_device *in,                    const struct ...代码如下所示: #include linux/module.h> #include linux/kernel.h> #include linux/types.h> #include linux/...skbuff.h> #include linux/ip.h> #include linux/udp.h> #include linux/tcp.h> #include linux/netfilter.h

    6.6K33

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

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

    2.6K22

    网卡的 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_buff ,sk_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

    2.5K10

    【Linux网络编程】传输协议UDP

    知名端口号 ssh 服务器, 使用 22 端口 ftp 服务器, 使用 21 端口 telnet 服务器, 使用 23 端口 http 服务器, 使用 80 端口 https 服务器, 使用 443 在Linux...理解端口号和进程的关系 进程在Linux内核中实际上是一个struct task_struct,这就是描述进程的一个结构体。...描述报文的结构体为struct sk_buff,内部有数据包的头信息、数据、缓冲区等。将应用层数据拷贝到缓冲区实际上是将应用层数据拷贝到缓冲区,此时有了数据。...struct sk_buff { struct sk_buff *next; // 指向下一个 sk_buff(链表结构) struct sk_buff *prev...的实际大小(包括头部、数据区和尾部) struct sk_buff *next_free; // 用于内核的 sk_buff 内存池中的链表 struct sock *

    98810

    来,今天飞哥带你理解 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 项目中也经常能见着对它的身影。

    3.3K31
    领券