nba2k2016

admin · 2017-06-01

  

  

本文转载自微信大众号「Linux内核那些事」,作家songsong001。转载本文请干系Linux内核那些事大众号。

  正在容器化大行其道的明天,Docker 堪称是容器界的骄子。比起粗笨的虚构机,Docker 堪称是身轻如燕。固然,本文不是先容虚构机与 Docker 之间的优污点,而是先容 Docker 搜集中紧急的构成部门之一:

  虚构搜集配置对:veth

  正在先容 veth 前,咱们先来先容一下 搜集定名空间(network namespace)。

   搜集定名空间

  搜集定名空间 是 Linux 内核用来断绝分别容器间的搜集资本(每一个 Docker 容器都领有一个自力的搜集定名空间),搜集定名空间闭键断绝的资本囊括:

   iptables规矩外 道由规矩外 搜集配置列外

  如下图所示,当编制中领有 3 个搜集定名空间:

  

  因为分别的搜集定名空间之间是互相断绝的,以是分别的搜集定名空间之间并不行直接通讯。好比正在 搜集定名空间A 设置了一个 IP 地方为 172.17.42.1 的配置,但正在 搜集定名空间B 里却不行拜望,如下图所示:

  

  就比如两台电脑,假若没有任何网线毗连,它们之间是不行通讯的。以是,Linux 内核供给了 虚构搜集配置对(veth) 这个功用,用于处置分别搜集定名空间之间的通讯。

   虚构搜集配置对(veth)

  虚构搜集配置对 用于处置分别搜集定名空间之间的通讯,能够将其当作是两块有网线毗连的网卡。只须将个中一块网卡就寝到搜集定名空间A,另一块网卡就寝到搜集定名空间B,那末两个分别的搜集定名空间便可以通讯,如下图所示:

  

  如上图所示,veth0 与 veth1 构成一个虚构搜集配置对。虚构搜集配置对 就像管道相同,只须向个中一端发送数据,就能够从另一端摄取到数据。

  Docker 即是利用 虚构搜集配置对 来竣工分别容器之间的通讯,其道理如下图:

  

  从上图能够看出,每一个容器之间并非直接经由过程 虚构搜集配置对 来停止毗连的,而是正在主机上创筑一个名为 docker0 的 网桥,而后经由过程 虚构搜集配置对 来将各个容器毗连到 网桥 上。网桥 有将众个 搜集配置 毗连起来的本领,就如事实中的 交流机 相同。

  固然,本文的中心是 veth 的竣工,而不是 网桥 的事实,以是对 网桥 的先容就其中断,有趣味能够参考《Linux网桥做事道理与竣工》一文。

   虚构搜集配置对竣工

  正在 Linux 内核中,利用 net_device 工具来默示一个搜集配置。因为 veth 供给双向通讯的功用,以是必要利用两个 net_device 工具来竣工。因为 net_device 工具比力宏大,以是这里只列出本文干系的字段:

  

structnet_device{charname[IFNAMSIZ];...conststructnet_device_ops*netdev_ops;...}

 

  上面先容一下这两个字段的效力:

   name:用来存储配置的称号,如 eth0。 netdev_ops:配置干系的操纵接口列外,如初始化配置的接口、紧闭配置的接口和发送数据的接口等。

  因为 veth 由两个 net_device 工具构成的,以是这两个 net_device 工具该当有指向对方的指针。但经由过程查阅代码,并没创造有指向对方的指针,那末内核是奈何竣工 veth 的呢?

  尽管 Linux 内核利用 net_device 工具来默示一个搜集配置,但因为分别厂商的搜集配置或许存正在各类区别,所认为了让 Linux 内核可以合适各类搜集配置,故为分别的搜集配置供给私稀有据的存储空间。

  也即是说,一个搜集配置除了领有 net_device 部卓殊,另有其私稀有据部门。分别的搜集配置其私稀有据部门分别,而搜集配置的私稀有据部门存个别放正在 net_device 工具的中断处所,如下图所示:

  

  上图涌现了 PCMCIA网卡 和 RTL-8139网卡 对应的私稀有据部门存储的处所,PCMCIA网卡 的私稀有据部门对应的是 pcnet_dev_t 布局,而 RTL-8139网卡 的私稀有据部门对应的是 rtl8139_private 布局。

  回到咱们的中心,虚构搜集配置对 的私稀有据部门由 veth_priv 布局默示,其界说如下:

  

