返回顶部
首页 > 资讯 > 操作系统 >Linux网络包从中断到接收的示例分析
  • 775
分享到

Linux网络包从中断到接收的示例分析

2023-06-15 23:06:51 775人浏览 安东尼
摘要

这期内容当中小编将会给大家带来有关linux网络包从中断到接收的示例分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。 linux既然要讲,那就把一个包的整个包生都说了算了触发中断在非虚拟化环境

这期内容当中小编将会给大家带来有关linux网络包从中断到接收的示例分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

 

Linux网络包从中断到接收的示例分析

linux

既然要讲,那就把一个包的整个包生都说了算了

触发中断

  • 在非虚拟化环境下,网卡通过DMA将packet写入内核的rx_ring环形队列缓冲区,并触发中断。

  • 如果在虚拟化环境下,VMM配置GIC ITS (Interrupt Translation Service)  ,建立物理中断与虚拟中断的映射完成中断虚拟化使得网卡能直接向VM发出中断,同时通过IO虚拟化,网卡通过IOMMU将packet直接写入虚拟机内核的rx_ring

Top Half

  • CPU在收到中断之后,调用网卡ISR也就是所谓的中断handler

  • 分配sk_buf并入input_pkt_queue(如果队列已满则丢弃)

  • 发出一个软中断NET_RX_SOFTIRQ,软中断可以被调度例如通过tasklet

Bottom Half

  • sk_buf从input_pkt_queue传入process_queue,根据协议类型调用网络层协议的handler

  • ip_rcv执行包头检查,ip_router_input()进行路由,决定本机/转发/丢弃

  • tcp_v4_rcv执行包头检查,tcp_v4_lookup查询对应的Socket和connection,如果正常,tcp_prequeue将skb放进socket接收队列

  • socket随即唤醒所在的进程

Linux网络包从中断到接收的示例分析

kqueue

因为epoll没有论文,就说说kqueue是怎么做的吧,kqueue会根据socket绑定的knote链表(每个监听的kqueue都可能创建一个knote),将knote通过反向指针获得kqueue,将knote加入kqueue的就绪队列末尾。如果此时恰好有进程正在监听的话,将会唤醒进程,kqueue会被扫描,并从就绪队列处获得所有的event,从而了解已经就绪的所有socket。

  • 唤醒的进程调用socket recv系统调用,如果是TCP则调用tcp_recvmsg从sk_buffer拷贝数据

Batch

netif_receive_skb_list()

Linux的Napi还会继续延迟软中断的处理,等待其积累足够的skb后进行轮询,一次性处理所有的skb。

SKB

skb并不是直接存储报文,而是存储指针,指针只需要移动,就能完成解包,而本身的报文并不需要修改。上一层的协议栈会在处理当前层的同时设置好下一层的头指针,并且移动data指针。与此同时,skb本身是双向链表实现的队列。qlen为链表元素长度,lock为添加元素时的

Linux网络包从中断到接收的示例分析

skb结构

谈到指针的用法,这里举个做OS lab时印象深刻的奇淫巧技,也是C的指针变态的地方

#define list_entry(ptr, type, field) \     container_of(ptr, type, field) #define container_of(ptr, type, field) \     ((type *)((void *)(ptr) - (u64)(&(((type *)(0))->field))))

(u64)(&(((type  *)(0))->field))))指的是field在结构体type中的偏移量,通过减去这个偏移量我们就能找出某个对象所在上级type对象的地址,也就是container。

一般来说,我们都会使用下面这样的方式,让链表节点去包裹数据。

struct page_list_node {         struct page p;     struct list_node *prev;     struct list_node *next; };

但是,通过指针操作,却可以让数据去包裹链表节点

struct list_head {     struct list_head *prev;     struct list_head *next; };  struct page{     struct list_head      list_node; }

在仅仅知道链表节点的情况下,借助成员偏移量即可知道容器对象的位置并取出

list_entry(somenode,struct page,list_node);

list_head本身可以存在于任何对象上,而他们的entry却能根据参数而指向不同的类型,感觉有点泛型的味道了。

内容来自SJTU,IPADS OS-16-Network

上述就是小编为大家分享的Linux网络包从中断到接收的示例分析了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注编程网操作系统频道。

--结束END--

本文标题: Linux网络包从中断到接收的示例分析

