您当前的位置:首页 >> 家居装修

从 VLAN 到 IPVLAN: 聊聊虚拟世界网络设备及其在云原生中的应用

2024-01-17 12:18:05

h_get_stats64,

.ndo_set_rx_mode = veth_set_multicast_list,

.ndo_set_mac_address = eth_mac_addr,

#ifdef CONFIG_NET_POLL_CONTROLLER

.ndo_poll_controller = veth_poll_controller,

#endif

.ndo_get_iflink = veth_get_iflink,

.ndo_fix_features = veth_fix_features,

.ndo_set_features = veth_set_features,

.ndo_features_check = passthru_features_check,

.ndo_set_rx_headroom = veth_set_rx_headroom,

.ndo_bpf = veth_xdp,

.ndo_xdp_xmit = veth_ndo_xdp_xmit,

.ndo_get_peer_dev = veth_peer_dev,

};

从纸片的定义我们可以看得见几个逻辑上很直观的步骤:ndo_start_xmit 用以递送数据集流,newlink 用以创建者一个最初的器材。

对于分派数据集流,Linux 的收包内跳跃并不是由各个会话自己去紧接成的,而是由 ksoftirqd 软件包内线程负责了从特别设计分派、互联层(ip,iptables)、传输层(tcp,udp)的处理更进一步,最终放到用户会话所有者的 Socket 的 recv 缓冲区当中,然后由软件包内 inotify 用户会话处理更进一步。对于终端器材来感叹,所有的不同集当中于互联层前,在这里面有一个标准化的正门,即词组netif_receive_skb_core。

801.2q 两国政府对 VLAN 的定义

802.1q 两国政府当中,调制由此可知调器数据集帧包内脚当中用以纸片 VLAN 字符串是一个 32bit 的如前所述,结构上如下:

如上示意图,有 16 个 bit 用以纸片 Protocol,3 个 bit 用以纸片优再级,1 个 bit 用以纸片文档,12 个 bit 用以存放 VLAN id,看得见这里面我自已你可以轻易计数出,依靠 VLAN 我们能分割出多少个播送如前所述?不管怎样,正是 2*12,4096 个,减去移去的同类型 0 和同类型 1 ,客户免费分割出 4094 个可用的播送如前所述。(在 OpenFlow 兴起前,互联免费最以前诞生当中的 vpc 的由此可知决问题正是依赖 VLAN 同步进行互联的界定,但是由于这个受限,在此之后就被淘汰了,这也催生了另一个你也许似曾相识的名词,VxLAN,尽管两者差别非常大,但是仍有独有的缘故)。

VLAN 原再和 bridge 一样是一个局域网上的定义,不过 Linux 将它们都同步进行了软件的由此可知决问题,Linux 在每个调制由此可知调器数据集帧当中用以一个 16bit 的 vlan_proto 字符串和 16bit 的 vlan_tci 字符串由此可知决问题 802.1q 两国政府,同时对于每一个 VLAN,都亦会终端出一个次子器材来处理更进一步去除 VLAN 在此之后的数据集流,不管怎样 VLAN 也有都能的次子器材,即 VLAN sub-interface,多种不同的 VLAN 次子器材通过一个主器材同步进行宇宙学上的数据集流收发,这个定义到底又有点陌生?不管怎样,这正是 ENI-Trunking 的原理。

了解 VLAN/MACVlan/IPVlan 的软件包内由此可知决问题

补充了取材经验后,我们就再从 VLAN 次子器材开始,忘了 Linux 软件包内到底是干什么的,这里面所有的软件包内文档都以每每较最初的 5.16.2 旧版本为例。

VLAN 次子器材

器材创建者

VLAN 次子器材起初并无法被在此期间做为一类分开的终端器材来处理更进一步,或许浮现的时近很晚,文档分布相当作乱,不过框架逻辑上设在/net/8021q/方向下。从取材当中我们可以认识到,netlink 机制当中由此可知决问题了终端器材创建者的正门,对于 VLAN 次子器材,它们的 netlink 死讯由此可知决问题的结构上基底是 vlan_link_ops,而负责创建者 VLAN 次子器材的是 vlan_newlink 步骤,软件包内绑定文档程序当中如下:

1. 首再创建者一个 Linux 通用的 net_device 结构上基底复原器材的的设计数据集,进到 vlan_newlink 在此之后,亦会同步进行 vlan_check_real_dev 安同类型检查传入的 VLAN id 到底是可用的,这其当中亦会次子程序到 vlan_find_dev 步骤,这个步骤用以针对一个主器材排序到至多的次子器材,中近还亦会用到,我们作法在一之内外文档观察一下:

static int vlan_newlink(struct net *src_net, struct net_device *dev,

struct nlattr *tb[], struct nlattr *data[],

struct netlink_ext_ack *extack)

