首页 > 其他分享 >23 网络数据在内核中流转

23 网络数据在内核中流转

时间:2023-05-03 16:13:45浏览次数:36  
标签:调用 lwip 23 netconn 流转 网卡 内核 数据

一次具体的网络收发过程:

发送过程:

应用程序准备好数据,调用用户态下的库函数,调用系统API接口函数,进入到内核态;内核态对应的系统服务函数会复制应用程序的数据到内核的内存空间中,然后将数据移交给网络协议栈,在网络协议栈中将数据层层打包;最后,包装好的数据会交给网卡驱动,网卡驱动程序负责将打包好的数据写入网卡并让其发送出去;

接收过程:

网卡接收到数据,通过DMA方式复制到指定的内存,接着发送中断,以便通知网卡驱动,由网卡驱动处理中断复制数据;然后网络协议收到网卡驱动传过来的数据,层层解包,获取真正的数据;最后将这个数据发送到用户态监听的应用进程;

      

LwIP架构:light weight IP

TCP/IP协议的轻量级开源项目;C语言实现的,一共有两套接口层,向上提供给用户,向下提供给系统;保持TCP协议主要功能 的基础上减少对 RAM的占用;同时,还支持ipv6 标准实现;

LwIP结构分为四层:OS层,API层,核心层,硬件驱动层;

第一层:通过netconn 或 lwip_api 使用 lwip 的各种功能函数;

第二层:api层是netconn的功能代码所在的层;

第三层:lwip的核心层存放了TCP/IP协议的核心代码;实现TCP、UDP功能,还实现了 DNS、ICMP、IGMP等协议;同时也实现 了内存管理、网络接口功能;sys_arch模块便于移植到不同的OS上;

第四层:硬件驱动层提供PHY芯片驱动,用来匹配 lwip 的使用;lwip会调用该层的代码将组装好的 数据包发送到网络;同时从网络接收数据包并进行分析,实现通信功能;

lwip的三套应用程序编程接口:

RAW/Callback API、顺序 API 和 Socket API;

lwip 执行流程:

数据发送:

把lwip 作为 cosmos 的一个内核组件来工作;由 lwip 接收来自内核上层发来的数据,内核上层先调用lwip的netconn层的接口函数 netconn_write 函数,数据正式流进lwip 组件层;

接着,netconn层调用 lwip 组件的tcp层的接口函数tcp_write ,在tcp层对数据首次进行打包,然后tcp层将打包好的数据通过io_output 函数,向下传递给lwip组件的IP层,进行打包;

最后,IP层将打包的数据发送给网卡驱动接口层netif ,调用实际的网卡驱动程序,将数据发送出去;

    

数据接收:

应用程序首先调用 lwip 的netconn 层的 netconn_recv接口,然后由 netconn 层调用sys_arch_mbox_fetch 函数,进入监听等待相关的mbox;

接着,数据会进入网卡,驱动程序相关的函数负责把它复制到内存;再然后是调用ethernet_input 函数,进入ethernet 层;调用ip4_input 函数,数据在lwip组件ip层对数据解包,进行相应的处理,还会调用tcp_input 函数,进入lwip 组件的tcp 层对数据解包;

最后,调用 sys_mbox_trypost 函数把数据放入特定的 mbox,等待监听的应用程序得到数据;

协议栈移植:

有两种:无操作系统模式、有操作系统模式(sys_arch 层的接口函数);

带操作系统的移植就是无操作系统的基础上添加操作系统的模拟层;

操作系统主要基于操作系统的 IPC机制(Inter-process Communication,进程间通信),对网络连接进行了抽象,保证内核与应用层API的通讯,好处是lwip 内核线程可以只负责数据包的TCP/IP的封装和拆封,不用进行数据的应用层处理,极大提高系统对网络数据包的处理效率;

有操作系统的模式:

完整的移植网络栈,需要移植30多个函数实现;这些变量和函数主要面向信号量,互斥体和邮箱,包括创建删除、释放和获取等操作;