本文链接: https://lsjlt.com/news/281801.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Linux网络包从中断到接收的示例分析
    这期内容当中小编将会给大家带来有关Linux网络包从中断到接收的示例分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。 linux既然要讲,那就把一个包的整个包生都说了算了触发中断在非虚拟化环境...
    99+
    2023-06-15
  • Linux中网络系统的示例分析
    这篇文章主要介绍了Linux中网络系统的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。网络信息修改主机名# hostname node01&nbs...
    99+
    2023-06-22
  • linux中网络接口名称限制的示例分析
    这篇文章将为大家详细讲解有关linux中网络接口名称限制的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Linux中每个网络接口都有一个名称,可以使用ifconfig命令来查询当前系统中的接口。那...
    99+
    2023-06-12
  • Android网络监听和网络判断的示例分析
    本篇文章给大家分享的是有关Android网络监听和网络判断的示例分析,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一、在AndroidMainfest.xml中添加权限<...
    99+
    2023-06-21
  • 深入理解Linux网络——内核是如何接收到网络包的
    文章目录 一、相关实际问题二、数据是如何从网卡到协议栈的1、Linux网络收包总览2、Linux启动1)创建ksotfirqd内核线程2)网络子系统初始化3)协议栈注册4)网卡驱动初始化5)网...
    99+
    2023-09-06
    网络 linux tcp/ip 网卡 网络协议
  • Linux内核中断的示例分析
    这篇文章主要介绍了Linux内核中断的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。中断是指在CPU正常运行期间,由于内外部事件或由程序预先安排的事件引起的CPU暂时...
    99+
    2023-06-27
  • Linux 下sudo网络权限的示例分析
    这篇文章主要介绍了Linux 下sudo网络权限的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Linux 下sudo网络权限详解对于设置了网络代理的服务器,在当前用...
    99+
    2023-06-09
  • Linux系统网络配置的示例分析
    这篇文章主要为大家展示了“Linux系统网络配置的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Linux系统网络配置的示例分析”这篇文章吧。1、查看IP  Ifconfig2、配置IP...
    99+
    2023-06-10
  • Linux系统配置网络的示例分析
    这篇文章将为大家详细讲解有关Linux系统配置网络的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。简单介绍Linux的文件夹bin:存放的是用户的命令sbin:存放的是root用户的命令etc:存...
    99+
    2023-06-26
  • 从log4j2到Disruptor的示例分析
    这篇文章主要为大家展示了“从log4j2到Disruptor的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“从log4j2到Disruptor的示例分析”这篇文章吧。log4j2异步日志...
    99+
    2023-06-22
  • Node.js中网络与流的示例分析
    这篇文章给大家分享的是有关Node.js中网络与流的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。涉及的知识点libuv 中网络的实现libuv 解决 accept (E...
    99+
    2024-04-02
  • kubernetes中网络原理的示例分析
    小编给大家分享一下kubernetes中网络原理的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一:体系结构图二:说明1.网络命名空间处于不同命名空间的网...
    99+
    2023-06-04
  • kubernetes中网络模型的示例分析
    这篇文章主要介绍kubernetes中网络模型的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Kubernetes从Docker默认的网络模型中独立出来形成一套自己的网络模型。模型的基础原则是:每个Pod都拥...
    99+
    2023-06-04
  • Linux网络中数据包的接收过程是怎样的
    本篇文章为大家展示了Linux网络中数据包的接收过程是怎样的,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。下面将介绍在Linux系统中,数据包是如何一步一步从网卡传到进程手中的。如果英文没有问题,强...
    99+
    2023-06-16
  • 网络建设的示例分析
    小编给大家分享一下网络建设的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!第一、确立自己的目标网络建设,首先要确立一个目标,先要问一问自己,我为什么要做这...
    99+
    2023-06-10
  • Linux中断子系统domain的示例分析
    这篇文章主要介绍Linux中断子系统domain的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!随着现代CPU的复杂度加大,外设中断数量增加,实际上系统可能同时需要多个中断控制器进行级联,面对这样的趋势,Li...
    99+
    2023-06-27
  • Linux中mysql主从配置的示例分析
    这篇文章主要为大家展示了“Linux中mysql主从配置的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Linux中mysql主从配置的示例分析”这篇文...
    99+
    2024-04-02
  • Linux Kernel 2.6.35改善网络性能的示例分析
    这期内容当中小编将会给大家带来有关Linux Kernel 2.6.35改善网络性能的示例分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。又是一个季度过去了,Linus Torvalds也按期发布了Li...
    99+
    2023-06-16
  • linux中tcpdump抓取HTTP包的示例分析
    这篇文章将为大家详细讲解有关linux中tcpdump抓取HTTP包的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。tcpdumptcpdump是linux系统自带的抓包工具,主要通过命令行的方式...
    99+
    2023-06-10
  • Linux中软件包管理的示例分析
    这篇文章主要介绍Linux中软件包管理的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1、rpm RPM包管理器选项-q表示查询系统安装的软件包[root@centos7 ~]# rpm&...
    99+
    2023-06-16
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作