ipvlan介绍

2023-12-02 21:12
文章标签 介绍 ipvlan

本文主要是介绍ipvlan介绍,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近使用docker,涉及到需要跨多台物理机部署系统,查了好多资料,最后查到了ipvlan。那什么是vlan,什么又是ipvlan。

交换机层面的vlan,是按802.1Q规范,在链路层中加了4字节的标识vlan的数据,交换机根据接口的类型,pid以及vlan的id,来判断是否需要转发此数据包,最终实现了不同vlan的广播包的隔离。

ipvlan不涉及802.1Q协议,是基于linux的ipvlan驱动实现的,其原理是在一台物理机上,可以创建多个虚拟网络设备,这些设备拥有相同的mac地址。如下图所示:

物理机computer1,其网卡eth0 ip地址是192.168.1.2,mac是00-50-56-C0-00-08。其中包含两个ipvlan设备,ip是192.168.2.2和192.168.2.3,网段与物理机不同,但其与物理机共用同一个mac。

先说下结论,物理机1中的192.168.2.2可以与物理机2中的192.168.2.4通信。下面以l2模式192.168.2.2向192.168.2.4发送arp包,说下具体的通信过程。

1. 重要的数据结构

每一个ipvlan设备,都有对应的net_device和ipvl_dev。

主设备(net_device *phy_dev)是ipvlan_link_new方法中tb[IFLA_LINK]指定的序号的设备,主设备带有IFF_IPVLAN_MASTER标记,而子设备带有IFF_IPVLAN_SLAVE标记。

调用register_netdevice注册设备时,会调用ipvlan_init,如果主设备还未打上IFF_IPVLAN_MASTER标记,会执行ipvlan_port_create创建ipvl_port,并给主设备打IFF_IPVLAN_MASTER标记。ipvl_port是用于同一个主设备的所有设备共享的,子设备会连接到ipvl_port的ipvlans链表上。

2. 数据离开物理机1

数据发送方法是ipvlan_start_xmit->ipvlan_queue_xmit->ipvlan_xmit_mode_l2。

在ipvlan_xmit_mode_l2中,通过源mac和目的mac,来判断是否是目的地址是本机的包。

ether_addr_equal(eth->h_dest, eth->h_source)

arp包目的mac地址是ff-ff-ff-ff-ff-ff,与物理机1mac地址不相同,调用dev_queue_xmit,最终将包通过物理网卡eth0发送出去。广播包的格式如下:

00-50-56-C0-00-08 (oui Unknown) > Broadcast, ethertype ARP (0x0806), length 42: Request who-has 192.168.2.4 tell 192.168.2.2, length 28

3. 数据包进入物理机2

网络设备开启时,执行ipvlan_addr4_event->ipvlan_add_addr4->ipvlan_add_addr,将ip地址添加到port->hlhead和ipvlan->addrs上。

广播包会被同网段(交换机未划vlan的情况下)的所有物理机收到。ipvlan接收处理流程如下:

ipvlan_handle_frame->ipvlan_handle_mode_l2。

在ipvlan_handle_mode_l2中通过ipvlan_get_L3_hdr获取arp头,arp头中包含目的ip。再通过ipvlan_addr_lookup查找到目的ipvlan设备,数据包交给ipvlan_rcv_frame处理。

ipvlan_rcv_frame中调用ipvlan_skb_crossing_ns将数据包的目的网络设备更改为拥有192.168.2.4ip地址的ipvlan设备,数据最终到达192.168.2.4对应的网络设备。

ipvlan_skb_crossing_ns(skb, dev);

4. arp回包

arp的回复包,由 192.168.2.4发送,目的mac地址为物理机1 eth0的mac地址,数据离开物理机2,进入物理机1,最终到达192.168.2.2,与上面的过程类似,就不再赘述了。

这篇关于ipvlan介绍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/446852

相关文章

Pytest多环境切换的常见方法介绍

《Pytest多环境切换的常见方法介绍》Pytest作为自动化测试的主力框架,如何实现本地、测试、预发、生产环境的灵活切换,本文总结了通过pytest框架实现自由环境切换的几种方法,大家可以根据需要进... 目录1.pytest-base-url2.hooks函数3.yml和fixture结论你是否也遇到过

MySQL中慢SQL优化的不同方式介绍

《MySQL中慢SQL优化的不同方式介绍》慢SQL的优化,主要从两个方面考虑,SQL语句本身的优化,以及数据库设计的优化,下面小编就来给大家介绍一下有哪些方式可以优化慢SQL吧... 目录避免不必要的列分页优化索引优化JOIN 的优化排序优化UNION 优化慢 SQL 的优化,主要从两个方面考虑,SQL 语

C++中函数模板与类模板的简单使用及区别介绍

《C++中函数模板与类模板的简单使用及区别介绍》这篇文章介绍了C++中的模板机制,包括函数模板和类模板的概念、语法和实际应用,函数模板通过类型参数实现泛型操作,而类模板允许创建可处理多种数据类型的类,... 目录一、函数模板定义语法真实示例二、类模板三、关键区别四、注意事项 ‌在C++中,模板是实现泛型编程

Python实现html转png的完美方案介绍

《Python实现html转png的完美方案介绍》这篇文章主要为大家详细介绍了如何使用Python实现html转png功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 1.增强稳定性与错误处理建议使用三层异常捕获结构:try: with sync_playwright(

Java使用多线程处理未知任务数的方案介绍

《Java使用多线程处理未知任务数的方案介绍》这篇文章主要为大家详细介绍了Java如何使用多线程实现处理未知任务数,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 知道任务个数,你可以定义好线程数规则,生成线程数去跑代码说明:1.虚拟线程池:使用 Executors.newVir

JAVA SE包装类和泛型详细介绍及说明方法

《JAVASE包装类和泛型详细介绍及说明方法》:本文主要介绍JAVASE包装类和泛型的相关资料,包括基本数据类型与包装类的对应关系,以及装箱和拆箱的概念,并重点讲解了自动装箱和自动拆箱的机制,文... 目录1. 包装类1.1 基本数据类型和对应的包装类1.2 装箱和拆箱1.3 自动装箱和自动拆箱2. 泛型2

四种Flutter子页面向父组件传递数据的方法介绍

《四种Flutter子页面向父组件传递数据的方法介绍》在Flutter中,如果父组件需要调用子组件的方法,可以通过常用的四种方式实现,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录方法 1:使用 GlobalKey 和 State 调用子组件方法方法 2:通过回调函数(Callb

Python进阶之Excel基本操作介绍

《Python进阶之Excel基本操作介绍》在现实中,很多工作都需要与数据打交道,Excel作为常用的数据处理工具,一直备受人们的青睐,本文主要为大家介绍了一些Python中Excel的基本操作,希望... 目录概述写入使用 xlwt使用 XlsxWriter读取修改概述在现实中,很多工作都需要与数据打交

java脚本使用不同版本jdk的说明介绍

《java脚本使用不同版本jdk的说明介绍》本文介绍了在Java中执行JavaScript脚本的几种方式,包括使用ScriptEngine、Nashorn和GraalVM,ScriptEngine适用... 目录Java脚本使用不同版本jdk的说明1.使用ScriptEngine执行javascript2.

Python实现NLP的完整流程介绍

《Python实现NLP的完整流程介绍》这篇文章主要为大家详细介绍了Python实现NLP的完整流程,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 编程安装和导入必要的库2. 文本数据准备3. 文本预处理3.1 小写化3.2 分词(Tokenizatio