linux 网络栈?linux软件仓库

Linux 无线网络栈

Linux无线网络栈主要分为两大部分,MAC80211和CFG80211,前者提供给无线驱动建立与内核和用户空间的接口,后者则提供用户空间到内核的管理接口。Linux网络栈内,MAC层进一步细分为上层(UMAC)和下层(LMAC),UMAC主要处理MAC管理功能,LMAC则处理对时间要求严格的操作。

大部分时间,WiFi硬件在处理PHY和LMAC操作,UMAC则由Linux无线子系统处理。LMAC驱动在UMAC和芯片组之间扮演桥梁角色,完成设备初始化、注册等工作。对于全硬件实现的Full-MAC设备和软件实现的Soft-MAC设备,其处理方式有所不同。

在加载iwlmvm内核模块后,其通过iwl_op_mode_mvm_start()函数向mac80211的struct ieee80211_ops设置回调函数,完成初始化。struct ieee80211_ops通过ieee80211_alloc_hw()函数将驱动实现的句柄传递给mac80211子系统。在注册过程中,还需要调用iwww80211_register_hw()函数,以验证驱动开发者填写的信息与硬件支持信息是否相符。

在数据传输流程中,用户空间应用创建socket并绑定网络接口,将内容放入sk_buff进行发送。socket层后,数据通过网络协议层传递至设备无关层,dev_queue_xmit函数开始数据传输流程,最终调用ops->ndo_start_xmit(skb, dev)完成数据传输。对于WiFi设备,mac80211注册使用的netdev_ops接口,触发ieee80211_subif_start_xmit等函数进行数据传输。

接收路径中,设备驱动向内核注册中断处理程序,以在数据包到达时通知内核。数据从DMA导入驱动的私有管道,然后送入struct sk_buff,最后在ath10k_pci_napi_poll中被mac80211处理。信标帧中,hostapd生成的静态部分由mac80211插入动态部分,如时间戳。

什么是网络栈

Network stack(网络栈)是指计算机操作系统中实现网络协议的软件部分。它通常包括了多个网络协议层,每一层负责处理特定的任务。网络栈是现代计算机操作系统中非常重要的部分,因为它支持计算机与网络之间的通信,使得我们可以使用各种网络应用程序进行在线交流、工作和娱乐等活动。

通常在计算机上运行网络应用程序时,需要打开网络栈,否则计算机将无法连接到网络或与其他设备进行通信。网络栈通常在操作系统内核中实现,并且是默认开启的。但是,如果你的计算机上出现网络连接问题,你可能需要检查网络栈是否启用或遇到了任何故障。

有些防火墙或安全软件也可能会阻止网络栈的正常运行,这时您需要检查您的安全软件设置或联系网络管理员以解决问题。网络栈是计算机操作系统中非常重要的部分,它支持网络通信和在线应用程序的运行。

linux 网络路径中网络协议栈有几种

1.总述

Linux中用户空间的网络编程,是以socket为接口,一般创建一个sockfd= socket(family,type,protocol),之后以该sockfd为参数,进行各种系统调用来实现网络通信功能。其中family指明使用哪种协议域(如INET、UNIX等),protocol指明该协议域中具体哪种协议(如INET中的TCP、UDP等),type表明该接口的类型(如STREAM、DGRAM等),一般设protocol=0,那么就会用该family中该type类型的默认协议(如INET中的STREAM默认就是TCP协议)。

Linux中利用module机制,层次分明地实现了这套协议体系,并具有很好的扩展性,其基本模块构成如下:

先看右边,顶层的socket模块提供一个sock_register()函数,供各个协议域模块使用,在全局的net_family[]数组中增加一项;各个协议域模块也提供一个类似的register_xx_proto()函数,供各个具体的协议使用,在该协议域私有的xx_proto[]数组中增加一项。这两个数组中的存放的都是指针,指向的数据结构如下图所示:

很明显它们是用来创建不同类型的socket接口的,且是一种分层次的创建过程,可想而知,顶层socket_create()完成一些共有的操作,如分配内存等,然后调用下一层create;协议域内的create()完成一些该协议域内共有的初始化工作;最后具体协议中的create()完成协议特有的初始化。具体的下一节讲。

再来看上图右边的,也是顶层socket模块提供的4个函数,前两个一般由具体协议模块调用,由于协议栈与应用层的交互,具体的后面会讲到。后两个一般有协议域模块调用,用于底层设备与协议栈间的交互。但这也不绝对,如在PPPOE协议中,这4个函数都由具体协议模块调用,这是因为PPPOX协议域内的共有部分不多,各个协议间几乎独立。这4个函数的功能及所用到的数据结构,在后面具体用到时会详细说明。

2.socket插口创建

首先来看一下最终创建好的socket插口由哪些部分组成,该结构是相当庞大的,这里只给出框架:

基本属性有state(listen、accept等),flags标志(blocked等),type类型,这里family和protocol都没有了,因为它们再创建时使用过了,已经被融入到socket结构中。

File指针指向一个file结构,在Linux中一个socket也被抽象为一个文件,所以在应用层一般通过标准的文件操作来操作它。

Ops指向一个struct proto_ops结构,它是每种协议特有的,应用层的系统调用,最终映射到网络栈中具体协议的操作方法。

Sk指向一个struct sock结构,而该结构在分配空间时,多分配了一点以作为该协议的私有部分,这里包含了该协议的具体信息,内容相当多。首先是一个struct sock_common结构,包含了协议的基本信息;然后是一个sk_prot_create指针,指向一个struct proto结构体,该结构体就是第一节中所述的,用proto_regsiter()注册到内核中的,它包含应用层到协议栈的交互操作和信息(也可以说成是Appà transport layer的交互信息);然后还有一个sk_backlog_rcv函数指针,所指函数在协议栈处理完接收到的包之后调用,一般仅是把数据包放到该socket的接收队列中,等待APP读取;最后协议的私有部分里存放该协议的私有信息,如pppoe的sessionID、daddr,tcp的连接4元组等,这些信息很重要,利用它们来区分同一个协议中的多个socket。

附上出处链接:

阅读剩余
THE END