特别的自己 发表于 2023-10-4 23:17:20

linux内核网络源码学习(二)

为什么要使用skb_reserve函数把边界对齐

skb_reserve 函数通常用于网络编程中的数据包处理,特别是在构建自定义协议栈或数据包处理模块时。它的作用是为数据包的头部预留额外的空间,以确保数据包的头部数据在内存中是对齐的。
边界对齐的概念是因为许多硬件平台和网络协议要求数据包头的字节对齐。如果数据包头部没有按照要求的方式对齐,可能会导致性能下降或者出现硬件故障。边界对齐通常要求数据包头部的其实地址是某个特定字节的倍数。
使用 skb_reserve 函数可以确保数据包的头部在内存中正确对齐。它的工作方式是将预留的空间添加到skb (socket buffer)结构中,这个结构用于存储数据包的信息和数据。通过预留足够的空间,skb 结构中的数据包头部将被对齐到所需的字节边界。
具体来说,skb_reserve函数作用呢包括:

[*]分配足够的额外内存空间,以便在skb 结构中存储数据包头部。
[*]调整skb 结构的内部指针,以确保数据包头部的存储位置是对齐的。
这种对齐对于网络数据包的发送和接收非常重要,因为不同网络硬件和协议可能对数据包头部的对齐要求不同。如果不进行正确的对齐,可能会导致数据包被硬件丢弃或解析错误,从而引发网络问题。
总之,使用skb_reserve函数是一种确保网络数据包头部对齐的常见做法,以提高网络数据包处理性能和可靠性。
当内核编译成支持 IP-over-IP 通道时,就可能有多个IP报头

什么是 IP-over-IP 通道?
IP-over-IP通道是一种网络隧道技术,它允许在一个IP数据包的内部封装另一个IP数据包。这意味着一个IP数据包包含了两个IP报头,其中一个是外部IP报头,另一个是内部IP报头。
在IP-over-IP通道中,通常有两个端点或者路由器之间的通信,其中一个端点封装要传输的数据包,而另一个端点解封装这些数据包。这种技术的主要应用场景包括:

[*]虚拟专用网络(Virtual Private Network,VPN):VPN是一种安全通信方式,通过在公共网络上创建私有网络,可以将内部流量隔离开来。IP-over-IP通道可以用于构建VPN,将内部的IP数据包封装在外部的IP数据包中,以便通过公共网络传输,同时保持数据的隐私和安全。
[*]隧道协议:某些网络设备和协议需要通过隧道将数据包传输到远程位置。例如,IPv6到IPv4的转换可以使用IP-over-IP通道,以便在IPv4网络上传输IPv6数据包。
[*]隧道加密:有时候,通信需要额外的安全性。IP-over-IP通道可以与加密技术结合使用,以加密内部的数据包,然后封装在外部的IP数据包中进行传输。这有助于保护数据的机密性。
在一个IP-over-IP通道中,多个IP报头的存在是很常见的。通常,外部IP报头用于路由和传输外部网络中的数据包,而内部IP报头用于路由和传输内部网络中的数据包。这两个IP报头分别具有不同的IP地址、TTL(Time-to-Live,生存时间)等字段。
总之,IP-over-IP通道是一种将一个IP数据包封装在另一个IP数据包内部的网络隧道技术,通常用于实现网络隔离、跨网络通信和安全通信等目的。多个IP报头的存在是因为数据包需要在不同的网络层中进行路由和传输。
什么是隧道?

在计算机网络中,隧道(Tunnel)是一种将一种网络协议的数据包封装在另一种网络协议的数据包内传输的技术。隧道的主要目的是允许在两个网络之间传输数据,尽管这两个网络使用不同的协议、拓扑结构或地址方案。
隧道的工作方式如下:

[*]封装(Encapsulation): 原始数据包被封装在一个或多个新的数据包中,通常在新数据包的头部添加额外的信息,以标识原始数据包的目标和属性。这个过程称为封装。
[*]传输(Transmission):封装后的数据包在隧道内传输,通过隧道连接的两端。这些数据包通常通过公共网络传输,例如因特网。
[*]解封装(Decapsulation):到达目的地的数据包经过解封装过程,将原始数据包从封装中提取出来。解封装过程还可以包括验证数据包的完整性和身份验证等操作。
在计算机网络中,隧道(Tunnel)是一种将一种网络协议的数据包封装在另一种网络协议的数据包内传输的技术。隧道的主要目的是允许在两个网络之间传输数据,尽管这两个网络使用不同的协议、拓扑结构或地址方案。
隧道可以用于多种不同的场景和目的,包括:

[*]连接远程网络:隧道允许在两个不同地理位置的网络之间建立连接,使它们能够互相通信,就好像它们在同一网络中一样。
[*]跨越不同协议的通信:隧道可以用于在不同的网络协议之间传输数据,例如将IPv6数据包封装在IPv4数据包中,以便在IPv4网络上传输。
[*]隔离和安全:隧道可以用于创建私有网络,以隔离和保护数据。例如,虚拟专用网络(VPN)使用隧道来加密和隔离通信,以确保数据的安全性。
[*]跨越不同拓扑结构的通信:隧道可以用于连接不同拓扑结构的网络,例如星型、网状或环状拓扑,以实现数据的流动。
总之,隧道是一种重要的网络技术,用于连接、隔离和传输数据,允许不同网络之间的通信和互联。隧道的选择和配置取决于特定的网络需求和环境。
OSI模型算是一种隧道传输技术吗?

不完全正确。OSI模型(开放式系统互联模型)是一种网络协议层次结构,用于描述和组织计算机网络中不同层次的通信协议。它将网络通信分为七个不同的层次,每个层次都有特定的功能和责任,从物理层(第一层)到应用层(第七层)。
与隧道传输技术不同,OSI模型本身并不是一种具体的网络通信技术,而是一种概念性框架,用于理解和组织不同层次的通信协议。它提供了一种方法来描述和分解网络通信的复杂性,使不同的网络协议可以独立开发和维护,同时仍然能够互操作。
隧道传输技术,如IP-over-IP隧道、VPN隧道等,是一种特定的网络技术,用于将数据包从一个网络封装并传输到另一个网络。这些技术通常属于OSI模型中的网络层或数据链路层,用于实现不同网络之间的通信、连接和隔离。它们是在OSI模型的基础上实现的,但不是OSI模型本身的一部分。
总之,OSI模型是一种用于描述通信协议层次结构的概念性框架,而隧道传输技术是一种具体的网络技术,用于在不同网络之间传输数据。两者虽然相关,但是具有不同的目的和作用。
非线性数据包处理

skb_is_nonlinear

static inline bool skb_is_nonlinear(const struct sk_buff *skb)
{
        return skb->data_len;
}这段代码定义了一个内联函数 skb_is_nonlinear,用于检查给定的 sk_buff 结构是否包含非线性数据。
sk_buff 是Linux内核中用于表示网络数据包的数据结构,而非线性数据包是指数据包的数据存储在多个非连续的缓冲区中,而不是一个单一的线性缓冲区。非线性数据包通常需要额外的内存和处理,因为数据分散在多个缓冲区中,这可能会增加处理的复杂性。
这个 skb_is_nonlinear 函数的实现非常简单,它检查 sk_buff 结构中的 data_len 字段是否为非零值。如果 data_len 不为零,说明该数据包是非线性的,因为 data_len 字段用于表示非线性数据包的长度。如果 data_len 为零,那么该数据包是线性的,因为线性数据包的长度通常可以从 len 字段中获得。
这个函数的目的是帮助内核代码确定一个 sk_buff 结构是否包含非线性数据,从而可以采取适当的处理措施。如果 skb_is_nonlinear 返回 true,那么内核可以根据需要执行额外的操作来处理非线性数据包。否则,如果返回 false,则可以假定数据包是线性的,通常更容易处理。
skb_linearize

skb_linearize 是Linux内核网络数据包处理中的一个函数,用于将非线性数据包(non-linear sk_buff)转换为线性数据包(linear sk_buff)。在内核网络数据包处理中,数据包通常以线性方式存储在单个连续的缓冲区中,这被称为线性缓冲区。然而,某些情况下,数据包的数据可能分散在多个非连续的缓冲区中,这被称为非线性数据包。
skb_linearize 函数的主要作用是将非线性数据包转换为线性数据包,以便于内核的处理和传递。这个函数会执行以下操作:

[*]分配新的线性缓冲区:首先,它会分配一个新的线性缓冲区,足够大以容纳非线性数据包中的所有数据。
[*]将数据拷贝到线性缓冲区:然后,它会将非线性数据包中的数据从多个非连续的缓冲区复制到新的线性缓冲区中。这样,数据包的所有内容都被组合到一个连续的缓冲区中。
[*]更新 sk_buff 结构:最后,它会更新相关的 sk_buff 结构,将数据包的数据指针和长度等信息更新为新的线性缓冲区的地址和大小。
这个操作的目的是为了简化数据包的处理。许多网络协议和网络设备驱动程序都更喜欢处理线性数据包,因为它们的数据存储方式更加紧凑和可预测。当收到非线性数据包时,内核通常会使用 skb_linearize 将其转换为线性数据包,以便更容易地进行后续处理,例如路由、转发或传递给上层协议栈。
总之,skb_linearize 函数用于将非线性数据包转换为线性数据包,以便于内核的处理。这是一种数据包预处理操作,旨在简化数据包的存储和处理方式。
TCP截断卸载技术

TCP截断卸载(TCP Segmentation Offload Truncation)和TSO(TCP Segmentation Offload)是两种网络性能优化技术,旨在提高网络传输效率。它们都与TCP数据包的分段和传输有关,但在一些方面存在差异。
"TCP Segmentation Offload"(TSO) "TCP分段卸载" 或 "TCP分段卸载技术"。这个翻译表达了TSO技术的基本含义,即将TCP数据包的分段任务卸载到网络适配器上,以减轻主机CPU的负载。

[*]TSO 是一种网络性能优化技术,旨在减轻主机CPU的负载。
[*]当主机要发送一个大型TCP数据包时,传统的做法是将整个数据包构建并发送到网络适配器,然后在适配器上对数据包进行分段以适应网络的最大传输单元(MTU)。
[*]TSO 将这个任务卸载到网络适配器上,允许适配器在数据包发送之前将大型TCP数据包分割成适应MTU的小数据块。这减轻了主机CPU的工作负担,因为CPU不再需要进行数据包分段。
[*]TSO 可以提高网络性能,因为它使主机CPU可以更专注于其他任务。
"TCP Segmentation Offload Truncation"   "TCP分段卸载截断" 或 "TCP截断卸载技术"。反映了TCP截断卸载技术的特性,即允许网络适配器在传输之前截断大型TCP数据包的一部分,以减小每个数据包的大小。这有助于提高网络的可靠性和性能。

[*]TCP截断卸载是与TSO相关但不同的技术。它关注的是减小数据包的大小,以降低每个数据包的传输时间和网络拥塞的风险。
[*]TCP截断卸载允许网络适配器在传输之前截断大型TCP数据包的一部分,以降低每个数据包的大小。这可以提高网络的可靠性,因为较小的数据包更容易在网络上传输,减少了丢包的可能性。
[*]相比之下,TSO主要关注将大型TCP数据包分割以降低CPU负载。
[*]TCP截断卸载可以减少网络延迟和拥塞,对实时应用程序和延迟敏感的流量特别有益。
综上所述,TSO和TCP截断卸载都是用于优化TCP数据包传输的技术,但它们的焦点和目标不同。TSO旨在降低主机CPU的负载,而TCP截断卸载旨在减小数据包的大小以降低网络拥塞的风险。这两种技术可以在一些情况下协同工作,以提高网络性能和可靠性。但需要注意的是,它们都需要得到支持并在网络适配器上适当配置。
截断和卸载的含义


[*]截断(Truncation):在网络通信中,"截断" 通常指的是将数据包的一部分或整个部分从数据流中移除或删除的操作。这可以用于减小数据包的大小或限制传输的数据量。在 "TCP截断卸载" 中,"截断" 意味着将大型TCP数据包的一部分或整个部分删除,以降低数据包的大小。
[*]卸载(Offload):"卸载" 是指将某些任务或处理从一个系统或组件转移到另一个系统或组件的过程。在网络通信中,"卸载" 通常指的是将数据包处理任务从主机的CPU卸载到网络适配器(NIC)或其他硬件上执行。这可以减轻主机CPU的负载,提高网络性能。
skb_shinfo

#define skb_shinfo(SKB)        ((struct skb_shared_info *)(skb_end_pointer(SKB)))
这里定义了一个宏(macro),用于访问 Linux 内核中的网络数据包(skb,Socket Buffer)的共享信息(shared info)。宏的名称是 skb_shinfo,它接受一个名为 SKB 的参数,通常是指向网络数据包的指针(skb)。
整个宏的作用是获取指向网络数据包共享信息结构的指针,该结构包含了有关 skb 的一些元数据和共享信息,通常用于高性能的数据包处理操作。

来源:https://www.cnblogs.com/lixiaomeng/p/17742477.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: linux内核网络源码学习(二)