在lwip中,用户代码通过邮箱与协议栈内部交互,邮箱本质上是指向数据的指针;API 将指针传递给内核,内核通过这个指针访问数据,然后进行处理;内核也是通过邮箱将数据传递给用户代码的;

 

标签:调用,lwip,23,netconn,流转,网卡,内核,数据
From: https://www.cnblogs.com/xuan01/p/17369077.html

相关文章

  • kubevirt实验部署:k8s1.23.17+kube-ovn+nfs+kubevirt+ceph 集成使用
    标签(空格分隔):kubernetes系列一:kubevirt的简介KubeVirt是一个Kubernetes插件,它为Kubernetes提供了在与容器相同的基础结构上提供、管理和控制虚拟机的能力。KubeVirt是由云原生计算基金会(CNCF)赞助的开源项目,目前正处于孵化阶段。KubeVirt使Kubernetes能够使用与容器化工作负......
  • 2023.5
    5.3模拟赛A:这个东西明显是个诈骗啊,我想了很久那个小数有什么特殊。然后就没有做出来。实际上画画图就会发现全是1的情况不可能取到。所以问题转化为多个连通块,选出\(m\)个点,然每个连通块最多只有一个。这是简单的。......
  • 23 IIC(一)IIC协议简介
    1硬件连接IIC硬件接线一般如下所示。从主控芯片引出两根线SCL和SDA。外加一个上拉电阻2数据传输格式2.1写操作主控芯片发出start信号主控芯片发出一字节的数据。前7bit为设备地址,最后一bit为方向:0表示写,1表示读主设备等待从设备应答主设备接到从设备的应答后开始发送......
  • 20230429 模拟赛(jnxxhzz)
    T1.神奇零食柜略,oj上交要加快读T2.防御工事数据范围:\(1\len,m\le100\)不难想到是网络流(虽然我没想到……)这是一个挺基础的网络流对于每个\(V\),我们将它们连到一个超级源点上在往它的四个方向分别建边最后把所有的\(M\)连到一个汇点上而在建边时注意其实\(E->E\)的边......
  • 2023.5.1——软件工程日报
    所花时间(包括上课):0h代码量(行):0行博客量(篇):1篇今天,数学建模比赛中。。。我了解到的知识点:数学建模的相关知识......
  • prometheus123456
    #catprometheus/prometheus-consul.ymlglobal:scrape_interval:15s#Setthescrapeintervaltoevery15seconds.Defaultisevery1minute.evaluation_interval:15s#Evaluaterulesevery15seconds.Th......
  • 2023-05-02 量学基础 换挡买点
    1.放量上攻,缩量下跌,阳盖阴买入  1.放量上攻,缩量下跌,阳盖阴买入案例1:李16期答疑课2020年5月2号271.位置:攻守冲防的冲的位置2.压力:上方还有一堆套牢盘,所以无法直接上攻3.当下:(1)高量(2)第二天缩量站上高量(3)第三天首阴,放量阴,压力位(4)之后缩量调整。4.买入:(1)底部阳盖......
  • day63(2023.5.2)
    1.函数 2.对象概述 3.Math对象 4.Date对象 运行结果: 5.DOM概述 ......
  • Linux 内核组织(kernel.org)将关闭 FTP 服务
    Linux 内核组织(kernel.org)是一家建立于2002年的加利福尼亚公共福利公司,其目的是公开地免费分发Linux内核和其它开源软件。它接受Linux基金会的管理,包括技术、资金和人员支持,用以维护kernel.org 的运营。Linux内核组织是Linux内核发布的官方场所,在其站点上可以找......
  • Linux 内核组织(kernel.org)将关闭 FTP 服务
    Linux 内核组织(kernel.org)是一家建立于2002年的加利福尼亚公共福利公司,其目的是公开地免费分发Linux内核和其它开源软件。它接受Linux基金会的管理,包括技术、资金和人员支持,用以维护kernel.org 的运营。Linux内核组织是Linux内核发布的官方场所,在其站点上可以找......