struct net网络命名空间

struct net 结构体表示的内核中的网络命名空间(net_namespace)。在linux内核中,每一个网络设备(struct net_device)都有一个所属的网络命名空间,至于一个网络设备是属于内核中的那一个网络命名空间,在介绍网络设备(struct net_device。在linux内核中,用struct net_device来刻画一个网络设备)时候再说。

    在linux内核中,网络命名空间struct net结构体中包含多个字段,在本篇中只介绍其中的一些字段,用于描述内核中网络命名空间的宏观构架。

    struct net

    {

       //用于将内核中的所有的网络命名空间以双链表的形式组织起来,即将

       //所有的struct net结构体组织成双链表;

       struct list_head list ;

//因为在一个网络命名空间中,可能有多个网络设备,而这些网络设备也是

       //通过双链表的形式组织起来的。而dev_base_head就是网络设备双链表

       //的链表头;

       struct list_head dev_base_head ;

//因为在一个网络命名空间中,每一个网络设备都有其设备名,而内核为了

       //能够根据网络设备名快速的找到相应的网络设备,使用了内核中常有的

       //哈希散列表来实现根据设备名来快速查找设备。

       struct hlist_head *name_hlist ;

       //在一个网络设备命名空间中,每一个网络设备在系统中都会有一个唯一

       //的接口索引值(int ifindex),同样内核也是通过内核中的哈希散列表

       //来实现根据接口索引值快速查找网络设备。

       struct hlist_head *index_hlist ;

    }

通过以上对内核中网络命名空间中的一些字段的介绍,明白了内核中的网络命名空间(struct net)是以双链表的形式组织起来的,而在linux内核中的双链表是有头节点的,那内核中的网络命名空间双链表的头节点在哪儿?

    在linux内核中定义了一个如下的结构体,并将其导出,让用户可以通过它来遍历、查找、添加网络命名空间。

    LIST_HEAD(net_namespace_list);

    EXPORT_SYMBOL_GPL(net_namespace_list);


   在linux内核中默认情况下,会有一个默认的网络命名空间,其名为init_net

,并也将其导出,作为全局变量。

   struct net init_net;

EXPORT_SYMBOL_GPL(init_net);

  

   向内核中添加一个网络命名空间:

   struct net *net_create(void);//这个函数用于向内核中添加一个网络

                                 //命名空间;

   这个函数主要做了三件事:

      1.通过struct net *net_alloc(void)函数分配了一个struct net结构体

       2.通过setup_net(struct net *ns)函数对分配的struct net结构体进行了相应的设置;

      3.最后,将分配的struct net结构体加入到 net_namespace_list的双链表尾部。

  

   释放一个网络命名空间:

   void net_free(struct net *ns);

    遍历内核中的所有的网络命名空间:

    # define for_each_net(var) \

      list_for_each_entry(var, &net_namespace_list, list)

 

    # define for_each_net_rcu(var) \

      list_for_each_entry_rcu(var, &net_namespace_list, list)

总结:

       网络命名空间struct net通过其中的:

           struct list_head dev_base_list 将其中的所有的网络设备以双链表的形式组织起来。

           struct hlist_head *name_hlist  用于实现通过网络设备名来快速查找网络设备(struct net_device);

           struct hlist_head *index_hlist 用于实现通过网络设备的接口索引值来快速查找网络设备。


        struct net *net_create(void) 用于向内核中添加一个网络命名空间


        void net_free(struct net *ns)用于释放内核中的一个网络命名空间


        for_each_net(struct net *var) 用于遍历内核中的网络命名空间


        for_each_net_rcu(struct net *var)

时间: 2024-10-08 15:07:34

struct net网络命名空间的相关文章

Python的功能模块[1] -> struct -> struct 在网络编程中的使用

struct模块 / struct Module 在网络编程中,利用 socket 进行通信时,常常会用到 struct 模块,在网络通信中,大多数传递的数据以二进制流(binary data)存在.传递字符串时无需过多担心,但传递 int,char 之类的基本数据时,就需要一种机制将某些特定的结构体类型打包成二进制流的字符串,然后在进行网络传输,而接收端也可以通过某种机制进行解包还原出原始数据.struct 模块便提供了这种机制,该模块主要作用就是对 python 基本类型值与用 python