structveth_priv{structnet_device*peer;structveth_net_stats*stats;...};

 

  上面先容一下 veth_priv 布局各个字段的效力:

   peer:因为 虚构搜集配置对 是由一对搜集配置构成,以是此字段用于指向配置对的另一个配置。 stats:用于保管统计消息。

  从 veth_priv 布局能够看出,虚构搜集配置对 所属的两个配置工具是由 peer 字段来相干起来的,如下图所示:

  

  1. 创筑虚构搜集配置对

  当利用 ip 夂箢创筑一对 虚构搜集配置对 时,会触发挪用 veth_newlink 函数来已毕创筑做事,其竣工如下:

  

staticintveth_newlink(structnet_device*dev,structnlattr*tb[],structnlattr*data[]){interr;structnet_device*peer;structveth_priv*priv;charifname[IFNAMSIZ];...//因为虚构搜集配置对是由两个搜集配置构成,//dev是虚构搜集配置对的个中一个搜集配置,//以是必要挪用rtnl_create_link()函数创筑的另一个搜集配置并保管到peer变量中.peer=rtnl_create_link(dev_net(dev),ifname,&veth_link_ops,tbp);...priv=netdev_priv(dev);//获取dev的私稀有据部门priv->peer=peer;//将其peer字段指向peerpriv=netdev_priv(peer);//获取peer的私稀有据部门priv->peer=dev;//将其peer字段指向devreturn0;}

 

  下面代码原委精简后,保存了闭键逻辑,以是 veth_newlink 闭键已毕如下做事:

   因为虚构搜集配置对是由两个搜集配置构成,而 dev 是虚构搜集配置对的个中一个搜集配置,以是必要挪用 rtnl_create_link 函数创筑的另一个搜集配置,并保管到 peer 变量中。 将其 dev 配置工具的 peer 字段指向 peer 配置工具。 将其 peer 配置工具的 peer 字段指向 dev 配置工具。

  就如许,一对 虚构搜集配置对 的创筑就已毕了。

  2. 初始化虚构搜集配置对

  固然,正在创筑 虚构搜集配置对 时还必要对其停止初始化,初始化流程由 veth_setup 函数已毕,其竣工如下:

  

staticconststructnet_device_opsveth_netdev_ops={....ndo_start_xmit=veth_xmit,...};staticvoidveth_setup(structnet_device*dev){...dev->netdev_ops=&veth_netdev_ops;...}

 

  正在初始化 虚构搜集配置对 时,最紧急的是扶植其操纵函数集。而 net_device_ops 布局是搜集配置的操纵函数集布局,当向配置发送数据时,将会触发挪用配置操纵函数集的 ndo_start_xmit 形式。

  而 veth_setup 函数将此形式扶植为 veth_xmit,也即是说,当向 虚构搜集配置对 的个中一端发送数据时,将会挪用 veth_xmit 函数来发送数据。

  3. 向虚构搜集配置对发送数据

  当向 虚构搜集配置对 的个中一端发送数据时,将会挪用 veth_xmit 函数来已毕发送流程,其竣工如下:

  

staticnetdev_tx_tveth_xmit(structsk_buff*skb,structnet_device*dev){structnet_device*rcv=NULL;structveth_priv*priv,*rcv_priv;...//获取发送数据配置的对端配置priv=netdev_priv(dev);rcv=priv->peer;...skb->tstamp.tv64=0;skb->pkt_type=PACKET_HOST;//将数据包的摄取配置扶植为对端配置skb->protocol=eth_type_trans(skb,rcv);...//将数据包上送给内核赞同栈netif_rx(skb);returnNETDEV_TX_OK;}

 

  咱们先来先容一下 veth_xmit 函数各个参数的道理:

   skb:要发送的数据包工具。 dev:发送数据的配置。

  veth_xmit 函数的竣工比力简易,闭键已毕如下做事:

   获取发送数据配置的对端配置。 将数据包的摄取配置扶植为对端配置。 将数据包上送给内核赞同栈。

  咱们经由过程下图来涌现发送数据的流程:

  

  如上图所示,当一个数据包从 虚构搜集配置对 的一端发送出去,会从其另一端被摄取,并上送到内核赞同栈措置。

   总结

  因为 虚构搜集配置对 的呈现,处置了容器间的通讯题目。而本文闭键剖析了 虚构搜集配置对 的竣工道理,然而有些细节并无周到剖析,假若有不懂的处所能够加我微信一道切磋。

文章推荐:

nba2k18传奇版

cba2k巨星时刻

nba2k11没声音

大赢家篮球比分