Linux内核中网络部分结构以及分布

一、概述

1.代码目录分布

在这里插入图片描述

  1. Documentation:这个目录下面没有内核的代码,有一套有用的内核文档。其中文档质量良势不齐,有很多内核文档的质量很优秀并且相当完整,例如文件系统;但是有的则完全没有文档,例如进程调度。在这个目录里不时可以发现有用的东西。

  2. arch: 此目录下的所有子目录的东西都是体系结构特有的代码。每个体系结构特有的目录下面至少包含 3 个子目录:kernel,不同体系结构内核特有的实现方式,如信号量、计时器、SMP 等;lib,不同体系结构下的高性能通用代码实现,如 memcpy等mm, 不同体系结构特有的内存管理程序的实现。

  3. drivers: 内核的驱动程序代码。此部分的代码占内核代码的大部分,包括显卡、网卡、PCI等外围设备的驱动代码。

  4. fs: 文件系统代码。包含ext2、ext3、ext4等本地文件系统,CD-ROM、isofs等镜像系统,还有NFS等网络文件系统,以及proc等伪文件系统。

  5. include: 此目录中包含了Linux内核中的大部分头(.h)文件

  6. init: 内核初始化过程的代码。

  7. ipc: 进程间通信代码。

  8. kernel: 这部分是Linux内核中最重要的,包含了内核中平台无关的基本功能,主要包含进程创建、销毁和调度的代码。

  9. lib: 此目录中主要包含内核中其他模块使用的通用函数和内核自解压的函数。

  10. mm: 此目录中的代码实现了平台无关的内存管理代码。

  11. scripts: 此目录下是内核配置时使用的脚本,当使用make menuconfig或者make xconfig命令时,会调用此部分代码。

  12. net: 此目录中包含Linux内核的网络协议栈的代码。在子目录netfilter下为netfilter的实现代码,netfilter构建了框架,允许在不重新编译内核的情况下,编写可加载内核,在指定的地方插入回调函数,以用户自己的方式处理网络数据。子目录ipv4和ipv6为TCP/IP协议栈的IPv4和IPv6的实现,主要包含了TCP、UDP、 IP协议的代码,还有ARP协议、ICMP协议、IGMP协议、netfilter的TCP/IP实现等代码实现,以及如proc、ioctl等控制相关的代码。

源代码另一种表现方式,映射到Linux代码的3个内核层。
在这里插入图片描述

2.内核中网络部分流程简介

  1. 网络协议栈是由若干个层组成的,网络数据的流程主要是指在协议栈的各个层之间的传递。

  2. 前面介绍TCP网络编程的流程,一个TCP服务器的流程按照建立socket()函数,绑定地址端口bind()函数,侦听端口listen()函数,接收连接accept()函数,发送数据send()函数,接收数据recv()函数,关闭socket()函数的顺序来进行。内核的处理过程也是按照此顺序进行的,网络数据在内核中的处理过程主要是在网卡协议栈之间进行:从网卡接收数据,交给协议栈处理;协议栈将需要发送的数据通过网络发出去。

  3. 如下图所示,总结了各层间在网络输入输出时的层间调用关系。看出数据的流向主要有两种。应用层输出数据时,数据按照自上而下的顺序,依次通过插口层、协议层和接口层;当有数据到达的时候,自下而上依次通过接口层、协议层和插口层的方式,在内核层传递。
    在这里插入图片描述

  4. 应用层Socket的初始化、绑定(bind)和销毁是通过调用内核层的socket()函数进行资源的申请和销毁的。

  5. 发送数据的时候,将数据由插口层传递给协议层,协议层在UDP层添加UDP的首部、 TCP层添加TCP的首部、IP层添加IP的首部,接口层的网卡则添加以太网相关的信息后,通过网卡的发送程序发送到网络上。

  6. 接收数据的过程是一 个相反的过程,当有数据到来的时候,网卡的中断处理程序将数据从以太网网卡的FIFO对列中接收到内核,传递给协议层,协议层在IP层剥离IP的首部、 UDP层剥离UDP的首部、TCP层剥离TCP的首部后传递给插口层,插口层查询socket的标识后,将数据送给用户层匹配的socket。

如下图所示为Linux内核层的网络协议栈的架构视图。最上面是用户空间层,应用层的程序位于此处。最底部是物理设备,例如以太网网卡等,提供网络数据的连接、收发。中间是内核层,即网络协议栈子系统。流经网络栈内部的是socket缓冲区(由结构sk_buffs接连),它负责在源和汇点之间传递报文数据。

在这里插入图片描述
顶部是系统调用接口,为用户空间的应用程序提供了一 种访问内核网络子系统的接口。位于其下面的是协议无关层,提供通用方法来使用底层传输层协议。然后是实际协议,在Linux中包括内嵌的协议TCP、UDP, 当然还有IP。然后是另外一个网络设备协议无关层,提供了与各个设备驱动程序通信的通用接口,最下面是设备驱动程序本身。

3.系统提供修改网络流程点

Linux内核中还提供了一种灵活修改网络数据的机制,用户可以利用这种机制获得和修改内核层的网络数据和属性设置。
在这里插入图片描述

白色的框为网络数据的流向,协议栈按照正常的方式进行处理和传递。 Linux内核在网络数据经过的多个地点设置了检查点,当到达检查点的时候,会检查这些点上是否有用户设置的处理方法,按照用户的处理规则对网络数据进行处理后,数据会再次按照正常的网络流程传递。

4.sk_buff结构

内核层和用户层在网络方面的差别很大,在内核的网络层中sk_buff结构占有重要的地位,几乎所有的处理均与此结构有关系。

网络协议栈是个层次架构的软件结构,层与层之间通过预定的接口传递报文。网络报文中包含了在协议各层使用到的各种信息。由于网络报文之间的大小不是固定的,因此采用合适的数据结构来存储这些网络报文就显得非常重要。

①.结构sk_buff的原型

struct sk_buff 
{
   
        struct 
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值