Docker02:Docker核心技术探索(3)网络命名空间和网络隔离

在Docker中可以为Docker容器创建与原始宿主系统以及其它容器中的虚拟系统之间相互隔离的虚拟网络环境. Docker的网络分为以下几种模式: (1)bridge模式.这将配置一个虚拟网络系统,容器中的虚拟网卡通过NAT与宿主系统的真实网卡通讯. docker run -it --net=bridge --name=centos --hostname=centos centos /bin/bash 在容器中执行以下命令,其中yum provides用于查找指定的命令所在的包. 1 yum p

Linux网络子系统安全性模块详细分析之文件xfrm_state.c函数介绍

2.4.4.4 外部函数 1. tasklet_hrtimer_start ( ) 函数原型: static inline int tasklet_hrtimer_start(struct tasklet_hrtimer *ttimer, ktime_t time, const enum hrtimer_mode mode) 函数参数:ttimer为含有定时器的小任务,time表示时间结构,mode表示时间的模式是相对时间还是绝对时间. 函数功能:设置带有定时器的小任务. 返回值:定时器如果在队

struct net_device网络设备结构体详解

在linux中使用struct net_device结构体来描述每一个网络设备.同时这个用来刻画网络设备的struct net_device结构体包含的字段非常的多,以至于内核的开发者都觉得在现在的linux内核中,这个struct net_device是一个大的错误.    在本篇文章中,只介绍struct net_device中的一些字段,其他的字段在以后使用的时候再说.    #define IFNAMSIZ 32    struct net_device    {        //用于

网络子系统87_veth实现

//使用veth //1.创建两块虚拟网卡veth1.veth2,然后点对点连接,此后两块网卡的数据会互相发送到对方 $ ip link add veth1 type veth peer name veth2 //2.创建网络命名空间t1 $ ip netns add t1 //3.将veth0加入t1,此时veth0便看不到了,因为被加入到其他命名空间中了 $ ip link set veth0 netns t1 //4.配置veth0的ip地址 $ ip netns exec t1 ifco

Docker源码分析(八):Docker Container网络(下)

1.Docker Client配置容器网络模式 Docker目前支持4种网络模式,分别是bridge.host.container.none,Docker开发者可以根据自己的需求来确定最适合自己应用场景的网络模式. 从Docker Container网络创建流程图中可以看到,创建流程第一个涉及的Docker模块即为Docker Client.当然,这也十分好理解,毕竟Docker Container网络环境的创建需要由用户发起,用户根据自身对容器的需求,选择网络模式,并将其通过Docker Cl

网络驱动移植之解析Linux网络驱动的基本框架

内核源码:linux-2.6.38.8.tar.bz2 概括而言,编写Linux网络驱动其实只要完成两件事即可,一是分配并初始化网络设备,二是注册网络设备. 1.分配并初始化网络设备 动态分配网络设备(从C语言角度来看,其实就是定义了一个struct net_device结构体变量,并对这个结构体变量的某些成员进行了初始化而已)及其私有数据的大致过程如下图(以以太网设备为例): 下面将结合linux-2.6.38.8中的代码详细分析网络设备的分配和初始化过程. [cpp] view plain

linux内核构造skb发包-----raw、tcp网络编程

1. 内核raw发包 #include <linux/init.h>#include <linux/module.h> #include <linux/kernel.h>#include <linux/moduleparam.h>#include <linux/ip.h>#include <linux/version.h>#include <linux/skbuff.h>#include <linux/netdevi

Docker &nbsp; none模式、DNS/HOSTNAME自定义、容器互联(网络三)

玩转Docker必要要了解的网络基础知识: 机器需要一个网络接口来发送和接受数据包,路由表来定义如何到达哪些地址段.这里的网 络接口可以不是物理接口.事实上,每个 linux  机器上的 lo   环回接口( docker容器中也 有)就是一个完全的 linux 内核虚拟接口,它直接复制发送缓存中的数据包到接收缓存中. docker 让宿主主机和容器使用特殊的虚拟接口来通信 -- 通信的 2 端叫" peers",他们 在主机内核中连接在一起,所以能够相互通信.创建他们很简单,前面介绍