一文读懂Linux网络命名空间( 二 )

  • 高层协议的数据在封装到以太网帧时,将协议产生的首部和数据二元组封装到帧的数据部分 。在因特网网络上,这是互联网络层数据 。
  • 因为通过以太网不仅可以传输IP分组,还可以传输其他协议的分组,如Appletalk或IPX分组,接收系统必须能够区分不同的协议类型,以便将数据转发到正确的例程进一步处理 。分析数据并查明使用的传输协议是非常耗时的 。因此,以太网帧的首部(和所有其他现代网络协议的首部部分)包含了一个标识符,唯一地标识了帧数据部分中的协议类型 。这些标识符(用于以太网传输)由一个国际组织(IEEE)分配 。
  • 协议栈中的所有协议都有这种划分 。为此,传输的每个帧开始都是一系列协议首部,而后才是应用层的数据,如图12-5所示

  • 一文读懂Linux网络命名空间

    文章插图
    在以太网帧中通过TCP/IP传输HTTP数据
    • 图12-5清楚地说明了为容纳控制信息所牺牲的部分带宽.
     
    更多linux内核视频教程文档资料免费领取后台私信【内核】自行获取.
    一文读懂Linux网络命名空间

    文章插图
     
    Linux内核源码/内存调优/文件系统/进程管理/设备驱动/网络协议栈-学习视频教程-腾讯课堂
     
    2、网络命名空间net
    • pid的命名空间, 我们知道内核的许多部分包含在命名空间中. 这可以建立系统的多个虚拟视图, 并彼此分隔开来. 每个实例看起来像是一台运行Linux的独立机器,但在一台物理机器上,可以同时运行许多这样的实例 。在内核版本2.6.24开发期间,内核也开始对网络子系统采用命名空间. 这对该子系统增加了一些额外的复杂性,因为该子系统的所有属性在此前的版本中都是"全局"的,而现在需要按命名空间来管理, 例如, 可用网卡的数量. 对特定的网络设备来说,如果它在一个命名空间中可见,在另一个命名空间中就不一定是可见的.
    2.1 网络命令空间net
    • 照例需要一个中枢结构来跟踪所有可用的命名空间, 即struct net, 其定义如下:
    struct net {atomic_tpassive;/* To decided when the network* namespace should be freed.*/atomic_tcount;/* To decided when the network*namespace should be shut down.*/spinlock_trules_mod_lock;atomic64_tcookie_gen;struct list_headlist;/* list of network namespaces */struct list_headcleanup_list; /* namespaces on death row */struct list_headexit_list;/* Use only net_mutex */struct user_namespace*user_ns;/* Owning user namespace */spinlock_tnsid_lock;struct idrnetns_ids;struct ns_commonns;struct proc_dir_entry*proc_net;struct proc_dir_entry*proc_net_stat;#ifdef CONFIG_SYSCTLstruct ctl_table_setsysctls;#endifstruct sock*rtnl;/* rtnetlink socket */struct sock*genl_sock;struct list_headdev_base_head;struct hlist_head*dev_name_head;struct hlist_head*dev_index_head;unsigned intdev_base_seq; /* protected by rtnl_mutex */intifindex;unsigned intdev_unreg_count;/* core fib_rules */struct list_headrules_ops;struct net_device*loopback_dev;/* The loopback */struct netns_corecore;struct netns_mibmib;struct netns_packetpacket;struct netns_unixunx;struct netns_ipv4ipv4;#if IS_ENABLED(CONFIG_IPV6)struct netns_ipv6ipv6;#endif#if IS_ENABLED(CONFIG_IEEE802154_6LOWPAN)struct netns_ieee802154_lowpanieee802154_lowpan;#endif#if defined(CONFIG_IP_SCTP) || defined(CONFIG_IP_SCTP_MODULE)struct netns_sctpsctp;#endif#if defined(CONFIG_IP_DCCP) || defined(CONFIG_IP_DCCP_MODULE)struct netns_dccpdccp;#endif#ifdef CONFIG_NETFILTERstruct netns_nfnf;struct netns_xtxt;#if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)struct netns_ctct;#endif#if defined(CONFIG_NF_TABLES) || defined(CONFIG_NF_TABLES_MODULE)struct netns_nftablesnft;#endif#if IS_ENABLED(CONFIG_NF_DEFRAG_IPV6)struct netns_nf_fragnf_frag;#endifstruct sock*nfnl;struct sock*nfnl_stash;#if IS_ENABLED(CONFIG_NETFILTER_NETLINK_ACCT)struct list_headnfnl_acct_list;#endif#if IS_ENABLED(CONFIG_NF_CT_NETLINK_TIMEOUT)struct list_headnfct_timeout_list;#endif#endif#ifdef CONFIG_WEXT_COREstruct sk_buff_headwext_nlevents;#endifstruct net_generic __rcu*gen;/* Note : following structs are cache line aligned */#ifdef CONFIG_XFRMstruct netns_xfrmxfrm;#endif#if IS_ENABLED(CONFIG_IP_VS)struct netns_ipvs*ipvs;#endif#if IS_ENABLED(CONFIG_MPLS)struct netns_mplsmpls;#endifstruct sock*diag_nlsk;atomic_tfnhe_genid;};