linux,ip协议栈,虚拟网络接口
- 格式:docx
- 大小:35.82 KB
- 文档页数:15
linux协议栈Linux协议栈是Linux操作系统中网络通信的核心组件,也是实现网络通信的关键。
它基于TCP/IP协议栈,提供了一系列的网络协议和接口,负责数据在网络中的传输和接收。
Linux协议栈由多层协议组成,每层都有不同的功能和责任。
从底层到高层依次是链路层(Ethernet)、网络层(IP)、传输层(TCP/UDP)和应用层(HTTP/FTP等)。
每一层都有专门的协议来处理各自的任务,并通过各层之间的接口来传递数据。
在链路层,Linux协议栈使用网络接口卡(NIC)来将数据从计算机发送到网络,并从网络接收数据。
它负责将数据以数据帧的形式封装成网络包,并通过以太网协议(Ethernet)发送出去。
同时,它还负责接收数据帧,并将其解析成网络包交给上层协议处理。
在网络层,Linux协议栈使用IP协议来实现网络寻址和路由功能。
它负责将数据包从源地址发送到目标地址,同时还提供了一些其他的功能,如分片、重组和数据包的生存周期控制等等。
IP协议是整个互联网通信的基石,可以实现跨网络的通信。
在传输层,Linux协议栈提供了TCP和UDP两种协议来实现可靠传输和无连接传输。
TCP协议提供了可靠的、面向连接的数据传输,它通过采用滑动窗口、序号和确认机制来保证数据的可靠性。
而UDP协议则是一种无连接的传输协议,它只提供了数据传输的基本功能,不保证可靠性。
在应用层,Linux协议栈支持各种应用层协议,如HTTP、FTP、SMTP等,以满足不同的应用需求。
这些协议定义了应用程序与网络之间的通信规则和数据格式,让应用程序能够进行网络通信。
除了以上的四层协议,Linux协议栈还包括了其他的功能模块,如网络设备驱动、socket接口和网络管理等,它们共同协同工作,完成网络通信的任务。
总之,Linux协议栈是Linux操作系统中网络通信的核心组件,它提供了一系列的网络协议和接口,负责数据在网络中的传输和接收。
它基于TCP/IP协议栈,包括链路层、网络层、传输层和应用层等多层协议,以及其他的功能模块。
Linux网络基础知识TCP/IP通讯协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。
这4层分别为:应用层:应用程序间沟通的层,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等。
传输层:在此层中,它提供了节点间的数据传送服务,如传输控制协议(TCP)、用户数据报协议(UDP)等,TCP和UDP给数据包加入传输数据并把它传输到下一层中,这一层负责传送数据,并且确定数据已被送达并接收。
网络层:负责提供基本的数据封包传送功能,让每一块数据包都能够到达目的主机(但不检查是否被正确接收),如网际协议(IP)。
网络接口层(网络接口层例如以太网设备驱动程序):对实际的网络媒体的管理,定义如何使用实际网络(如Ethernet、Serial Line等)来传送数据。
网络接口层在发送端将上层的IP数据报封装成帧后发送到网络上;数据帧通过网络到达接收端时,该结点的网络接口层对数据帧拆封,并检查帧中包含的MAC地址。
如果该地址就是本机的MAC地址或者是广播地址,则上传到网络层,否则丢弃该帧。
网络接口层可细分为数据链路层和物理层,数据链路层实际上就是网卡的驱动程序,物理层实际上就是布线、光纤、网卡和其它用来把两台网络通信设备连接在一起的东西。
链路层,有时也称作数据链路层或网络接口层,通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡。
它们一起处理与电缆(或其他任何传输媒介)的物理接口细节。
网卡驱动程序主要实现发送数据帧与接受数据帧的功能,发送数据帧采用内核函数hard_start_xmit();接收数据帧采用内核函数netif_rx();网卡驱动程序主要是分配设置及注册net_dev结构体;数据帧的载体采用sk-buff结构体。
用浏览网页为例:发送方:1.输入网址:,按了回车键,电脑使用应用层用IE浏览器将数据从80端口发出,给了下一层协议——传输层。
linux 开发板之间数据传输方式
Linux开发板之间的数据传输方式有多种,以下是一些常见的方式:1.网络传输:通过网线或Wi-Fi连接,使用TCP/IP协议栈进行数据传
输。
这种方式适合大量数据的快速传输,但需要稳定的网络环境。
2.串口传输:通过串口连接,使用串口通信协议(如RS-232、RS-485
等)进行数据传输。
这种方式适合短距离、低速的数据传输,常用于设备之间的调试和通信。
B传输:通过USB接口连接,使用USB协议进行数据传输。
这种
方式速度较快,适用于大量数据的传输,但需要开发板支持USB接口。
4.SD卡/eMMC传输:将数据存储到SD卡或eMMC等存储介质中,
然后通过插槽或接口连接到另一块开发板进行数据传输。
这种方式适合大量数据的存储和传输,但需要开发板支持相应的存储接口。
5.I2C/SPI传输:通过I2C或SPI等总线协议进行数据传输。
这种方式
适用于短距离、低速的数据传输,常用于设备之间的通信和控制。
具体选择哪种传输方式,需要根据应用场景、传输距离、传输速率、设备接口等因素综合考虑。
linux 协议栈Linux协议栈,又称网络协议栈,是指在Linux操作系统中负责处理网络通信传输的一系列协议和软件集合。
它是实现网络通信的核心组件,负责在应用层和网络硬件之间进行数据传输和信息处理。
Linux协议栈由多个协议层组成,包括物理层、数据链路层、网络层、传输层和应用层。
物理层负责将数据从高层转化为物理信号进行传送,而数据链路层负责将数据在网络间的传递过程中进行帧的封装和解封装,以及网卡的驱动程序。
网络层则负责寻址和路由功能,传输层实现了可靠的端到端通信,应用层提供了各种网络服务。
在物理层的硬件设备中,网络接口卡(NIC)是协议栈与外部网络通信的接口。
协议栈通过驱动程序与NIC进行交互,将数据封装成数据包,并通过数据链路层将数据发往目的地。
在数据链路层,协议栈通过各种链路层协议(如以太网协议)进行数据帧的封装和解封装。
网络层则根据不同的网络协议(如IP协议)进行寻址和路由,将数据从源主机传送到目的主机。
传输层通过传输协议(如TCP或UDP)实现端到端的可靠数据传输。
而应用层则提供了各种网络服务,如HTTP、FTP、DNS等。
Linux协议栈的优点在于其开放源代码的特性和丰富的功能。
由于其开源的特性,用户可以自由地进行定制和修改。
并且,Linux协议栈支持多种网络协议和服务,如IP、TCP、UDP、FTP等。
这使得Linux操作系统具有很高的灵活性和可扩展性,能够满足不同的用户需求。
另外,由于众多开发者的贡献和不断的更新迭代,Linux协议栈也具有较高的稳定性和安全性。
然而,Linux协议栈也存在一些挑战和问题。
对于一些特殊的应用场景和网络需求,Linux协议栈可能无法提供最佳的性能和效果。
此外,在网络安全方面,由于Linux协议栈的复杂性和开放性,也面临着一些潜在的安全风险和漏洞。
总的来说,Linux协议栈是Linux操作系统中的重要组件,负责处理网络通信传输。
它由多个协议层组成,实现了从物理层到应用层的数据传输和处理。
linux网络协议栈Linux网络协议栈是指运行在Linux操作系统上的网络协议处理模块集合,负责实现网络通信功能。
它是Linux操作系统网络层的核心组成部分,支持多种网络协议,并且提供了丰富的接口和工具,使得开发人员可以方便地进行网络应用程序的开发和调试。
Linux网络协议栈主要包括网络接口层、网络层、传输层和应用层四个部分。
网络接口层负责的是将网络数据包转化为可以在物理层上传输的比特流。
它包括了设备驱动程序和网络设备接口等组件,负责处理硬件设备的读写操作,并提供了对网络设备的管理和控制功能。
网络层是实现网络互连和数据包路由功能的核心部分。
它支持多种网络协议,包括IP协议、ARP协议和ICMP协议等。
其中,IP协议是互联网中最为重要的协议之一,负责将数据包从源地址传输到目的地址,实现数据包的路由和转发。
ARP协议用于将IP地址转换为物理地址,而ICMP协议则是用于在网络中进行故障排除和错误报告的。
传输层负责提供端到端的数据传输服务。
它支持多种传输协议,包括TCP协议和UDP协议等。
TCP协议提供可靠的数据传输,保证了数据的完整性和顺序性,适合用于对数据传输质量要求较高的场景;而UDP协议则是一种无连接、不可靠的传输协议,适用于对实时性要求较高的应用场景。
应用层是实现网络应用功能的最上层部分。
它支持多种应用协议,包括HTTP协议、FTP协议和DNS协议等。
其中,HTTP协议是应用最广泛的一种协议,负责在网络中传输超文本和相关资源,实现网页浏览的功能;FTP协议则是用于在网络中进行文件传输的协议;而DNS协议则用于将域名转换为IP地址。
在Linux操作系统中,网络协议栈通常以内核模块的形式存在。
内核模块是一种可以在运行时加载和卸载的可扩展的二进制代码,可以动态地向操作系统添加新的功能。
通过内核模块,开发人员可以向网络协议栈添加新的协议、扩展现有协议的功能或者修改已有的协议的实现。
除了内核模块,Linux还提供了丰富的开发接口和工具,方便开发人员进行网络应用程序的开发和调试。
linux分层设计体系结构Linux分层设计体系结构是一种将Linux操作系统的各个组件和功能分层组织的方式,以实现模块化设计、可维护性和可扩展性。
以下是Linux分层设计体系结构的主要层级:1. 用户接口层:这是用户与Linux系统交互的界面层,包括Shell、命令行工具和图形用户界面。
用户通过这一层来执行操作系统的命令和访问系统资源。
2. 系统调用接口层:这一层提供给应用程序访问Linux内核所提供的功能的接口。
它包括一系列的系统调用(system call),应用程序可以通过这些系统调用来请求内核执行某些操作,例如文件操作、进程控制等。
3. 库函数层:这一层提供了一系列的函数库,供应用程序调用。
这些函数库封装了一些常用的操作,如字符串操作、文件操作、网络操作等。
应用程序通过调用这些函数库来实现特定的功能。
4. 内核层:这一层是操作系统的核心,负责管理和控制计算机的硬件资源,提供各种功能和服务。
Linux内核包含多个子系统,如进程管理、文件系统、网络协议栈、设备驱动等。
5. 设备驱动层:这一层负责与硬件设备进行交互,通过提供特定的接口和功能来控制和管理设备。
设备驱动层包括字符设备驱动、块设备驱动、网络设备驱动等。
6. 硬件层:这一层是真实的物理硬件,包括处理器、内存、外设等。
硬件层由设备驱动来访问和控制。
通过将Linux系统划分为不同的层次,分层设计体系结构提供了一种模块化的方式来开发、维护和扩展Linux系统。
每个层级都有明确定义的职责和接口,不同层级之间的依赖关系也得到了良好的管理。
这种设计使得Linux系统更加灵活、可维护和可扩展。
计算机网络的系统组成计算机网络已经成为现代社会中不可或缺的一部分,它连接了世界各地的计算机,使得人们可以方便地进行信息交流和资源共享。
而计算机网络的系统组成是实现网络功能和操作的基础。
本文将介绍计算机网络的系统组成,包括硬件和软件两个方面。
一、硬件计算机网络的硬件组成主要包括以下几个要素:1.计算机设备:计算机网络的核心是计算机,它是进行信息处理和存储的主要工具。
计算机设备包括服务器、个人计算机、笔记本电脑、平板电脑等。
2.通信设备:通信设备是计算机网络中实现数据传输的关键,包括路由器、交换机、网卡等。
它们负责将数据包从源节点传送到目标节点,并确保数据在网络中的正确传输。
3.传输介质:传输介质是计算机网络中传输数据的媒介,常见的传输介质包括电缆、光纤和无线信号。
不同的传输介质具有各自的传输速度和传输距离,并根据具体需求选择合适的传输介质。
二、软件计算机网络的软件组成主要包括以下几个要素:1.操作系统:操作系统是计算机网络中控制和管理计算机硬件和软件资源的核心软件。
常见的操作系统有Windows、Linux和Mac OS等。
操作系统提供了网络接口和网络协议栈,使得计算机可以与网络进行通信。
2.网络协议:网络协议是计算机网络中实现数据传输和通信的规则和约定。
常见的网络协议有TCP/IP、HTTP、FTP等。
网络协议负责将数据划分为数据包,并规定了数据包的格式、传输方式和错误检测等细节。
3.应用软件:应用软件是计算机网络中实现特定功能的软件程序。
例如,浏览器、电子邮件客户端、即时通讯工具等都是应用软件的例子。
应用软件使用网络协议进行数据交换,实现用户与网络的互动。
三、网络拓扑网络拓扑是计算机网络中连接节点的物理或逻辑结构。
常见的网络拓扑有星型、总线型、环型和网状型等。
不同的网络拓扑结构对网络性能和扩展性都有一定影响。
四、网络安全在计算机网络中,网络安全是一项重要的考虑因素。
网络安全包括保护网络中的数据和信息不受未经授权的访问和恶意攻击。
linux系统的内核子系统之间的关系Linux系统的内核子系统之间的关系Linux操作系统的内核是其最核心的组成部分,它负责管理和控制整个系统的运行。
内核由多个子系统组成,每个子系统负责不同的功能模块,它们之间相互配合,共同完成系统的各项任务。
本文将介绍几个常见的内核子系统及其之间的关系。
1. 文件系统子系统文件系统子系统负责管理文件和目录的存储和访问。
它提供了对文件系统的抽象,使用户和应用程序可以通过文件路径来访问文件和目录。
文件系统子系统由虚拟文件系统层、各种具体的文件系统类型和存储设备驱动程序组成。
虚拟文件系统层提供了一个统一的接口,使不同的文件系统可以以相同的方式进行访问。
具体的文件系统类型如ext4、NTFS等负责实现不同的文件系统格式,而存储设备驱动程序则负责控制硬盘、闪存等存储设备的读写。
2. 进程管理子系统进程管理子系统负责管理系统中的进程。
它负责创建、终止和调度进程,并提供进程间通信和同步的机制。
进程管理子系统包括进程调度器、进程控制块、进程间通信和同步机制等。
进程调度器决定了系统中运行哪些进程以及它们的优先级和时间片分配。
进程控制块保存了进程的状态信息,包括程序计数器、寄存器和运行时堆栈等。
进程间通信和同步机制如管道、信号量、消息队列等,使不同进程之间可以进行数据交换和协调工作。
3. 设备驱动子系统设备驱动子系统负责管理和控制硬件设备的访问。
它提供了对设备的抽象接口,使应用程序可以通过统一的方式访问不同类型的设备。
设备驱动子系统包括字符设备驱动和块设备驱动。
字符设备驱动用于管理字符设备,如串口、键盘等,它提供了以字节为单位的读写接口。
块设备驱动用于管理块设备,如硬盘、闪存等,它提供了以块为单位的读写接口。
设备驱动子系统还包括中断处理、DMA控制等功能,用于处理设备的中断请求和数据传输。
4. 网络子系统网络子系统负责管理和控制系统的网络功能。
它提供了网络协议栈、网络接口和网络设备驱动等功能。
Linux中的Socket是一种用于网络通信的编程接口,它允许进程通过网络进行数据传输。
Socket在Linux内核中的实现涉及到多个组件和原理。
1. 网络协议栈:Linux内核中的网络协议栈负责处理网络通信的各个层次,包括物理层、数据链路层、网络层和传输层。
Socket通过网络协议栈与网络进行交互。
2. 套接字数据结构:在Linux内核中,套接字(Socket)被实现为一种数据结构,用于表示网络连接。
套接字数据结构包含了连接的相关信息,如IP地址、端口号等。
3. 文件描述符:在Linux中,套接字被视为一种文件,因此每个套接字都有一个对应的文件描述符。
通过文件描述符,进程可以对套接字进行读写操作。
4. 网络设备驱动程序:Linux内核中的网络设备驱动程序负责处理网络设备的底层操作,如发送和接收数据包。
套接字通过网络设备驱动程序与网络设备进行通信。
5. 网络协议处理:当进程通过套接字发送或接收数据时,Linux内核会根据套接字的协议类型(如TCP或UDP)进行相应的协议处理。
这包括建立连接、数据分片、错误检测等操作。
6. 系统调用:在用户空间中,进程通过系统调用(如socket、bind、connect等)来创建和操作套接字。
系统调用会触发内核中相应的函数,完成套接字的创建和操作。
总的来说,Linux内核中的Socket实现涉及到网络协议栈、套接字数据结构、文件描述符、网络设备驱动程序、网络协议处理和系统调用等多个组件和原理。
这些组件和原理共同工作,使得进程能够通过套接字进行网络通信。
{"code":0,"msg":"请求出现异常","data":{}}。
竭诚为您提供优质文档/双击可除linux,ip协议栈源代码分析,pdf篇一:netfilter源代码分析详解一、概述filter/iptables框架简介netfilter/iptables是继2.0.x的ipfwadm、2.2.x的ipchains之后,新一代的linux防火墙机制。
netfilter采用模块化设计,具有良好的可扩充性。
其重要工具模块iptables连接到netfilter的架构中,并允许使用者对数据报进行过滤、地址转换、处理等操作。
netfilter提供了一个框架,将对网络代码的直接干涉降到最低,并允许用规定的接口将其他包处理代码以模块的形式添加到内核中,具有极强的灵活性。
2.主要源代码文件linux内核版本:2.4.21netfilter主文件:net/core/netfilter.cnetfilter主头文件:include/linux/netfilter.hipv4相关:c文件:net/ipv4/netfilter/*.c头文件:include/linux/netfilter_ipv4.hinclude/linux/netfilter_ipv4/*.hipv4协议栈主体的部分c文件,特别是与数据报传送过程有关的部分:ip_input.c,ip_forward.c,ip_output.c,ip_fragment.c等二、netfilter/iptables-ipv4总体架构netfilter主要通过表、链实现规则,可以这么说,netfilter是表的容器,表是链的容器,链是规则的容器,最终形成对数据报处理规则的实现。
详细地说,netfilter/iptables的体系结构可以分为三个大部分:filter的hook机制netfilter的通用框架不依赖于具体的协议,而是为每种网络协议定义一套hook函数。
这些hook函数在数据报经过协议栈的几个关键点时被调用,在这几个点中,协议栈将数据报及hook函数标号作为参数,传递给netfilter框架。
竭诚为您提供优质文档/双击可除linux,ip协议栈,虚拟网络接口篇一:linux虚拟网桥linux内核是通过一个虚拟的网桥设备来实现桥接的。
这个虚拟设备可以绑定若干个以太网接口设备,从而将它们桥接起来。
如下图(摘自ulni):网桥设备br0绑定了eth0和eth1。
对于网络协议栈的上层来说,只看得到br0,因为桥接是在数据链路层实现的,上层不需要关心桥接的细节。
于是协议栈上层需要发送的报文被送到br0,网桥设备的处理代码再来判断报文该被转发到eth0或是eth1,或者两者皆是;反过来,从eth0或从eth1接收到的报文被提交给网桥的处理代码,在这里会判断报文该转发、丢弃、或提交到协议栈上层。
而有时候eth0、eth1也可能会作为报文的源地址或目的地址,直接参与报文的发送与接收(从而绕过网桥)。
网桥的配置在linux里面使用网桥非常简单,仅需要做两件事情就可以配置了。
其一是在编译内核里把conFig_bRidge或condig_bRidge_module编译选项打开;其二是安装brctl工具。
第一步是使内核协议栈支持网桥,第二步是安装用户空间工具,通过一系列的ioctl(linux,ip协议栈,虚拟网络接口)调用来配置网桥。
下面以一个相对简单的实例来贯穿全文,以便分析代码。
linux机器有4个网卡,分别是eth0~eth4,其中eth0用于连接外网,而eth1,eth2,eth3都连接到一台pc机,用于配置网桥。
只需要用下面的命令就可以完成网桥的配置:brctladdbrbr0(建立一个网桥br0,同时在linux内核里面创建虚拟网卡br0)brctladdifbr0eth1brctladdifbr0eth2brctladdifbr0eth3(分别为网桥br0添加接口eth1,eth2和eth3)其中br0作为一个网桥,同时也是虚拟的网络设备,它即可以用作网桥的管理端口,也可作为网桥所连接局域网的网关,具体情况视你的需求而定。
要使用br0接口时,必需为它分配ip地址。
为正常工作,pc1,pc2,pc3和br0的ip 地址分配在同一个网段。
篇二:linuxtcpip协议栈分析sk_buff结构可能是linux网络代码中最重要的数据结构,它表示接收或发送数据包的包头信息。
它在中定义,并包含很多成员变量供网络代码中的各子系统使用。
这个结构在linux内核的发展过程中改动过很多次,或者是增加新的选项,或者是重新组织已存在的成员变量以使得成员变量的布局更加清晰。
它的成员变量可以大致分为以下几类:layout布局general通用Feature-specific功能相关managementfunctions管理函数这个结构被不同的网络层(mac或者其他二层链路协议,三层的ip,四层的tcp或udp等)使用,并且其中的成员变量在结构从一层向另一层传递时改变。
l4向l3传递前会添加一个l4的头部,同样,l3向l2传递前,会添加一个l3的头部。
添加头部比在不同层之间拷贝数据的效率更高。
由于在缓冲区的头部添加数据意味着要修改指向缓冲区的指针,这是个复杂的操作,所以内核提供了一个函数skb_reserve(在后面的章节中描述)来完成这个功能。
协议栈中的每一层在往下一层传递缓冲区前,第一件事就是调用skb_reserve在缓冲区的头部给协议头预留一定的空间。
skb_reserve同样被设备驱动使用来对齐接收到包的包头。
如果缓冲区向上层协议传递,旧的协议层的头部信息就没什么用了。
例如,l2的头部只有在网络驱动处理l2的协议时有用,l3是不会关心它的信息的。
但是,内核并没有把l2的头部从缓冲区中删除,而是把有效荷载的指针指向l3的头部,这样做,可以节省cpu时间。
1.网络参数和内核数据结构就像你在浏览tcp/ip规范或者配置内核时所看到的一样,网络代码提供了很多有用的功能,但是这些功能并不是必须的,比如说,防火墙,多播,还有其他一些功能。
大部分的功能都需要在内核数据结构中添加自己的成员变量。
因此,sk_buff里面包含了很多像#ifdef这样的预编译指令。
例如,在sk_buff结构的最后,你可以找到:structsk_buff{.........#ifdefconFig_net_sched__u32tc_index;#ifdefconFig_net_cls_act__u32tc_verd;__u32tc_classid;#endif#endif}它表明,tc_index只有在编译时定义了conFig_net_sched符号才有效。
这个符号可以通过选择特定的编译选项来定义(例如:"devicedriversnetworkingsupportnetworkingoptionsqos and/orfairqueueing")。
这些编译选项可以由管理员通过makeconfig来选择,或者通过一些自动安装工具来选择。
前面的例子有两个嵌套的选项:conFig_net_cls_act (包分类器)只有在选择支持“qosand/orfairqueueing”时才能生效。
顺便提一下,qos选项不能被编译成内核模块。
原因就是,内核编译之后,由某个选项所控制的数据结构是不能动态变化的。
一般来说,如果某个选项会修改内核数据结构(比如说,在sk_buff里面增加一个项tc_index),那么,包含这个选项的组件就不能被编译成内核模块。
你可能经常需要查找是哪个makeconfig编译选项或者变种定义了某个#ifdef标记,以便理解内核中包含的某段代码。
在2.6内核中,最快的,查找它们之间关联关系的方法,就是查找分布在内核源代码树中的kconfig文件中是否定义了相应的符号(每个目录都有一个这样的文件)。
在2.4内核中,你需要查看documentation/configure.help文件。
youtFields有些sk_buff成员变量的作用是方便查找或者是连接数据结构本身。
内核可以把sk_buff组织成一个双向链表。
当然,这个链表的结构要比常见的双向链表的结构复杂一点。
就像任何一个双向链表一样,sk_buff中有两个指针next和prev,其中,next指向下一个节点,而prev指向上一个节点。
但是,这个链表还有另一个需求:每个sk_buff 结构都必须能够很快找到链表头节点。
为了满足这个需求,在第一个节点前面会插入另一个结构sk_buff_head,这是一个辅助节点,它的定义如下:structsk_buff_head{/*thesetwomembersmustbefirst.*/structsk_buff*next;structsk_buff*prev;__u32qlen;spinlock_tlock;};qlen代表链表元素的个数。
lock用于防止对链表的并发访问。
sk_buff和sk_buff_head的前两个元素是一样的:next 和prev指针。
这使得它们可以放到同一个链表中,尽管sk_buff_head要比sk_buff小得多。
另外,相同的函数可以同样应用于sk_buff和sk_buff_head。
为了使这个数据结构更灵活,每个sk_buff结构都包含一个指向sk_buff_head的指针。
这个指针的名字是list。
图1会帮助你理解它们之间的关系。
Figure1.listofsk_buffelements其他有趣的成员变量如下:structsock*sk这是一个指向拥有这个sk_buff的sock结构的指针。
这个指针在网络包由本机发出或者由本机进程接收时有效,因为插口相关的信息被l4(tcp或udp)或者用户空间程序使用。
如果sk_buff只在转发中使用(这意味着,源地址和目的地址都不是本机地址),这个指针是null。
unsignedintlen这是缓冲区中数据部分的长度。
它包括主缓冲区中的数据长度(data指针指向它)和分片中的数据长度。
它的值在缓冲区从一个层向另一个层传递时改变,因为往上层传递,旧的头部就没有用了,而往下层传递,需要添加本层的头部。
len同样包含了协议头的长度。
unsignedintdata_len和len不同,data_len只计算分片中数据的长度。
unsignedintmac_len这是mac头的长度。
atomic_tusers这是一个引用计数,用于计算有多少实体引用了这个sk_buff缓冲区。
它的主要用途是防止释放sk_buff后,还有其他实体引用这个sk_buff。
因此,每个引用这个缓冲区的实体都必须在适当的时候增加或减小这个变量。
这个计数器只保护sk_buff结构本身,而缓冲区的数据部分由类似的计数器(dataref)来保护.有时可以用atomic_inc和atomic_dec函数来直接增加或减小users,但是,通常还是使用函数skb_get和kfree_skb来操作这个变量。
unsignedinttruesize这是缓冲区的总长度,包括sk_buff结构和数据部分。
如果申请一个len字节的缓冲区,alloc_skb函数会把它初始化成len+sizeof(sk_buff)。
structsk_buff*alloc_skb(unsignedintsize,intgfp_mask) {.........skb->truesize=size+sizeof(structsk_buff);.........}当skb->len变化时,这个变量也会变化。
unsignedchar*headunsignedchar*end。