{

struct vlan_dev_priv *vlan = vlan_dev_priv(dev);

struct net_device *real_de

unsigned int max_mtu;

词组be16 proto;

int err;

/*这里面去除成打碎了用以数值匹配的之内外*/

// 这里面亦会设vlan次子器材的vlan数据集,也就是取材经验当中vlan特别的protocol,vlanid,优再级和flag数据集的配置文件值

vlan->vlan_proto = proto;

vlan->vlan_id = nla_get_u16(data[IFLA_VLAN_ID]);

vlan->real_dev = real_de

dev->priv_flags |= (real_dev->priv_flags Max IFF_XMIT_DST_RELEASE);

vlan->flags = VLAN_FLAG_REORDER_HDR;

err = vlan_check_real_dev(real_dev, vlan->vlan_proto, vlan->vlan_id,

extack);

if (err

return err;

/*这里面亦会同步进行mtu的设*/

err = vlan_changelink(dev, tb, data, extack);

if (!err)

err = register_vlan_dev(dev, extack);

if (err)

vlan_dev_uninit(dev);

return err;

}

2. 再一是通过 vlan_changelink 步骤对器材的物件同步进行设,如果你有比如感叹的的设计,则亦会覆盖配置文件值。

3. 再次进到 register_vlan_dev 步骤,这个步骤就是把前面不太也许紧接成好的数据集装填到 net_device 结构上基底,并按照 Linux 的器材管理标准化终端唯册到软件包内当中。

分派数据集流

从创建者更进一步来看, VLAN 次子器材与一般器材的不同点就在于它能够被主器材和 VLAN id 通过 vlan_find_dev 的作法找,这一点很重要。

再一我们来看数据集流的分派更进一步,根据取材经验,宇宙学器材分派到数据集流后,在进到两国政府堆处理更进一步前,除此以内外的正门是 词组netif_receive_skb_core,我们就从这个正门开始逐渐量化,软件包内转换程序当中如下:

根据上方的示意示意图,我们作法在之内外词组netif_receive_skb_core 同步进行量化:

1. 首再在数据集流处理更进一步程序当中开始的时候,亦会同步进行 skb_vlan_untag 转换,对于 VLAN 数据集流来感叹,数据集流 Protocol 字符串仍然是 VLAN 的 ETH_P_8021Q ,skb_vlan_untag 就是将 VLAN 数据集从数据集流的 vlan_tci 字符串当中提取后,次子程序 vlan_set_encap_proto 将 Protocol 更最初为也就是感叹的互联层两国政府,这时 VLAN 不太也许一之内外变革为也就是感叹数据集流了。

2. 具备 VLAN tag 的数据集流亦会在 skb_vlan_tag_present 当中进到 vlan_do_recieve 的处理更进一步程序当中,vlan_do_receive 的处理更进一步更进一步的框架就是通过 vlan_find_dev 找次子器材,将数据集流当中的 dev 设为次子器材,然后将 Priority 等与 VLAN 特别的数据集同步进行排查,到了这里面,VLAN 数据集流不太也许变革为一个发自 VLAN 次子器材的都是数据集流了。

3. 在 vlan_do_receive 紧接成后,亦会进到 another_round,重最初按照也就是感叹数据集流的程序当中制订一次词组netif_receive_skb_core,按照也就是感叹包内的处理更进一步逻辑上进到,进到了 rx_handler 的处理更进一步,就像一个也就是感叹的数据集流一样,在次子器材上通过与主器材不同的 rx_handler 进到到互联层。

static int 词组netif_receive_skb_core(struct sk_buff **pskb, bool pfmemalloc,

struct packet_type **ppt_prev)

{

rx_handler_func_t *rx_handler;

struct sk_buff *skb = *pskb;

struct net_device *orig_de

another_round:

skb->skb_iif = skb->dev->ifindex;

/* 这是尝试对数据集帧数据集流本身在此期间做一次vlan的由此可知封装,也就从将取材当中的vlan特别的两个字符串缓冲*/

if (eth_type_vlan(skb->protocol)) {

skb = skb_vlan_untag(skb);

if (unlikely(!skb))

goto out;

}

/* 这里面就是你所陌生的tcpdump的抓包内点了,pt_prev记录了上一个处理更进一步数据集流的handler,如你所见,一份skb也许被很多大都处理更进一步,还包内括pcap */

list_for_each_entry_rcu(ptype, Maxptype_all, list) {

if (pt_prev)

ret = deliver_skb(skb, pt_prev, orig_dev);

pt_prev = ptype;

}

/* 这里面在假定vlan tag的意味着,如果有pt_prev不太也许假定,则在此期间做一次deliver_skb,这样其他handler处理更进一步的时候就亦会复制一份,原始数据集流就不亦会被修正 */

if (skb_vlan_tag_present(skb)) {

if (pt_prev) {

ret = deliver_skb(skb, pt_prev, orig_dev);

pt_prev = NULL;

}

/* 这里面是框架的之内外,我们看得见经过vlan_do_receive处理更进一步在此之后,亦会换成也就是感叹包内甫再来一遍 */

if (vlan_do_receive(Maxskb))

goto another_round;

else if (unlikely(!skb))

goto out;

}

/* 这里面是也就是感叹数据集流应当抵达的大都,pt_prev表示不太也许找了也就是感叹的handler,然后次子程序rx_handler进到下层处理更进一步 */

rx_handler = rcu_dereference(skb->dev->rx_handler);

if (rx_handler) {

if (pt_prev) {

ret = deliver_skb(skb, pt_prev, orig_dev);

pt_prev = NULL;

}

switch (rx_handler(Maxskb)) {

case RX_HANDLER_CONSUMED:

ret = NET_RX_SUCCESS;

goto out;

case RX_HANDLER_ANOTHER:

goto another_round;

case RX_HANDLER_EXACT:

deliver_exact = true;

break;

case RX_HANDLER_PASS:

break;

}

}

if (unlikely(skb_vlan_tag_present(skb)) MaxMax !netdev_uses_dsa(skb->dev)) {

check_vlan_id:

if (skb_vlan_tag_get_id(skb)) {

/* 这里面是对vlan id并无法正确地被摘除的处理更进一步,通常是因为vlan id不非法行为或者不假定在本地

}

}

数据集递送

VLAN 次子器材的数据集递送的正门是 vlan_dev_hard_start_xmit,远比于收包内程序当中,却是递送的程序当中简单很多,软件包内在递送时的程序当中如下:

在操作系统递送时,VLAN 次子器材亦会进到 vlan_dev_hard_start_xmit 步骤,这个步骤由此可知决问题了 ndo_start_xmit 终端,它通过词组vlan_hwaccel_put_tag 步骤缓冲 VLAN 特别的调制由此可知调器数据集到数据集流当中,然后修正了数据集流的器材兼有器材,次子程序主器材的 dev_queue_xmit 步骤重最初进到主器材的递送表头同步进行递送,我们作法在关键性的一之内外来量化:

static netdev_tx_t vlan_dev_hard_start_xmit(struct sk_buff *skb,

struct net_device *dev)

{

/* 这里面就是上甫写到的vlan_tci的缓冲,这些数据集都归属于次子器材本身 */

if (veth->h_vlan_proto != vlan->vlan_proto ||

vlan->flags Max VLAN_FLAG_REORDER_HDR) {

u16 vlan_tci;

vlan_tci = vlan->vlan_id;

vlan_tci |= vlan_dev_get_egress_qos_mask(dev, skb->priority);

词组vlan_hwaccel_put_tag(skb, vlan->vlan_proto, vlan_tci);

}

/* 这里面实际上将器材从次子器材改为了主器材,极其实际上 */

skb->dev = vlan->real_de

len = skb->len;

if (unlikely(netpoll_tx_running(dev)))

return vlan_netpoll_send_skb(vlan, skb);

/* 这里面就可以实际上次子程序主器材同步进行数据集流递送了 */

ret = dev_queue_xmit(skb);

return ret;

}

MACVlan 器材

看紧接 VLAN 次子器材在此之后,马上对 MACVlan 同步进行量化,MACVlan 与 VLAN 次子器材不一样的是,它不太也许不再是调制由此可知调器本身的能力了,而是一种有自己特别设计的终端网器材,这一点首再就基底现在特别设计文档的独立自主,MACVlan 特别的文档必需都设在/drivers/net/macvlan.c 当中。

MACVlan 器材有有五种 mode,其当中除了 source 的系统内外,其余四种都浮现相当早,定义如下:

enum macvlan_mode {

MACVLAN_MODE_PRIVATE = 1, /* don't talk to other macvlans */

MACVLAN_MODE_VEPA = 2, /* talk to other ports through ext bridge */

MACVLAN_MODE_BRIDGE = 4, /* talk to bridge ports directly */

MACVLAN_MODE_PASSTHRU = 8,/* take over the underlying device */

MACVLAN_MODE_SOURCE = 16,/* use source MAC address list to assign */

};

这里面再记住这些的系统的使用暴力,关于其当中的理由是我们中近要讲出的难题。

器材创建者

对于 MACVlan 器材来感叹,它的 netlink 声势浩大结构上基底是 macvlan_link_ops,我们可以找创建者器材的声势浩大步骤为macvlan_newlink,从正门开始,创建者一个 MACVlan 器材的整基底程序当中如下:

1. macvlan_newlink 亦会次子程序 macvlan_common_newlink 同步进行实际的次子器材创建者转换,macvlan_common_newlink 首再亦会同步进行一个正统性的匹配,这其当中须要唯意的就是 netif_is_MACVlan 安同类型检查,如果把一个 MACVlan 次子器材作兼有器材来创建者的话,那么亦会相应采用这个次子器材的主器材作为增建终端的主器材。

2. 再一亦会通过 eth_hw_addr_random 给 MACVlan 器材创建者一个随机的 mac IP,不管怎样,MACVlan 次子器材的 mac IP是随机的,这一点很重要,中近亦会写到。

3. 在有了 mac IP在此之后,开始在主器材上绑定 MACVlan 逻辑上,这里面亦会有个安同类型检查,如果主器材从不创建者过 MACVlan 器材,则亦会通过 macvlan_port_create 来默许 MACVlan 的绑定,而这个绑定极为框架的就是,次子程序 netdev_rx_handler_register 同步进行了 MACVlan 的 rx_handler 步骤 macvlan_handle_frame 去代替了器材原来唯册的 rx_handler 的跳跃。

4. 在绑定紧接成后,获得一个 port,也就是次子器材,然后对次子器材的数据集同步进行了设。

5. 再次通过 register_netdevice 紧接成了器材的创建者跳跃。我们作法在之内外框架逻辑上同步进行量化:

int macvlan_common_newlink(struct net *src_net, struct net_device *dev,

struct nlattr *tb[], struct nlattr *data[],

struct netlink_ext_ack *extack)

{

/* 这里面安同类型检查了主器材到底是macvlan器材,如果是则实际上用以他的主器材 */

if (netif_is_macvlan(lowerdev))

lowerdev = macvlan_dev_real_dev(lowerdev);

/* 这里面生成了随机的macIP */

if (!tb[IFLA_ADDRESS])

eth_hw_addr_random(dev);

/* 这里面同步进行了绑定转换,也就是去除了rx_handler */

if (!netif_is_macvlan_port(lowerdev)) {

err = macvlan_port_create(lowerdev);

if (err

return err;

create = true;

}

port = macvlan_port_get_rtnl(lowerdev);

/* 再一;还有段都是去除成的关于的系统的设 */

vlan->lowerdev = lowerde

vlan->dev = de

vlan->port = port;

vlan->set_features = MACVLAN_FEATURES;

vlan->mode = MACVLAN_MODE_VEPA;

/* 再次唯册了器材 */

err = register_netdevice(dev);

if (err

goto destroy_macvlan_port;

}

分派数据集流

MACVlan 器材的数据集流分派过去大概词组netif_receive_skb_core 正门开始,具基底的文档程序当中如下:

1. 当词组netif_receive_skb_core 在主器材分派后,亦会进到 MACVlan 特别设计唯册的 macvlan_handle_frame 步骤,这个步骤首再亦会处理更进一步TCP的数据集流,然后处理更进一步单播的数据集流。

2. 对于TCP音员甫,经过 is_multicast_ether_addr 后,首再通过 macvlan_hash_lookup,通过次子器材上的特别数据集排序到次子器材,则根据终端的 mode 同步进行处理更进一步,如果是 private 或者 passthrou,找次子器材并分开通过 macvlan_broadcast_one 送给它;如果是 bridge 或者无法 VEPA,则所有的次子器材都亦会通过 macvlan_broadcast_enqueue 收到播送音员甫。

3. 对于单播的数据集流,首再亦会将 source 的系统和 passthru 的系统同步进行处理更进一步,实际上触发下层的转换,对于其他的系统,根据源 mac 同步进行 macvlan_hash_lookup 转换,如果找了 VLAN 数据集,则将数据集流的 dev 设为找的次子器材。

4. 再次对数据集流同步进行 pkt_type 的设,将其通过 RX_HANDLER_ANOTHER 的回到,再同步进行一次词组netif_receive_skb_core 的转换,这次转换当中,走到 macvlan_hash_lookup 时,由于不太也许是次子器材,所以亦会回到 RX_HANDLER_PASS 从而进到下层的处理更进一步。

5. 对于 MACVlan 的数据集分派更进一步,极为关键性的就是主器材分派到数据集流后可选择次子器材的逻辑上,这之内外文档如下:

static struct macvlan_dev *macvlan_hash_lookup(const struct macvlan_port *port,

const unsigned char *addr)

{

struct macvlan_dev *vlan;

u32 idx = macvlan_eth_hash(addr);

hlist_for_each_entry_rcu(vlan, Maxport->vlan_hash[idx], hlist,

lockdep_rtnl_is_held()) {

/* 这之内外逻辑上就是macvlan排序次子器材的框架,相当macIP */

if (ether_addr_equal_64bits(vlan->dev->dev_addr, addr))

return vlan;

}

return NULL;

}

递送数据集流

MACVlan 的递送数据集流更进一步也大概次子器材分派到 ndo_start_xmit 回退函数开始,它的正门是 macvlan_start_xmit,整基底的软件包内文档程序当中如下:

1. 当数据集流进到 macvlan_start_xmit 后,主要制订数据集流递送转换的是 macvlan_queue_xmit 步骤。

2. macvlan_queue_xmit 首再处理更进一步 bridge 的系统,我们从 mode 的定义推知,只有 bridge 的系统下才也许在主器材实际上浮现多种不同次子器材的实际上互联系统,所有这里面处理更进一步了这种比如感叹的情况,把TCP音员甫和意在地为其他次子器材的单播音员甫实际上发给次子器材。

3. 对于其他数据集流,则亦会通过 dev_queue_xmit_accel 同步进行递送,dev_queue_xmit_accel 亦会实际上次子程序主器材的 netdev_start_xmit 步骤,从而由此可知决问题数据集流毫无疑问的递送。

static int macvlan_queue_xmit(struct sk_buff *skb, struct net_device *dev)

{

/* 这里面首再是bridge的系统下的逻辑上,须要考虑必经次子器材近的互联系统 */

if (vlan->mode == MACVLAN_MODE_BRIDGE) {

const struct ethhdr *eth = skb_eth_hdr(skb);

/* send to other bridge ports directly */

if (is_multicast_ether_addr(eth->h_dest)) {

skb_reset_mac_header(skb);

macvlan_broadcast(skb, port, dev, MACVLAN_MODE_BRIDGE);

goto xmit_world;

}

/* 这里面对发自同一个主器材的其他次子器材同步进行处理更进一步,实际上同步进行发送 */

dest = macvlan_hash_lookup(port, eth->h_dest);

if (dest MaxMax dest->mode == MACVLAN_MODE_BRIDGE) {

/* send to lowerdev first for its network taps */

dev_forward_skb(vlan->lowerdev, skb);

return NET_XMIT_SUCCESS;

}

}

xmit_world:

skb->dev = vlan->lowerde

/* 这里面不太也许将数据集流的器材设兼有器材,然后通过主器材同步进行递送 */

return dev_queue_xmit_accel(skb,

netdev_get_sb_channel(dev) ? dev : NULL);

}

IPVlan 器材

IPVlan 次子器材远比于 MACVlan 和 VLAN 次子器材来感叹,静态就更加比较简单了,多种不同于 MACVlan,IPVlan 将与次子器材近衔接使用暴力通过 flag 来定义,同时又透过了三种 mode,定义如下:

/* 最初只有l2和l3,中近linux有了l3mdev,于是就浮现了l3s,他们主要的不同点还是在rx */

enum ipvlan_mode {

IPVLAN_MODE_L2 = 0,

IPVLAN_MODE_L3,

IPVLAN_MODE_L3S,

IPVLAN_MODE_MAX

};

/* 这里面却是还有个bridge,因为配置文件就是bridge,所有去除成了,他们的逻辑上和macvlan一样 */

#define IPVLAN_F_PRIVATE 0x01

#define IPVLAN_F_VEPA 0x02

器材创建者

有了前两种次子器材的量化,在 IPVlan 的量化上,我们也可以按照这个思维在此期间同步进行量化,IPVlan 器材的 netlink 死讯处理更进一步结构上基底是 ipvlan_link_ops,而创建者器材的正门步骤是 ipvlan_link_new,创建者 IPVlan 次子器材的程序当中如下:

1. 进到 ipvlan_link_new,同步进行正统性确实,与 MACVlan 类似,如果以一个 IPVlan 器材作兼有器材同步进行最初增,就亦会相应将 IPVlan 器材的主器材作为最初器材的主器材。

2. 通过 eth_hw_addr_set 设 IPVlan 器材的 mac IP兼有器材的 mac IP,这是 IPVlan 与 MACVlan 最轻微的特征界定。

3. 进到标准化终端唯册的 register_netdevice 程序当中,在这个程序当中里面,如果这两项无法 IPVlan 次子器材假定,则亦会和 MACVlan 一样,进到到 ipvlan_init 的绑定更进一步,它亦会在主器材上创建者 ipvl_port,并且用 IPVlan 的 rx_handler 去代替主器材改以的 rx_handler,同时也亦会启动一个都由的软件包内 worker 去处理更进一步TCP音员甫,也就是感叹,对于 IPVlan,所有的TCP音员甫却是都是标准化处理更进一步的。

4. 再一在此期间处理更进一步这两项这个最初增的次子器材,通过 ipvlan_set_port_mode 将这两项次子器材复原到主器材的数据集当中,同时针对 l3s 的次子器材,亦会将它的 l3mdev 处理更进一步步骤唯册到 nf_hook 当中,不管怎样,这是和纸片器材仅次于的不同点,l3s 的主器材和次子器材交换数据集流实际上是在互联层紧接成的。

对于 IPVlan 互联器材,我们作法在 ipvlan_port_create 一之内外文档同步进行量化:

static int ipvlan_port_create(struct net_device *dev)

{

/* 从这里面可以看得见,port是主器材对次子器材管理的框架 */

struct ipvl_port *port;

int err, idx;

/* 次子器材的各种物件,都在port当中基底现,也可以看得见配置文件的mode是l3 */

write_pnet(Maxport->pnet, dev_net(dev));

port->dev = de

port->mode = IPVLAN_MODE_L3;

/* 这里面可以看得见,对于ipvlan,TCP的数据集流都是分开处理更进一步的 */

skb_queue_head_init(Maxport->backlog);

INIT_WORK(Maxport->wq, ipvlan_process_multicast);

/* 这里面就是除此以内外转换了,却是他是靠着这里面来让主器材的收包内可以如愿配合ipvlan的跳跃 */

err = netdev_rx_handler_register(dev, ipvlan_handle_frame, port);

if (err)

goto err;

}

分派数据集流

IPVlan 次子器材的三种 mode 分别有多种不同的收包内处理更进一步程序当中,在软件包内的程序当中如下:

1. 与 MACVlan 类似,首再亦会经过词组netif_receive_skb_core 进到到创建者时唯册的 ipvlan_handle_frame 的处理更进一步程序当中,此时数据集流过去是主器材所具备。

2. 对于 mode l2 的系统的数据集流处理更进一步,只处理更进一步TCP的数据集流,将数据集流放到前面创建者次子器材时绑定的TCP处理更进一步的表头;对于单播音员甫,亦会实际上交给 ipvlan_handle_mode_l3 同步进行处理更进一步!

3. 对于 mode l3 或者单播的 mode l2 数据集流,进到 ipvlan_handle_mode_l3 处理更进一步程序当中,首再通过 ipvlan_get_L3_hdr 给与到互联层的脚数据集,然后根据 ip IP去排序到相关联的次子器材,再次次子程序 ipvlan_rcv_frame,将数据集流的 dev 设为 IPVlan 次子器材并回到 RX_HANDLER_ANOTHER,同步进行下一次收包内。

4. 对于 mode l3s,在 ipvlan_handle_frame 当中亦会实际上回到 RX_HANDLER_PASS,也就是感叹,mode l3s 的数据集流亦会在主器材就进到到互联层的处理更进一步阶段,对于 mode l3s 来感叹,事再唯册的 nf_hook 亦会在 NF_INET_LOCAL_IN 时触发,制订 ipvlan_l3_rcv 转换,通过 addr 找次子器材,更换数据集流的互联层意在IP,然后实际上进到 ip_local_deliver 同步进行互联层余下的转换。

递送数据集流

IPVlan 的数据集流递送,尽管在由此可知决问题上相比之下比较简单,但是究其根本,还是各个次子器材在自已办法用主器材来在此期间做到递送数据集流的工作,IPVlan 次子器材同步进行数据集流递送时,首再进到 ipvlan_start_xmit,其框架的递送转换在 ipvlan_queue_xmit,软件包内文档程序当中如下:

1. ipvlan_queue_xmit 根据次子器材的的系统可选择多种不同的递送步骤,mode l2 通过 ipvlan_xmit_mode_l2 递送,mode l3 和 mode l3s 同步进行 ipvlan_xmit_mode_l3 递送。

2. 对于 ipvlan_xmit_mode_l2,首再确实到底是本地IP或者 VEPA 的系统,如果不是 VEPA 的系统的本地数据集流,则首再通过 ipvlan_addr_lookup 隐匿到到底是不同主器材下的 IPVlan 次子器材,如果是,则通过 ipvlan_rcv_frame 让其他次子器材同步进行收包内处理更进一步;如果不是,则通过 dev_forward_skb 让主器材同步进行处理更进一步。

3. 再一 ipvlan_xmit_mode_l2 亦会对TCP音员甫同步进行处理更进一步,在处理更进一步前,通过 ipvlan_skb_crossing_ns 排查打碎数据集流的 netns 特别的数据集,还包内括 priority 等,再次将数据集流放到 ipvlan_multicast_enqueue,触发上述的TCP处理更进一步程序当中。

4. 对于非本地的数据集流,通过主器材的 dev_queue_xmit 同步进行递送。

5. ipvlan_xmit_mode_l3 的处理更进一步首再也是对 VEPA 同步进行确实,对与非 VEPA 的系统的数据集流,通过ipvlan_addr_lookup 排序到底是其他次子器材,如果是则次子程序 ipvlan_rcv_frame 触发其他器材同步进行收包内处理更进一步。

6. 对于非 VEPA 的系统的数据集流,首再同步进行 ipvlan_skb_crossing_ns 的处理更进一步,然后同步进行 ipvlan_process_outbound的转换,此时根据数据集流的互联层两国政府,可选择 ipvlan_process_v4_outbound 或者 ipvlan_process_v6_outbound 同步进行处理更进一步。

7. 以 ipvlan_process_v6_outbound 为例,首再亦会通过 ip_route_output_flow 同步进行路由的排序,然后实际上通过互联层的 ip_local_out,在主器材的互联层在此期间同步进行台东府转换。

由此可知决难题

个人经历纸片的量化和一番基底亦会理解,我自已至少第一个难题不太也许可以很轻易的讲出出来了:

VLAN 与 MACVlan/IPVlan 的关连

VLAN 和 IPVlan,MACVlan 有什么关连呢?为什么昵称里面都有 VLAN?

既然 MACVlan 和 IPVlan 可选择叫这个昵称,那感叹明在某些方面还是有相似之处的。我们整基底量化下来发现,VLAN 次子器材和 MACVlan,IPVlan 的框架逻辑上很相似:

1. 主器材负责宇宙学上的收台东府。

2. 主器材将次子器材管理为多个 port,然后根据一定的前提找 port,比如 VLAN 数据集,mac IP以及 ip IP(macvlan_hash_lookup,vlan_find_dev,ipvlan_addr_lookup)。

3. 主器材收包内后,都须要经过在词组netif_receive_skb_core 当中走一段“回脚路”.

4. 次子器材台东府最终都是实际上通过修正数据集流的 dev,然后让主器材去转换。

所以不难推论,MACVlan/IPVlan 的内在逻辑上却是非常大程度上概述了 Linux 的 VLAN 的由此可知决问题。Linux 较早加入 MACVlan 是在 2007 年 6 同年 18 日发布的 2.6.63 旧版本[3],对他的描述是:

The new "MACVlan" driver allows the system administrator to create virtual interfaces mapped to and from specific MAC addresses.

而到了 2014 年 12 同年 7 日 发布的 3.19 旧版本[4]当中,第一次扩展了 IPVlan,他的描述是:

The new "IPVlan" driver enable the creation of virtual network devices for container interconnection. It is designed to work well with network namespaces. IPVlan is much like the existing MACVlan driver, but it does its multiplexing at a higher level in the stack.

至于 VLAN,浮现的远比 Linux 2.4 旧版本还要早,很多器材的初版特别设计就不太也许默许了 VLAN,不过,Linux 对于 VLAN 的 hwaccel 由此可知决问题,是 2004 年的 2.6.10[5],当时更最初的;还有批特性当中,浮现了这一条:

I was poking about in the National Semi 83820 driver, and I happened to notice that the chip supports VLAN tag add/strip assist in hardware, but the driver wasn't making use of it. This patch adds in the driver support to use the VLAN tag add/remove hardware, and enables the drivers use of the kernel VLAN hwaccel interface.

也就是感叹,当 Linux 开始把 VLAN 在此期间做为一个 interface 处理更进一步后,才有了中近的 MACVlan 和 IPVlan 两个 virtual interface,Linux 为了由此可知决问题对于 VLAN 数据集流的处理更进一步程序当中的加速,把多种不同的 VLAN 终端成了器材,而后半期 MACVlan 和 IPVlan 在这种思维之下,让终端器材有了较小的用武之地。

这样看来,它们的关连更像是一种致敬。

关于 VEPA/passthrough/bridge/private

IPVlan 和 MACVlan 为什么亦会有各种的系统和 flag,比如 VEPA,private,passthrough 等等?它们的不同点在哪里面?

却是在软件包内的量化当中,我们不太也许大致了由此可知了这几种的系统的展现,假如主器材是一个钉钉群,所有的群友都可以向内外发死讯,那么却是几种的系统就极其直观:

private 的系统,群友们相互之近都是禁言的,既不会在群内,也不会在群内外。 bridge 的系统,群友们可以在群内愉快发言。 VEPA 的系统,群友们在群内禁言了,但是你们在群内外实际上私聊,相当于年亦会抢红包内一时期的集基底禁言。 passthrough 的系统,这时候你就是群主了,除了你没人能发言。

那么为什么亦会有这几种的系统呢?我们从软件包内的展现来看,无论是 port,还是 bridge,却是都是互联的定义,也就是感叹,从一开始,Linux 就在帮助将自己展现成一个合格的互联器材,对于主器材,Linux 帮助将它在此期间做成一个局域网,对于次子器材,那就是一个个网线犹如的器材,这样看起来就很有效了。

实际上正是这样,无论是 VEPA 还是 private,它们最初都是互联定义。却是不止是 Linux,我们见到很多致力把自己扮成宇宙学互联的项目,都沿袭了这些使用暴力的系统,比如 OpenvSwitch[6]。

MACVlan 与 IPVlan 的应用

IPVlan 和 MACVlan 的劣势在哪里面?你应当在什么意味着接触到,用以到它们呢?

却是到这里面,才开始感叹到本篇甫章的力图。我们从第二个难题发现,IPVlan 和 MACVlan 都是在在此期间做一件多事:终端互联。我们为什么要终端互联呢?这个难题有很多到底,但是和互联免费的价值一样,终端互联作为互联免费的一项根基应用,它们最终都是为了海洋资源储存量的大幅提高。

MACVlan 和 IPVlan 就是免费了这个最终意在,郑伟们第一台宇宙学机跑一个 helloworld 的时代过去过去,从终端化到装入化,时代对互联表面积提出批评了愈发较低的决定,伴随着装入应用的诞生,首再是 veth 铺平开场,但是表面积够了,还要效能的较低效,MACVlan 和 IPVlan 通过次子器材大幅提高表面积并前提较低效的作法应运而生(当然还有我们的 ENI-Trunking)。

感叹到这里面,就要为大家推荐一下阿里面云装入免费 ACK 给大家带来的较低效能、较低表面积的互联最初决定——IPVlan 决定[7]!

ACK 基于 Terway 该软件,由此可知决问题了基于 IPVlan 的 K8s 互联由此可知决决定。Terway 互联该软件是 ACK 自研的互联该软件,将原生的张力终端分配给 Pod 由此可知决问题 Pod 互联,默许基于 Kubernetes 标准的互联战略(Network Policy)来定义装入近的访问战略,并相容 Calico 的互联战略。

在 Terway 互联该软件当中,每个 Pod 都具备自己互联堆和IPIP。同第一台 ECS 内的 Pod 之近互联系统,实际上通过机器实际上的发送,跨 ECS 的 Pod 互联系统、数据集流通过 VPC 的张力终端实际上发送。由于不须要用以 VxLAN 等的隧道应用封装数据集流,因此 Terway 的系统互联具有较较低的互联系统效能。Terway 的互联的系统如下示意图示意图:

客户免费在用以 ACK 创建者空降兵时,如果可选择 Terway 互联该软件,可以的设计其用以 Terway IPvlan 的系统。Terway IPvlan 的系统采用 IPvlan 终端化和 eBPF 软件包内应用由此可知决问题较低效能的 Pod 和 Service 互联。

多种不同于配置文件的 Terway 的互联的系统,IPvlan 的系统主要在 Pod 互联、Service、互联战略(NetworkPolicy)在此期间做了效能的提较低效率:

Pod 的互联实际上通过 ENI 终端的 IPvlan L2 的次子终端由此可知决问题,除此以外了互联在宿主机上的发送程序当中,让 Pod 的互联效能几乎与宿主机的效能无异,延迟相比之下传统的系统减低 30%。 Service 的互联采用 eBPF 去除改以的 kube-proxy 的系统,不须要经过宿主机上的 iptables 或者 IPVS 发送,在大规模空降兵当中效能几乎无减低,扩展性胜于。在大量增建连接和调制解调器构建情景请求延迟比 IPVS 和 iptables 的系统的不断减低。 Pod 的互联战略(NetworkPolicy)也采用 eBPF 去除打碎改以的 iptables 的由此可知决问题,不须要在宿主机上产生大量的 iptables 前提,让互联战略对互联效能的不良影响降到最少。

所以,透过 IPVlan 为每个业务范围 pod 分配 IPVlan 终端,既前提了互联的表面积,也使传统互联的 Veth 决定由此可知决问题巨大的效能大幅提高(详见概述元数据 7)。同时,Terway IPvlan 的系统透过了较低效能的 Service 由此可知决决定,基于 eBPF 应用,我们规避了诟病已久的 Conntrack 效能难题。

认为无论是什么情景的业务范围,ACK with IPVlan 都是一个更为出色的可选择。

再次感恩你能写出到这里面,在这个难题犹如,却是隐藏了一个难题,你告诉他为什么我们可选择 IPVlan,而无法可选择 MACVlan 么?如果你对终端互联应用有了由此可知,那么结合上述的内容,你应当在此之后就有到底了,也欢迎你在评论区留言。

概述元数据:

[1] 《关于 IEEE 802.1Q》

_802.1Q

[2] 《Docker Engine release notes》

[3] 《Merged for MACVlan 2.6.23》

[4] 《MACVlan 3.19 Merge window part 2》

[5] 《VLan 2.6.10-rc2 long-format changelog》

[6] 《[ovs-dev] VEPA support in OVS》

[7] 《阿里面云 Kubernetes 空降兵用以 IPVlan 加速 Pod 互联》

点击此处,了由此可知基于阿里面云 ACK Terway 的 IPvlan。

原甫元数据:

本甫为阿里面云原创内容,未经容许不得转载。

吃了妈咪爱还能吃肠炎宁吗
感冒嗓子疼用什么消炎药
肠炎吃什么药能治好
髋关节肿胀怎么治疗
如何治疗腰椎病最好
相关阅读
友情链接