Networking 基本术语/概念-程序员宅基地

技术标签: 网络  运维  操作系统  

目录

基本概念

冲突域(Collision Domain)

冲突域是一种 “物理分段”,指连接在同一物理介质(e.g. 中继器、集线器)上的所有站点的集合。这些站点之间存在物理介质争用现象(e.g. 传统以太网中的 CSMA/CD 介质检测原理),也就是它们在数据通信时需要共享公用物理介质的某个部分。

在同一冲突域中的计算机等设备互联时会通过同一个物理通道,同一时刻只允许一个设备发送的数据在这条通道中通过,其他设备发送的数据则要等到这个通道处于 “空闲” 时才可以继续通过,否则会出现冲突,这时就可能出现大量的数据包因为延时而被丢弃或者丢失。冲突域指的是不会产生这类冲突的最小范围。

冲突域可以衡量一个设备的性能,冲突域越小性能就越高。集线器、中继器都是典型的共享介质连接设备,工作在物理层上。连接在这些设备上的站点都处于同一个冲突域中

而工作在数据链路层上的设备,如网桥和交换机,它们是可以划分冲突域的,也可以连接不同的冲突域。如果我们把集线器、中继器上的传输通道看成是一根电缆的话,则可将网桥、交换机的交换通道看成是一束电缆,有多条独立的通道,这样就可以允许同一时刻进行多方通信了。虽然网桥与中继器类似,都只有两个端口,但网桥可用于连接不同的物理网段(ps:这里区别于网络层的 IP 逻辑网段)。可以把网桥看成是可以连接两个冲突域的设备,连接在同一网桥上的两个网段各自成为一个冲突域。交换机则是网桥的扩展,它有许多端口,而且每个端口就是一个冲突域,即一个或多个端口的高速传输不会影响其他端口的传输,因为不同端口发送的数据不需要在同一条通道中排队通过,而只是在同一端口中的数据才要在对应端口通道中排队。

简单来说,冲突域可以看成是一条直通的管道,同时只能有一端发送数据。

广播域(Broadcast Domain)

如果一个数据包的目标地址是这个网段的广播 IP 地址(广播 IP 地址对应网段的最后一个 IP 地址,e.g. 192.168.10.255/24)或者目标计算机的 MAC 地址是 FF-FF-FF-FF-FF-FF,那么这个数据包就会被这个网段的所有计算机接收并响应,这就叫做广播包(e.g. ARP 请求发出的广播包)。

广播域就是指可以接收相同广播消息的站点范围,在此范围中,任意一个站点发出广播包,都会被其他站点接收到。广播域是数据链路层的概念,所以像网桥和交换机等二层网络设备所连接的站点都被认为处于同一广播域,前提是各站点都处于同一 IP 网段,一个局域网就是一个广播域(往往是指一个 IP 逻辑网段),广播域中的机器可以收到域中其他任何一台机器的广播,而不能收到域外机器的广播,域外机器也不能收到域内机器发的广播;

而路由器、三层交换机、VLAN 交换机这样的二、三层网络设备是可以划分广播域的,即它们可以连接不同的广播域,换句话说就是一个可路由端口所连接的网段为一个广播域。

通常广播包是用来进行 ARP 寻址等用途的,但是广播域无法控制也会对网络健康带来严重影响(e.g. 带宽、网络延迟)。二层交换机对广播的处理是转发,所以不能分割广播域;而路由器一般不会转发广播,所以可以分割或定义广播域。

VLAN 一般被用于将一个大的网络划分成多个小的虚拟网络,所以 VLAN 也具有划分多个广播域、缩小广播域大小的功能。因为不同 VLAN 间是不能直接通信的,VLAN 间的通信需要依靠三层路由,就像不同网段间的通信一样。

冲突域与广播域的区别

冲突域 广播域
物理层(一层)的概念 数据链路层(二层)的概念
只发生在同一个物理网段 可以跨物理网段
被网桥、交换机等二层设备划分 被路由器、三层交换机等三层设备划分
在同一冲突域中的所有站点都能收到所有被发送的帧 网络中能接收任一站点发出的广播帧的所有设备的集合
集线器(HUB) 所有端口都在同一个冲突域内 交换机(Swith)所有端口都在同一个广播域内,而每一个端口又是一个冲突域

在这里插入图片描述

NOTE

  • 一层设备(中继器、集线器)不能划分冲突域和广播域。
  • 二层设备(网桥、第二层交换机)能划分冲突域,不能划分广播域,但二层交换机的 VLAN 可以划分广播域。
  • 三层设备(路由器)既能划分冲突域,又能划分广播域。

所以,常说的一个广播域实际就是路由器一个网关接口下的由若干个交换机(VLAN、Trunk 口)组成的二层网络。而一个冲突域就是交换机的一个端口

IP 网络数据传输方式

  • 单播(Unicast):在发送者和每一接收者之间实现点对点网络连接。如果一台发送者同时给多个的接收者传输相同的数据,也必须相应的复制多份相同的数据包。如果有大量主机希望获得数据包的同一份拷贝时,将导致发送者负担沉重、延迟长、网络拥塞;

  • 广播(Broadcasting):是指在IP子网内广播数据包,所有在子网内部的主机都将收到这些数据包。广播意味着网络向子网每一个主机都投递一份数据包,不论这些主机是否乐于接收该数据包。所以广播的使用范围非常小,只在本地子网内有效,通过路由器和网络设备控制广播传输。

  • 组播(Multicast):在发送者和每一接收者之间实现点对多点网络连接。如果一台发送者同时给多个接收者传输相同的数据,也只需复制一份相同的数据包。它提高了数据传送效率,减少了骨干网络出现拥塞的可能性。组播解决了单播和广播方式效率低的问题。当网络中的某些用户需求特定信息时,组播源(即组播信息发送者)仅发送一次信息,组播路由器借助组播路由协议为组播数据包建立树型路由,被传递的信息在尽可能远的分叉路口才开始复制和分发。

  • 多播(Multicast):1988 年 Steve Deering 首次在其博士论文中提出 IP 多播的概念。多播是 IPv6 数据包的 3 种基本目的地址类型之一,多播是一点对多点的通信,IPv6 没有采用 IPv4 中的组播术语,而是将广播看成是多播的一个特殊例子。

物理网络设备

发展简述

以太网设计目标:电脑使用一个网络接口,可以同时与多台电脑通信,将电脑连接起来的 “黑盒子” 最先面世,称之为集线器(Hub)。这种集线器,通常有多个端口,可以接入多台电脑,使电脑连接在一起成为一种可能,其内部工作原理就是信号放大器。随着以太网的流行,越来越多的办公室使用它,网络变得越来越大,信号随着网线距离的变长,信号衰减的使得通信变得越发不可靠,同样需要可以将信号中继、放大的集线器。但这种集线器只需两个端口,一端连着一根网线,由于其本来的目的就是延伸网线,美其名曰:网桥,这个更像描述其功能性的一面,“牵线搭桥”之意。在集线器的基础上,添加了 MAC 地址学习功能,成为了交换机,这样可以避免集线器对所有帧都进行广播的弊病。但这些设备依然都是桥接设备,因为帧经过它们时,帧原封不动。

中继器(Repeater)

一个将输入信号增强放大的模拟设备,而不考虑输入信号种类(是类比的还是数字的)。中继器是用来加强缆在线的信号,把信号送得更远,以延展网络长度。当电子信号在电缆上传送时,信号强度会随着传递长度的增加而递减。因此需要中继器将信号重新加强以增加数据的发送距离。

简单来说,中继器就是一种用于频率转换及功率增强的模块或设备,主要用于信号增强和频率差转。

集线器(hub)

集线器(HUB)属于数据通信系统中的基础设备,它和双绞线等传输介质一样,是一种不需任何软件支持或只需很少管理软件管理的硬件设备。它被广泛应用到各种场合。集线器工作在局域网(LAN)环境,应用于 OSI 参考模型的物理层,因此又被称为物理层设备。集线器内部采用了电器互联,当维护 LAN 的环境是逻辑总线或环型结构时,完全可以用集线器建立一个物理上的星型或树型网络结构。在这方面,集线器所起的作用相当于多端口的中继器。其实,集线器实际上就是中继器的一种,其区别仅在于集线器能够提供更多的端口服务,所以集线器又叫多口中继器

工作过程:集线器的工作过程是非常简单的,首先是节点发信号到线路,集线器接收该信号,因信号在电缆传输中有衰减,集线器接收信号后将衰减的信号整形放大,最后集线器将放大的信号广播转发给其他所有端口

网桥(bridge)

网桥的电梯间演讲:网桥是一种在链路层实现中继,对帧进行转发的技术,根据MAC分区块,可隔离碰撞,将网络的多个网段在数据链路层连接起来的网络设备。

有人把网桥(bridge)比喻成一个聪明的 “中继器”,网桥和中继器一般只有两个接口,但中继器只是对所接收的信号进行放大,然后直接发送到另一个端口连接的电缆上,主要用于扩展网络的物理连接范围。而网桥除了可以扩展网络的物理连接范围外,还可以对 MAC 地址进行分区,隔离不同物理网段之间的碰撞(隔离冲突域)。集线器和中继器都是物理层设备,而网桥属于数据链路层设备。

简单来说,网桥工作在数据链路层,它会过滤 MAC,只有目的 MAC 地址匹配的帧(Frame)才会发送到出口。一个网桥就是一个输入到输出的桥接(bridging)。

NOTE 1:因为网桥只有两个端口,所以连接的两个物理网段的主机通常就是由当时的集线器进行集中连接的(网桥端口通常不是直接连接主机,而是连接集线器的)。
NOTE 2:基本网桥只有两个端口,还有一种网桥叫做多口网桥,多口网桥有多个端口。
在这里插入图片描述
上图中所示的物理网段 1 和物理网段 2 中的主机分别通过集线器集中连接起来,两个物理网段各自形成一个冲突域。而网桥的背板信道不是共享的(每个端口的数据收发都有一条单独的信道),所以网桥隔离了两个冲突域。

网桥的工作原理

  • 缓存:网桥首先会对收到的数据帧进行缓存并处理;
  • 过滤:判断入帧的目标节点是否位于发送这个帧的物理网段中(同一端口中),如果是,网桥就不把帧转发到网桥的其他端口;
  • 转发:如果帧的目标节点位于另一个网络,网桥就将帧发往正确的物理网段(向另一端口转发);

网桥基于 MAC 的转发原理

网桥除了可以隔离冲突域,还可以基于物理网段的 MAC 地址进行学习,并根据 MAC 地址表对帧进行转发。
在这里插入图片描述
MAC 地址表,也叫 MAC-Port 映射表也就是通常所说的 CAM(Content Addressable Memory,内容可寻址存储器)表,保存的是对应 MAC 地址主机与所连接的网桥(或交换机)端口的映射。

假设上图所示,网络中的一台 PC 要向另一台PC 发送数据。因为集线器不会识别帧中的 MAC 地址,所以无论是哪台主机要发送数据,在集线器上都是以广播方式进行的,连接该集线器上的同一个冲突域的所有节点都会收到这个广播帧,包括网桥连接到该集线器的端口。

  1. 当网桥收到集线器的广播帧后,网桥会把帧中的源 MAC 地址和目的 MAC 地址与网桥缓存中保存的 MAC 地址表进行比较。
  2. 最初,网桥的缓存中是没有任何 MAC 地址的,所以一开始它也不知道目标主机和源主机都在哪个物理网段上,收到的所有帧都直接以泛洪方式转发到另一个端口上,同时会把数据帧中的源 MAC 地址所对应的物理网段记录下来(其实就是与对应的网桥端口对应起来)。
  3. 在数据帧被某个 PC 接收后,也会把对应目的 MAC 地址所对应的物理网段记录在缓存中的 MAC 表中。这样,经过多次 “学习”,就可以在 MAC 地址表中把整个网络中各主机 MAC 地址与对应的物理网段全部记录下来。因为网桥的端口通常是连接集线器的,所以一个网桥端口会与多个主机 MAC 地址进行映射。
  4. 当网桥收到的数据帧中源 MAC 地址和目的 MAC 地址都在网桥 MAC 地址表中可以找到时,网桥会比较这两个 MAC 地址是否属于同一个物理网段。如果是同一物理网段,则网桥不会把该帧转发到下一个端口,直接丢弃,起到冲突域隔离作用。相反,如果两个 MAC 地址不在同一物理网段,则网桥会把从一个物理网段发来的帧转发到连接另一个物理网段上,然后再通过所连接的集线器进行复制方式的广播。
    在这里插入图片描述

MAC 地址表的表项可以由管理员手动绑定创建,也可以由网桥(或交换机)自动学习得到。如果在交换机上,可以通过一些命令(如 Cisco 交换机是使用 show mac-address-table)查看。下面是一个在交换机上查看 MAC 地址和端口映射表的示例,其中列出了交换机中为 CPU 分配的静态(Static)MAC 地址和通过学习功能自动学习得到的动态(Dynamic)MAC 地址,其中的 Ports 列显示的是对应 MAC 地址主机所连接的端口,VLAN 列则为对应主机连接端口所属的 VLAN。

switch # show mac-address-table  
Mac Address Table  
-------------------------------------------  
Vlan Mac Address Type Ports  
---- ----------- -------- -----  
All 0100.0ccc.cccc STATIC CPU  
All 0100.0ccc.cccd STATIC CPU  
All ffff.ffff.ffff STATIC CPU  
1 0000.0c07.accb DYNAMIC Gi0/1  
1 0002.8501.de00 DYNAMIC Gi0/1  
1 0015.f915.8e80 DYNAMIC Gi0/1  
1 0016.7694.c009 DYNAMIC Gi0/1  
1 0020.ed14.399c DYNAMIC Gi0/1  
1 0030.b637.8e10 DYNAMIC Gi0/1  
1 0050.ba10.404a DYNAMIC Gi0/1  
100 0007.847b.c40a DYNAMIC Gi0/1  
100 00d0.d3a4.7cec DYNAMIC Gi0/1  
110 0006.28bb.71c0 DYNAMIC Gi0/1  
110 00d0.d3a4.7cec DYNAMIC Gi0/1  
120 0000.b497.8250 DYNAMIC Fa0/20  
120 0002.b3d8.68e7 DYNAMIC Fa0/20  
120 0002.b3d8.6928 DYNAMIC Fa0/20  
120 0003.a03a.03fc DYNAMIC Fa0/19 

网桥的核心作用

通过上面的描述可以感受到,网桥最核心的作用就是:与集线器配合将规模较大的局域网划分成多个既互相对独立又能互相通信的两个局域网子网段(划分冲突域),从而改善各个子网段的性能、可靠性和安全性。
在这里插入图片描述

网桥的主要缺点

由于网桥在进行数据帧转发前会对数据帧进行缓冲,与中继器相比引入了更多的时延。而且网桥不提供流控功能,因此在流量较大时有可能会造成过载,从而丢失数据帧,不能最佳地利用网络带宽。所以网桥通常用于链接数量不多的,具有相同或相似体系结构网络系统。

交换机(Switch)

早期的 Switch:可以看成是更先进的网桥,是由多个网桥集成的设备,也工作在数据链路层。一个交换机口的输入到另一个交换机口的输出可以认为是一个 bridging(桥接)。交换机中的 MAC 地址表实际上就是为了网桥能工作而存在的,提供基于 MAC 地址的转发功能。一个 N 口的交换机可以看出是 N*(N-1) 个网桥的集合。
L3 Switch:就是包含了 Routing 功能的交换机

交换机的每一个端口都是一个冲突域,同时可以通过配置交换机端口组的方式来划分广播域(VLAN)。同一个 VLAN 的主机的广播包会在 VLAN 对应的端口组中进行广播,这是基于交换机的 MAC-Port 映射表进行控制的。

交换机的工作原理

在这里插入图片描述

  1. 交换机根据收到数据帧中的源 MAC 地址建立该地址与交换机端口的映射关系,并将其写入 MAC-Port 映射表中。
  2. 交换机将数据帧中的目的 MAC 地址与已建立的 MAC-Port 映射表进行比较,以决定在哪个端口进行转发。
  3. 如果数据帧中的目的 MAC 地址不在 MAC 地址表中,则向所有端口转发。这一过程称为泛洪(flood)。当收到回应后,交换机就 “学习” 到了一个新的 MAC 地址与端口的对应关系并写入到内存中的 MAC-Port 映射表。
  4. 广播帧和组播帧向所有的端口转发。

如下图:主机 A 发送的报文被送到交换机 S1 的 eth0 口,由于 eth0 与 eth1、eth2 桥接(交换机任意两个端口之间为桥接关系)在一起,故而报文被复制到 eth1 和 eth2,并且发送出去,然后被主机 B 和交换机 S2 接收到,而 S2 又会将报文转发给主机 C、D。
在这里插入图片描述

交换机在报文转发的过程中并不会篡改报文数据,只是做原样复制。然而桥接是在数据链路层实现的,所以交换机能够理解数据链路层的帧信息,所以实际桥接却非只是单纯的报文转发。交换机会关心报文的数据链路层头部中的 MAC 地址信息(包括源 MAC 地址和目的 MAC 地址),以便了解每个数据帧的 MAC 地址所代表的主机都在什么位置(对应交换机的哪个端口)。如此这般的,交换机在报文转发时只需要向特定的端口转发即可,从而避免不必要的网络交互(广播数据帧)。这就是交换机的 “地址学习” 的好处。但如果交换机遇到了一个自己未学习到的地址,就不会知道这个报文应该从哪个端口转发了,这时只好将报文转发到所有的端口(接收报文的那个端口除外),这就是所谓的二层网络泛洪(Flood)。

PS:当一台交换机收到一个数据帧时,分析数据帧头部的目的地址,并地址表中进行查找,如果有匹配项,则将数据帧从该匹配项所关联的交换机端口交换出去,如果没有匹配项,则将数据帧进行泛洪(Flood),将该数据帧在除了接收帧之外的所有端口上发出去。在数据网络中,如果交换机之间存在环路,泛洪数据帧将在环路中循环交换转发产生广播风暴,占用所有网络资源,以致整个网络没有资源传送其他有效数据帧而瘫痪。

比如主机 C 向主机 A 发送一个报文,报文来到了交换机 S1 的 eth2 网口上。假设 S1 刚刚启动,还没有学习到任何地址,则它会将报文转发给 eth0 和 eth1。同时,S1 会根据报文的源 MAC 地址,记录下 “主机 C 是通过本交换机的 eth2 端口接入的”。于是当主机 A 向 C 发送报文时,S1 只需要将报文转发到 eth2 网口即可。而当主机 D 向 C 发送报文时,假设交换机 S2 将报文转发到了 S1 的 eth2 网口(实际上 S2 也多半会因为地址学习而不这么做),则 S1 会直接将报文丢弃而不做转发(因为主机 C 就是从 eth2 接入的,意味着 D 和 C 在同一个交换机上)。

然而,网络拓扑不可能永不改变。假设我们将主机 B 和主机 C 换个位置,当主机 C 发出报文时(不管发给谁),交换机 S1 的 eth1 口收到报文,于是交换机 S1 会更新其学习到的地址,将原来的 “主机 C 是通过 eth2 网口接入的” 改为 “主机 C 是通过 eth1 网口接入的”。但是如果主机 C 一直不发送报文呢?S1 将一直认为 “主机 C 是通过 eth2 网口接入的”,于是将其他主机发送给 C 的报文都从 eth2 转发出去,结果报文就丢失了。所以交换机的地址学习需要有超时策略。对于交换机 S1 来说,如果距离最后一次收到主机 C 的报文已经过去一定时间了(默认为 5 分钟),则 S1 需要忘记 “主机 C 是通过 eth2 网口接入的” 这件事情。这样一来,发往主机 C 的报文又会被转发到所有网口上去,而其中从 eth1 转发出去的报文将被主机 C 收到。

网桥与交换机的区别

交换机同样也有一张 MAC-PORT 映射表(CAM),与网桥不一样的是:网桥的 MAC 地址表是一对多的(一个 Port 对多个 MAC 地址);而交换机的 CAM 表却是一对一的(一个 Port 对应一个 MAC 地址),如果一个端口有了新的 MAC 地址,它不会新增 MAC-Port 记录,而是修改原有的记录。对比如下列两张图:
在这里插入图片描述
VS
在这里插入图片描述
NOTE:在现代的机房中,已经很难看见网桥和集线器设备了,基本都是物理服务器与交换机直连的架构,一台物理服务器就是一个冲突域,极大的提高了网络带宽的性能。

路由器(Router)

路由器工作在网络层,提供基于 IP 地址的转发功能。用于连接不同的 IP 逻辑网段,负责在复杂的网络世界中找到数据包传输(跳转)的最优路径。路由器与交换机一样具有划分广播域的能力,连接到同一路由器上的不同网段会被分割成不同的广播域,广播域之间的数据包转发需要路由器来完成。

物理路由器一般有专业的路由器设备和 Linux 操作系统物理服务器两种,后者只适合规模较小的应用环境。当使用 Linux 来充当路由器时,需要打开 路由转发 功能。

  • 临时开启
echo "1" > /proc/sys/net/ipv4/ip_forward
  • 永久开启
# /etc/sysctl.conf
net.ipv4.ip_forward= 1

在这里插入图片描述
如上图,NS1/tap1 和 NS2/tap2 不在同一个网段,中间就需要经过一个路由器进行转发才能互通。

详情请继续浏览《Linux 的路由功能》

路由器的工作原理

路由器的基本功能包括两大部分:

  • 路由:决定分组(数据包)下一跳的位置,通过路由算法对路由表进行填充和更新。
  • 转发:一个分组(数据包)达后所采取的动作,根据路由表查找下一跳的位置,然后通过修改数据报文的源 MAC 地址和目的 MAC 地址来完成分发。

路由算法分为:

  • 静态路由算法(非自适应):静态路由算法不会根据当前测量或者估计的流量和拓扑结构来调整它们的路由决策。静态路由表在离线情况下已经计算好,在网络启动的时候被下载到路由器中。

  • 动态路由算法(自适应):动态路由算法会改变它们的决策 ,以反映出拓扑结构的变化,通常也会反映出流量的变化情况。动态路由算法又分为:

    • 距离矢量路由算法
    • 链路状态路由算法

在收到数据包时,路由器会进行如下操作:

  1. 路由器在收到一个包时,从包头部分提取出目的 IP 地址。
  2. 在自己的全局路由表中查找是否有此 IP 的路由信息。若没有,此将此包发往默认路由。若有,则将此包发送到路由表中记录的相应的下一跳处。

路由器的转发功能可用图表示为:
在这里插入图片描述
一个数据包在网络上的传递过程可用图表示为:
在这里插入图片描述

虚拟网络设备

网络命名空间(network namespace)

Linux 可以在一个 Host 内创建多个 namespace,将那些原本是 Linux 全局的资源,就变成了 namespace 范围内的 “全局” 资源,而且不同 namespace 的资源互相不可见 、 彼此透明。
在这里插入图片描述
从网络的视角来看,一个 namespace 提供了一份独立的网络协议栈(网络设备接口、IPv4、IPv6、IP 路由、防火墙规则、sockets 等)。注意一个网络设备只能位于一个 namespace 中,不同 namespace 中的网络设备可以利用 veth pair 进行桥接(根据数据链路层的 MAC 地址对网络数据包进行转发的过程)。

  • 查看 namespace 列表
ip netns list
  • 创建 namespace
ip netns add ns_test

虚拟“网卡”(tap)

Linux 在谈到 tap 时,经常会与 tun 并列谈论,两者都是操作系统内核中的虚拟网络设备,都是一种让用户态程序向内核协议栈注入数据的设备。tap 工作在二层(数据链路层)而 tun 工作在三层(网络层)。

数据链路层的主要协议有 :

  • 点对点协议(Point-to-Point Protocol)
  • 以太网(Ethernet);
  • 高级数据链路协议(High-Level Data Link Protocol);
  • 帧中继(FrameRelay);
  • 异步传输模式(AsynchronousTransfer Mode)

tap 只与其中的以太网(Ethernet)协议对应,所以,tap 有时也称为 “虚拟以太设备” 。

tap 的指令行由 tun 内核模块(tun kernel module 实现了 tap、tun)支持,检查时候加载了 tun 模块:

lsmod I grep tun

如果没有加载的话,执行加载指令:

modprobe tun

除了 tun 模块还需要安装 tunctl 指令包:

yum install tunctl
  • 查看 tap 设备
ip link list
  • 创建一个 tap 设备:
tunctl -t tap_test
  • 为 tap 设备配置 IP 地址
ip addr add local 192 .168 .100 .1/24 dev tap_test

NOTE:当为 tap 设备绑定了 IP 地址时, Linux 会自动生成相应的直连(不需要进行 Gateway 转发,GW 0.0.0.0)路由。
在这里插入图片描述

  • 将 tap 设备移入 namespace
p link set <tap_name> netns <namespace_name>

虚拟“网线”(veth pair)

veth pair 不是一个设备,而是一对设备,用于连接两个虚拟以太端口。veth pair 的本质是反转通讯数据的方向,需要发送的数据会被转换成需要收到的数据重新送入内核网络层进行处理,从而间接的完成数据的注入。操作 veth pair,需要跟 namespace 一起配合,不然就没有意义。

通过下列步骤实现上图模型:

  • 创建 veth pair
ip link add tapl type veth peer name tap2
  • 创建 namespace
ip netns add ns1
ip netns add ns2
  • 将 tap(将 veth pair 理解成类型为 veth 的 tap)的一段迁入 namespace
ip link set tapl netns ns1
ip link set tap2 netns ns2
  • 为两个 tap 设备配置 IP
ip vetns exec ns1 ip addr add local 192.168.50.1/24 dev tap1
ip netns exec ns2 ip addr add local 192.168.50.2/24 dev tap2
  • 启用 tap 设备
ip netns exec ns1 ifconfig tap1 up
ip netns exec ns2 ifconfig tap2 up
  • tap 之间互相 ping 通
ip netns exec ns2 ping 192.168.50.1
ip netns exec ns1 ping 192.168.50.2

NOTE:veth pair 在虚拟网络设备中是作为 “网线” 的存在,将 “网卡”(tap)之间,“网卡” 与虚拟交换机(Bridge)之间连接起来。

虚拟“隧道网卡”(tun)

tun 是一个网络层的点对点(Peer To Peer)设备,启用了 IP 层隧道(tunnel)功能。Linux 原生支持 5 种三层(IP)隧道:

  • ipip

  • gre:通用路由封装(Generic Routing Encapsulation),定义了在任意一种网络层协议上封装任意一个其他网络层协议的协议,属于 IPv4/IPv6 over IPv4。

  • sit

  • isatap

  • vti
    在这里插入图片描述
    下列步骤实现 tun1 和 tun2 的 ipip 隧道通信:

  • 加载 ipip 内核模块

modprobe ipip
  • 在 ns1 上创建 tun 设备并且绑定一个 ipip 隧道
# 指定 tunnel mode 为 ipip
# 指定 tunnel 的近端/远端 IP 地址,作为封装数据报文的外层源/目的 IP 地址
ip netns exec ns1 ip tunnel add tun1 mode ipip remote 192.168.200.2 local 192.168.100.2 ttl 255
ip netns exec ns1 ip link set tun1 up
# 配置点对点(Peer To Peer)隧道 IP 地址,作为数据报文的内层源/目的 IP 地址
ip netns exec ns1 ip addr add 192.168.50.10 peer 192 .168.60.10 dev tun1
  • 在 ns2 上创建 tun 设备并且绑定一个 ipip 隧道
# 指定 tunnel mode 为 ipip
# 指定 tunnel 的近端/远端 IP 地址,作为封装数据报文的外层源/目的 IP 地址
ip netns exec ns2 ip tunnel add tun2 mode ipip remote 192.168.100.2 local 192.168.200.2 ttl 255
ip netns exec ns2 ip link set tun2 up
# 配置点对点(Peer To Peer)隧道 IP 地址,作为数据报文的内层源/目的 IP 地址
ip netns exec ns2 ip addr add 192.168.60.10 peer 192 .168.50.10 dev tun2

NOTE:GRE 类型隧道只需要设定 tunnel mode 为 gre 即可

  • 互相 ping 通两端隧道 IP
ip netns exec ns1 ping 192.168.60.10
  • 查看 namespace 路由表,会自动创建出主机路由表项(UH)直连隧道 IP 地址
ip netns exec ns1 route -nee

物理与虚拟设备对比关系
在这里插入图片描述

TAP/TUN 与 VETH 设备的工作原理

在这里插入图片描述

如上图所示,创建一个 tap 设备时,Linux 的 dev(设备文件)目录下就会生成一个对应 char 设备。用户程序可以像打开普通文件一样打开这个 tap “文件” 进行读写(Linux 的一切皆文件设计理念)。

  • 当执行 write()操作时:数据进入 tap 设备,此时对于 Linux 网络层来说就相当于 tap 设备收到了一个数据包,并请求内核接受它,如同普通的物理网卡从外界收到数据包一样,不同的是此时的数据其实来自 Linux 上的一个用户程序。Linux 收到此数据后将根据网络配置进行后续处理,从而完成了用户程序向 Linux 内核网络层注入数据的功能。
  • 当用户程序执行 read() 请求时:相当于向内核查询 tap 设备上是否有需要被发送出去的数据,有的话取出到用户程序里,完成 tap 设备的发送数据功能。

针对 tap 设备的一个形象的比喻是:使用 tap 设备的应用程序相当于另外一台计算机,tap 设备是本机的一个网卡,他们之间相互连接。应用程序通过 read()/write() 操作来和本机网络核心进行通讯。

NOTE:tun 设备的工作原理与 tap 设备大同小异。

veth pair 设备总是成对出现的,送到一端的数据总是从另一端以请求接受的形式出现。该设备不能被用户程序直接(读/写)操作,但使用起来比较简单。创建并配置正确后,向其一端输入数据,veth pair 会改变数据的方向并将其送入内核网络核心,完成数据的注入,然后在另一端能读到此数据。

Linux Bridge

Linux Bridge(下文简称 Bridge)是 Linux 上用来做 TCP/IP 二层协议交换的设备,一种从 Linux Kernel 虚拟出来的网桥设备。在 Linux 的语境中,Bridge(网桥)和 Switch(交换机)是同一个概念,Linux 实现 Bridge 功能的是 brctl 模块。Bridge 设备实例可以和 Linux 上其他的网络设备实例(e.g. TAP 设备,veth 虚拟网卡)连接,又称为即 Attach 一个从设备,类似于物理交换机和一台主机之间连接一根网线。当从设备接收到帧时,Bridge 会根据帧中的 MAC 地址进行广播、转发或过滤处理。

再次强调:与物理网桥不同,在 Linux 的语境中,Linux Bridge(网桥)和 Switch(交换机)是同一个概念。

yum install bridge-utils

在这里插入图片描述

如图所示,Bridge 的功能主要在 Linux kernal 里实现。

  1. 当一个从设备被 Attach 到 Bridge 上,这时在内核程序里的 netdev_rx_handler_register() 被调用,注册一个用于接受数据的回调函数。以后每当这个从设备收到数据时都会调用这个函数把数据转发到 Bridge 上。
  2. 当 Bridge 接收到转发过来的数据时,br_handle_frame() 被调用,进行一个与物理交换机类似的处理过程:判断帧的类别(广播 or 单点),查找内部 MAC-Port 映射表,定位到数据帧预期的目标端口号,将帧转发到目标端口(或丢弃),可能还会同时进行 MAC-Port 映射表自学习。

可以感受到,Linux Bridge 本质就是一个软件实现的虚拟交换机(Virtual Switch)。

Linux Bridge 的工作原理

在这里插入图片描述
上图类比「交换机的工作原理」章节。

Bridge 的数据流向:
在这里插入图片描述

Bridge 与 Linux 虚拟机/容器的典型应用场景:
在这里插入图片描述

  • 连接同宿主机内所有虚拟机/容器的虚拟网络。
  • 打通虚拟机/容器内网与外网,通过 bridge 将数据转发到真实的物理网卡 eth0 中。

Linux Bridge 与交换机的区别

Linux Bridge 与物理交换机也有区别,上图左侧画出了这种情况:数据帧有可能是直接发送到 Bridge 上的,而非像物理交换机一般是从一个端口上接收到数据帧的。这种情况可以看作 Bridge 自己有一张 “网卡(一个 MAC)” 可以向自身主动发送帧,或者说 Bridge 自带了一个 “隐藏的端口” 和宿主 Linux 系统缺省连接,Linux 上的程序可以直接从这个 “隐藏端口” 向 Bridge 发送数据。所以,当一个 Bridge 被挂载一个网络设备后(e.g. eth0),br0 就拥有两个有效的 MAC 地址,一个是 br0 自身的,一个是来自于 eth0 的,两个端口之间可以通讯。

Linux Bridge 的特性

由于 Bridge 自带缺省 MAC 的特性,带来了一个有意思的结果:可以为 Bridge 设备设置 IP 地址。通常来说 IP 地址是三层协议的内容,而 Bridge 是一个二层的网络设备,IP 是不应该出现在 Bridge 上的。但实际上,由于 Bridge 是一种 Linux 系统的通用网络设备的抽象,只要是网络设备就能够设定 IP 地址。Bridge 的 IP 地址就类似于物理交换机的管理 IP 地址(为了方便应用 SSH、SNMP 等协议应用)。当 br0 拥有 IP 后,Linux 就可以通过路由表在网络层定位到 br0。此时就相当于 Linux 拥有了一张 “隐藏的网卡” 和 Bridge 的 “隐藏端口” 相连,两种组成了一张 “Linux 网卡” 就是名为 br0 的通用网络设备。当 IP 数据包到达 br0 时,内核协议栈就认为收到了一个数据包,此时应用程序可以通过 Socket 接收到它。

Bridge 的实现当前存在一个限制:当一个从设备被 Attach 到 Bridge 上时,那个从设备的 IP 会变的无效,Linux 不再使用从设备的 IP 在三层接受数据。比如:eth0 的 IP 地址为 192.168.1.2,此时如果网卡设备 eth0 收到到了一个目标 IP 地址是 192.168.1.2 的数据包,Linux 的应用程序能通过 Socket 接受到它;而当 eth0 被 Attach 到 br0 后,实际上 eth0 的 IP 就变得无效了,此时应该把 IP 地址 192.168.1.2 赋予 br0,让 br0 作为 “网卡设备” 来代替 eth0 继续接收三层数据包。

NOTE 1:对于一个被 Attach 到 Bridge 上的从设备来说,只有在收到数据报文时,此数据报文才会被转发到 Bridge 进而完成查表广播等后续操作。但是当从设备的请求是发送类型时,数据报文是不会被经过 Bridge 上的,它会寻找下一个发送出口。用户在配置网络时经常会忽略这一点从而造成网络故障。

简单来说,Linux Bridge 就是一个虚拟交换机,多个网络设备(e.g. eth0、tap0、vent0,不管是物理的还是虚拟的都统称为通用网络设备)可以挂载到 Bridge 的多个端口上,当 Bridge 收到数据帧时,就会根据帧的源 MAC 地址和目的 MAC 地址进行帧的广播、转发和过滤操作

应用示例

通过 veth pair 连接两个 namespace。 但是,3 个 namespace 之间的互通呢?或者多个 namespace 之间的互通呢?veth pair 只有一对 tap,无法胜任,这就需要用到 Bridge/Switch 了。
在这里插入图片描述

下列步骤实现上图模型:

  • 创建 veth pair
ip link add tap1 type veth peer name tap1_peer
ip link add tap2 type veth peer name tap2_peer
ip link add tap3 type veth peer name tap3_peer
ip link add tap4 type veth peer name tap4_peer
  • 创建 namesapce
ip netns add ns1
ip netns add ns2
ip netns add ns3
ip netns add ns4
  • 把 tap 设备迁移到相应 namespace 中
ip link set tap1 netns ns1
ip link set tap2 netns ns2
ip link set tap3 netns ns3
工p link set tap4 netns ns4
  • 创建 Bridge
brctl addbr br1
  • 把相应 tap 添加到 Bridge 中
brctl addif br1 tap1_peer
brctl addif br1 tap2_peer
brctl addif br1 tap3_peer
brctl addif br1 tap4_peer
  • 配置 tap 设备的 IP 地址
ip netns exec ns1 ip addr add local 192.168.50.1/24 dev tap1
ip netns exec ns2 ip addr add local 192.168.50.2/24 dev tap1
ip netns exec ns3 ip addr add local 192.168.50.3/24 dev tap1
ip netns exec ns4 ip addr add local 192.168.50.4/24 dev tap1
  • 将 Bridge 及所有 tap 状态设置为 up
ip link set br1 up
ip link set tap1_peer up
ip link set tap2_peer up
ip link set tap3_peer up
ip link set tap4_peer up
ip netns exec ns1 ip link set tap1 up
ip netns exec ns2 ip link set tap2 up
ip netns exec ns3 ip link set tap3 up
ip netns exec ns4 ip link set tap4 up
  • 在任意 namespace 中互相 ping 通

Linux VLAN device

VLAN 的种类很多,按照协议原理一般分为:MACVLAN、802.1.q VLAN、802.1.qbg VLAN、802.1.qbh VLAN。其中出现较早,应用广泛并且比较成熟的是 802.1.q VLAN。

802.1.q VLAN 的基本原理是在二层协议里插入额外的 VLAN 协议数据(称为 802.1.q VLAN Tag),同时保持和传统二层设备的兼容性。Linux 里的 VLAN 设备是对 802.1.q 协议的一种内部软件实现,模拟现实世界中的 802.1.q 交换机。

在这里插入图片描述

如上图所示,Linux 里的 802.1.q VLAN 设备是以 “母子关系” 成对出现的,母设备相当于现实世界中的交换机 TRUNK 口,用于连接上级网络,子设备相当于普通 ACCESS 口用于连接下级网络。当数据在母子设备间传递时,内核将会根据 802.1.q VLAN Tag 进行对应的操作。母子设备之间是一对多的关系,一个母设备可以有多个子设备,一个子设备只有一个母设备。

当一个子设备有数据包需要发送时,数据报文将被打上 VLAN Tag 然后从母设备发送出去。当母设备收到数据包时,它会分析其中的 VLAN Tag,如果有对应的子设备存在,则把数据报文转发到那个子设备上并根据设置移除 VLAN Tag,否则丢弃该数据。在某些设置下,VLAN Tag 可以不被移除以满足某些监听程序的需要,如 DHCP 服务程序。

举例说明如下:eth0 作为母设备创建一个 ID 为 100 的子设备(子网卡) eth0.100。此时如果有程序要求从 eth0.100 发送数据包,数据报文将被打上 VLAN 100 的 Tag 从 eth0 发送出去。如果 eth0 收到一个数据包,VLAN Tag 是 100,数据将被转发到 eth0.100 上,并根据设置决定是否移除 VLAN Tag。如果 eth0 收到一个包含 VLAN Tag 101 的数据,则将其丢弃。

上述过程隐含以下事实:对于宿主 Linux 操作系统来说,母设备只能用来收数据,子设备只能用来发送数据。和 Bridge 一样,母子设备的数据也是有方向的,子设备收到的数据不会进入母设备,同样母设备上请求发送的数据不会被转到子设备上。可以把 VLAN 母子设备作为一个整体想象为现实世界中的 802.1.q 交换机,下级接口通过子设备连接到宿主 Linux 系统网络里,上级接口同过主设备连接到上级网络,当母设备是物理网卡时上级网络是外界真实网络,当母设备是另外一个 Linux 虚拟网络设备时上级网络仍然是宿主 Linux 系统网络。

需要注意的是母子 VLAN 设备拥有相同的 MAC 地址,可以把它当成现实世界中 802.1.q 交换机的 MAC,因此多个 VLAN 设备会共享一个 MAC。当一个母设备拥有多个 VLAN 子设备时,子设备之间是隔离的,不存在 Bridge 那样的交换转发关系,原因如下:802.1.q VLAN 协议的主要目的是从逻辑上隔离子网。现实世界中的 802.1.q 交换机存在多个 VLAN,每个 VLAN 拥有多个端口,同一 VLAN 端口之间可以交换转发,不同 VLAN 端口之间隔离。所以交换机包含了两层功能:交换与隔离

Linux VLAN device 实现的是隔离功能,没有交换功能。一个 VLAN 母设备不可能拥有两个相同 ID 的 VLAN 子设备,因此也就不可能出现数据交换情况。如果想让一个 VLAN 里接多个设备,就需要交换功能。在 Linux 里 Bridge 专门实现交换功能,因此将 VLAN 子设备 attach 到一个 Bridge 上就能完成后续的交换功能。总结起来,Bridge 加 VLAN device 能在功能层面完整模拟现实世界里的 802.1.q 交换机。

NOTE:Linux 支持 VLAN 硬件加速,在安装有特定硬件情况下,图中所述内核处理过程可以被放到物理设备上完成。

虚拟交换机(vSwitch)

虚拟交换机 = Linux Bridge + VLAN

物理交换机存在多个 VLAN,每个 VLAN 拥有多个端口。 同一 VLAN 端口之间可以交换转发,不同 VLAN 端口之间相互隔离。所以交换机包含了两层含义:交换与隔离。而 Linux 的 VLAN 设备(e.g. eth0:10)实现的是隔离功能,但不具备交换功能。一个 VLAN 母设备(e.g. eth0)不能拥有两个相同 ID 的 VLAN 子设备,因此也就不可能出现数据交换情况。因此,数据交换功能由 Linux Bridge 来补充。将同一 VLAN 的子设备都挂载到一个 Bridge 上,设备之间就可以交换数据了。

Linux Bridge 加 VLAN 在功能层面完整模拟物理二层交换机,eth0 相当于虚拟交换机上的 Trunk 口,允许 VLAN10 和 VLAN20 的数据通过,用于连接不同的虚拟交换机。eth0.10,vent0 和 brvlan10 都相当于 VLAN10 的 Access 口。eth0.20,vent1 和 brvlan20 都可以看着 VLAN20 的 Access 口,标识着 VLAN ID。

虚拟路由器(vRouter)

网络类型

局域网(LAN)

LAN(Local Area Network,本地局域网),使用 Hub(集线器)或 Switch(交换机)等设备连接起来的计算机处于一个 LAN。一个 LAN 表示一个广播域,LAN 中所有成员都会收到任意一个成员发出的广播包。

虚拟局域网(VLAN)

VLAN(Virtual Local Area Network,虚拟局域网)。当交换机接入较多的终端时,任意一台终端发送广播包都会传遍整个 LAN。对于规模较大的组网场景,广播包泛滥(广播风暴)会网络的通信健康造成很大的影响(e.g. 网络延迟)。VLAN 为这一问题提供了解决方案,它将一个网络划分为多个逻辑上的虚拟网络,并规定广播包仅在 VLAN 中进行传递。VLAN 在数据链路层中实现了广播域隔离(二层隔离)。

NOTE:VLAN 的隔离是二层上的隔离,VLAN 之间无法相互访问指的是二层广播包无法跨越 VLAN 的边界。

现在的交换机几乎都是支持 VLAN 的,甚至可以支持路由功能(三层交换机)。一般的,交换机的端口具有两种配置模式(交换机具有两种类型的端口):

  • Access 口:这类端口都具有一个唯一的 VLAN ID 和 Tag 来作为标识,VLAN ID 的取值范围是 [1, 4096]。Access 口都是直接与网络适配器相连的,从该网络适配器出来的数据包在通过 Access 口后会被打上特定的 VLAN Tag,以此来区分该数据包只能在具有相同 VLAN Tag 的 VLAN 传递。Access 口只属于一个 VLAN。

  • Trunk 口:假设有 SwitchA 和 SwitchB 两个交换机。SwitchA 上有 VLAN1(红)、VLAN2(黄)、VLAN3(蓝);SwitchB 上也有 VLAN1、2、3。那如何让 AB 上相同 VLAN 之间能够通信呢?办法就是将 AB 连接起来,并且连接 AB 的端口要允许 VLAN1、2、3,三个不同 VLAN 的数据通过。这样的端口就是 Trunk 口了(同时允许多个不同 VLAN 的数据包通过的交换机端口)。VLAN1、2、3 的数据包通过 Trunk 口后,自己的 VLAN Tag 始终不变。

一言以蔽之,Access 口用来标识每个端口的 VLAN ID,而 Trunk 口用来保证不同 VLAN 的数据包可以在交换机之间传递。显然,如果想跨交换机建立 VLAN,就需要同时应用两种类型的端口了。

在这里插入图片描述

Linux 上的VLAN
在这里插入图片描述

Linux Host 可以通过软件实现 vSwitch。如上图,eth0 是 Host 的物理网卡,创建了一个 eth0.10 子设备与之相连。eth0.10 就是一个 VLAN 设备,ID 为 10。eth0.10 和 vent0 均挂在 Linux-Bridge brvlan10 上。就相当于 eth0.10、brvlan10 和 vnet0 都接入到了 VLAN10 的 Access 口上,VM1 通过 vnet0 发出来的数据包被打上了 VLAN10 的 Tag。而 eth0 就相当于一个 Trunk 口,用于连接不同的 VLAN。其中:

  • eth0.10 的作用是:定义了 VLAN10。
  • brvlan10 的作用是:Bridge 上的其他网络设备会自动加入到 VLAN10 中。

下面再以一个例子说明 VLAN 的隔离性
在这里插入图片描述

上图,Host 上的虚拟交换机有两个 VLAN,VM1 和 VM2 分别属于 VLAN10 和 VLAN20。对于新创建的 VM,只需要将其虚拟网卡放入相应的 Bridge,就加入到相应的 VLAN 了。

假如说 VM2 向 VM1 发 Ping 包,需要获取 VM1 的 MAC 地址。所以 VM2 会在 VLAN20 上广播 ARP 请求包。ARP 是二层网络协议,由于 VLAN 的隔离,使得 ARP 请求包只能在 VLAN20 范围内广播。也就是说只有 brvlan20 和 eth0.20 能收到,VLAN10 里的设备是收不到的。VM2 拿不到 VM1 vnet0 的 MAC 地址,也就 Ping 不通 VM1。

但如果说,Host1 和 Host2 均可以通过物理网卡 eth0 进行通信,那么 eth0 就发挥着 Trunk 口的作用,两主机之间具有相同 VLAN ID 的虚拟机可以通过 eth0 实现互相通信。

NOTE:Linux 的 VLAN 设备总是以母子关系出现,母子设备之间是一对多的关系。一个母设备(e.g. eth0)可以有多个子设备(e.g. eth0.10,eth0.20),而一个子设备只有一个母设备。

覆盖网络(Overlay)

所谓 Overlay 覆盖,意思是「覆盖于传统三层网络(物理层、数据链路层、网络层)之上的自定义网络」。是指建立在其他网络之上的网络。P2P 和隧道(tunnel)就是典型的 Overlay,VxLAN 和 GRE 都是基于隧道技术实现的,所以它们也都是 Overlay。

隧道技术(Tunneling)

使用隧道传递的数据可以是不同协议的数据帧或数据报文,隧道协议将其它协议的数据帧或数据报文重新封装后再发送。新的封装头部提供了路由信息,以便通过互联网传递被封装的真实负载数据。

隧道这种方式能够使来自多种信息源的网络业务在同一个基础设施中通过不同的隧道进行点到点传输。隧道技术使用点对点通信协议(传输层)代替了交换连接,通过路由网络(网络层)来连接数据地址。

隧道的建立,可实现:

  • 将数据流强制送到特定的地址
  • 隐藏私有的网络地址
  • 在 IP 网上传递非 IP 数据包
  • 提供数据安全支持

例如:隧道技术允许授权移动用户或已授权的用户在任何时间、任何地点访问企业网络。

常见的隧道技术有:

  • VxLAN
  • GRE
  • IPSec

虚拟可扩展局域网(VxLAN)

随着云计算技术的兴起以及虚拟化技术的普及,VLAN 技术的弊端逐渐显现出来,表现为以下 3 个方面:

  • 在大规模云计算的多租户模式下,802.1Q 标准定义的最多支持 4094 个 VLAN 的能力已经无法满足需求。
  • 在大规模云计算的多租户模式下,不同租户的网络很有可能会出现 IP/MAC 地址的重叠。VLAN 仅仅解决了数据链路层的广播域隔离的问题,并没有涉及到 IP/MAC 地址重叠的问题。因此需求一种新的技术来保证在多租户网络中存在地址重叠的情况下,依旧能够有效通信的技术。
  • 虚拟化技术的成熟令传统交换机受到了挑战,因为虚拟机技术让 Host 可以同时运行多台 VM,为了保证集群中所有虚机可以正常通信,交换机必须保存每台虚机的 MAC 地址,这样就导致了交换机中的 MAC 地址表异常庞大,从而影响交换机的转发性能。

VxLAN(Virtual eXtensible LAN,虚拟可扩展局域网)是一种基于隧道技术的 Overlay 网络虚拟化技术。所谓 Overlay,即基于物理网络拓扑之上,构建出虚拟的、不同于物理网络拓扑的逻辑网络。所以 Overlay(覆盖),即对于 Overlay 的逻辑网络而言,物理网络的拓扑是透明的。VXLAN 就是在三层网络之上构建的二层虚拟网络,通过 VXLAN 技术可以将处于不同网段的网络设备整合到一个逻辑上的数据链路层网络中。对于网络的终端用户而言,这些网络设备似乎 “真实地”部署在了同一个(物理)数据链路层网络中。

与 VLAN 相比,VxLAN 有下面几个优势:

  1. 支持更多的二层网段:VxLAN 的 ID (VNI 或 VNID)使用 24-bit 标记,支持 16777216 个二层网段。
  2. 能更好地利用已有的网络路径:VLAN 使用 Spanning Tree Protocol 避免环路,这会导致有一半的网络路径被 Block 掉。VxLAN 的数据包是封装到 UDP 通过三层传输和转发的,可以使用所有的路径。
  3. 避免物理交换机 MAC 表耗尽:采用隧道机制,所以 TOR(Top on Rack)交换机无需在 MAC 表中记录虚拟机的信息。

VxLAN 的本质就是一种隧道技术,通过将虚拟网络中的二层数据帧封装在实际物理网络中的三层数据报文中进行传输。

  1. 将虚拟网络的数据帧添加上 VXLAN 首部,得到 VXLAN 数据帧
  2. 将 VXLAN 数据帧封装在物理网络的 UDP 数据报文中
  3. 以传统网络的通信方式传送 UDP 数据报文
  4. 解封装 UDP Header,数据报文到达目的主机
  5. 解封装 VXLAN Header,虚拟网络的数据帧进行目的虚拟机

VxLAN 的实现原理和网络包格式

在这里插入图片描述
VxLAN 的传输协议是 IP+UDP,它定义了一个 MAC-in-UDP 的封装格式。在原始的 Layer 2 数据帧前加上 VxLAN Header,然后再放到 UDP 数据报和 IP 数据包中。通过 MAC-in-UDP 封装,VxLAN 能够在 Layer 3 网络上建立起了一条 Layer 2 的隧道。VxLAN 引入了 8-byte VXLAN Header,其中 VNI(VXLAN Network Identifier)占 24-bit。VxLAN Header 和原始的 L2 Frame 被封装到 UDP 数据报中。这 24-bit 的 VNI 用于标示不同的二层网段,能够支持 16777216 个 LAN。

  1. 在最原始的数据帧(由计算机发出的真实数据)外加上 VxLAN Header,里面主要就是 VNI ID。
  2. 在 VxLAN Header 外加上 UDP Header,里面的目标端口和源端口都是 VTEP 的端口。
  3. 在 UDP Header 外面加上外层 IP Header,里面的目的 IP 地址和源 IP 地址都是 VTEP 的 IP 地址。
  4. 在 IP Header 外面加上外层 MAC Header,里面的目的 MAC 地址和源 MAC 地址视乎具体的网络拓扑。如果两个 VTEP 处于同一网段,MAC 直达(目的 MAC 地址和 源 MAC 地址都是 VTEP 的 MAC 地址);如果不是,就需要通过 Gateway 转发,所以目的 MAC 地址应该是 Gateway 的 MAC 地址。

VxLAN Tunnel Endpoint

在这里插入图片描述
VxLAN 使用 VTEP(VxLAN tunnel endpoint,隧道端点)设备来处理 VxLAN 的封装和解封装。每个 VTEP 有一个 IP interface 并配置上一个 IP 地址。VTEP 使用该 IP 作为目的 IP 或源 IP 来封装 Layer 2 frame,并通过该 IP interface 传输和接收封装后的 VxLAN 数据包。

VxLAN 包转发流程

在这里插入图片描述
NOTE:VxLAN 环境需要支持多播(IPv6)和组播(IPv4),因为 VxLAN 需要这两个协议来发现目标 MAC 地址,所以首先两个 VTEP 启动的时候需要加入到同一个组播组,通过 IGMP 协议。

上图 Host-A 和 Host-B 位于 VNI 10 的 VxLAN Network,通过 VTEP-1 和 VTEP-2 之间建立的 VxLAN 隧道通信。数据传输过程如下:

  1. Host-A 向 Host-B 发送数据时,Host-B 的 MAC/IP 作为数据报文的目标 MAC/IP,Host-A 的 MAC/IP 作为数据报文的源 MAC/IP,然后通过 VTEP-1 将数据发送出去。
  2. VTEP-1 从自己维护的 MAC/IP 映射表中找到 MAC-B 对应的 VTEP-2,然后执行 VxLAN 封装,依次加上 VxLAN Header、UDP Header、IP Header(外层 IP)、Frame Header(外层 MAC)。此时 IP Header 的目标地址为 VTEP-2 的 IP,源地址为 VTEP-1 的 IP。同时由于下一跳是 Router-1,所以 Frame Header 的目标地址为 Router-1 的 MAC。
  3. 数据报文从 VTEP-1 发送出后,外部网络的路由器会依据 IP Header 进行路由,依据修改 Frame Header 的 MAC 地址进行传输,最后到达与 VTEP-2 连接的路由器 Router-2。
  4. Router-2 将数据报文发送给 VTEP-2。VTEP-2 负责解封数据包,依次解析 Frame Header、IP Header、UDP Header 和 VxLAN 头,最终得到被封装到最里层的 “数据” —— 以 Host-A 的 MAC/IP 作为源 MAC/IP 以 Host-B 的 MAC/IP 作为目标 MAC/IP 的内存数据报文。VTEP-2 最后再依据内层数据报文的目标 MAC 地址将数据报文发送给 Host-B。

整个过程中,VTEP-1 和 VTEP-2 都学习到了一条知识(记录),Host-A 的 MAC 归 VTEP-1 管,Host-B 的 MAC 归 VTEP-2 管,以后两个 Host 通信的时候,不需要再通过组播来询问某个 Host 归谁管了,直接发送即可。
在这里插入图片描述

软件实现的 VTEP

VTEP 可以由专有硬件来实现,也可以通过纯软件实现。目前比较成熟的 VTEP 软件实现有:

  • 加载了 VxLAN 内核模块的 Linux 操作系统
  • OpenvSwitch

Linux 上的 VTEP

在这里插入图片描述

工作流程:

  1. Linux VxLAN 创建一个 UDP Socket,默认监听 8472 端口。
  2. Linux VxLAN 在 UDP Socket 上接收到 VxLAN 包后,解包,然后根据其中的 VxLAN ID 将它转给某个 VxLAN Interface,然后再通过它所连接的 Linux Bridge 转给虚机。
  3. Linux VxLAN 在收到虚机发来的数据包后,将其封装为多播 UDP 包,从网卡发出。

通用路由封装(GRE)

GRE(Generic Routing Encapsulation,通用路由封装)是一种隧道协议,与 VxLAN 类型,通过将其他协议封装在一个点对点的连接中,实现跨公网的网络互联。
在这里插入图片描述
在这里插入图片描述
如上图,一个 GRE 端点(e.g. Router1)可能存在多个隧道,因而需要有一个标志位来唯一标识当前网络包属于哪个隧道,这就是 GRE Header 中的 key,简称 gre key。
在这里插入图片描述

安全隧道(IPSec)

IPSec,安全隧道,意味着需要具有以下三个特点:

  • 信息完整性(认证)
  • 信息的私密性(加密)
  • 信息不会被 Replay
    在这里插入图片描述
    IPSec 有一套协议来保证上述三点特性。
    在这里插入图片描述
    IPSec 隧道的连接同样具有两端的概念,两端之间通过对称加密来保证私密性。所以两端都要建立 Security Association,保存两边约定好的加密协议,对称秘钥,对方的 IP 地址等等信息,对称秘钥要通过协议互换(Exchange)。两端建立连接之后,就需要对原始的网络包进行认证和加密。通过在原始网络包外层添加 ESP Header 来实现加密。
    在这里插入图片描述
    IPSec 隧道常被作为 VPN,用于打通两个 VPC,或者用于打通公有云和私有云。
    在这里插入图片描述
    在这里插入图片描述

NOTE:GRE 可以和 IPSec 一起使用,网络包的结构如下。

在这里插入图片描述

虚拟私有云/网络(VPC)

VPC(Virtual Private Cloud,虚拟私有云)是一个容易让人误解的称谓,是云?是网?让人迷惑。其实从服务和技术的角度分别来看 VPC 即是一种云,也是一种网络模式。

VPC 最早由 AWS 在 2009 年提出,不过 VPC 的一些组成元素(网络、存储、计算)在其提出之前就已经存在。VPC 只是将这些元素以私有云的视角重新包装了一下,单一用户的云主机只能使用 VPC 内部的元素。所以 VPC 的本质是公有云服务商以打包的形式提供服务。

用户可以在公有云上创建一个或者多个 VPC,每个部门一个 VPC,对于需要连通的部门创建 VPC 连接。同时,用户也可以通过 VPN 将自己内部的数据中心与公有云上的 VPC 连接,构成混合云。不论哪种用例,VPC 都以更加直观形象让用户来设计如何在公有云上存放自己的数据。
在这里插入图片描述
从服务的角度来看:云计算可分为公有云、私有云、和混合云,但 VPC 这三者都不是。VPC 是一种运行在公有云上,将一部分公有云资源为某个用户隔离出来,给这个用户私有使用的资源的集合。它由公有云管理,但是保证每个用户之间的资源是隔离,用户在使用的时候不受到其他用户的影响,用户可以要求享受管理面、数据面、故障面的三重隔离,感觉就像是在使用自己的私有云(孤岛)一样。

VPC 有两种硬件租用模式,共享(shared)和专属(dedicated)。前者指 VPC 中的虚拟机运行在共享的硬件资源上;后者是指 VPC 中的虚拟机运行在专属的硬件资源上,不同 VPC 中的虚拟机在物理上是隔离的,同时 VPC 还帮助实现了网络上的隔离。专属模式相当于用户直接向公有云服务商租用物理主机,适合对数据安全比较敏感的用户。

NOTE:专属 VPC 与私有云的多租户隔离有本质的区别,多租户隔离是为了 “共享” 底层基础架构的物理资源,只能做到管理面和数据面的隔离,做不到故障面的隔离(因为物力资源是共享的)。

从技术的角度来看:VPC 是用户专属的一个二层网络,是一个构建在 L3 之上的 L2 Overlay 网络。VPC 的数据封装与 VxLAN 之类的 Overlay 网络技术很类似,原始的二层帧,被 VPC 标签封装,之后再封装到另一个 IP 数据包内。

NOTE:VPC 虽然指的是专有二层网络,但是跟网络配套的资源有很多,这些网络资源都是以 VPC 作为单位划分。定义在一个 VPC 内的网络资源,只能被这个 VPC 内的虚机使用。这些网络资源包括:Security Group, Subnet, Network ACL, Routing Table, Router。
在这里插入图片描述

AWS 的 VPC 依靠一个叫 Mapping Service 的组件工作。当虚机之间要通信的时候,请求先发到 Mapping Service,再由它找到目的虚机对应的信息(e.g. 目的虚机所在的主机 IP 地址),Mapping Service 用对应的信息,封装成 Overlay 网络包,再进行传输。
在这里插入图片描述

这里的 Mapping Service,与 SDN Controller 的作用可以说是一样的。SDN Controller 掌握了所有的网络信息,当需要进行二层,三层通信时,SDN COntroller 会根据网络数据包下发 OpenFlow 流表,使得虚机之间直接通信。Mapping Service 还是一个分布式的 SDN 控制器,因为每个主机上都有一个 Mapping Service 的缓存。通过这种分布式,可以实现高速运算处理。

AWS 还提供了一个 Edge(边缘)设备(Blackfoot Edge Device),它使得 VPC 变得异常强大,是公有云厂商的真正竞争力的所在。通过这个 Edge,VPC 可以做到:

  • 与别的 VPC 相连
  • 与互联网相连
  • 与用户私有云的 VPN 相连
  • 与 AWS 的其他服务相连

在这里插入图片描述

有了这样的 Edge 设备,VPC 不再是孤岛,而是有了连接其他陆地的桥梁,打通了公有云、私有云、混合云网络。这里的 Edge 设备,可以看成是 VNF,AWS 需要用户在 VPC 内部手动配置路由来引流到这个 Edge 设备。

大二层网络

首先我们思考为什么会出现 “大二层网络” 这个概念,它解决了什么问题?答案就是 —— 解决虚拟化(云)时代的虚拟机大范围迁移域需求。

传统数据中心的三层(核心层、汇聚层、接入层)架构设计是为了应付 C/S 应用程序的纵贯式大流量访问,采用了 STP(SpanningTreeProtocol,生成树协议)来优化客户端到服务器的访问路径并支持连接冗余高可用。在这样的三层网络架构中,通常会将二层网络的范围限制在网络接入层以下,避免出现大范围的二层广播域。这就导致了服务器不能随便在不同二层域之间移动,一旦服务器迁移到其他二层域,就需要变更 IP 地址,伴随着生产业务中断。在具有网络关联性的服务器集群中甚至会牵一发而动全身,相关的服务器也要跟着变更相应的配置,影响巨大。
在这里插入图片描述
由于这般限制,传统数据中心的三层网络架构设计根本无法满足虚拟化(云)中更灵活的、可自定义的虚拟机迁移策略。虚拟化(云)从根本上改变了数据中心网络架构的需求,需求数据中心、甚至是跨数据中的网络可以支持大范围的二层域,二层网络规模有多大,虚拟机才能调度、迁移有多远。就是所谓的「大二层」网络。

那么为什么传统数中心的二层域大不起来呢?为什么会刻意避免出现大范围的二层广播域呢?这是由于在传统数据中心中,网管构建网络时,为了保证可靠性,通常会采用冗余设备和冗余链路,这样就不可避免的形成了二层环路。二层网络的广播报文会在环路中会反复持续传送,从而形成广播风暴,瞬间即可导致端口阻塞和设备瘫痪。因此,为了防止广播风暴,就必须防止形成环路。既要防止形成环路,又要保证可靠性,那么就只能将冗余设备和冗余链路变成备份设备和备份链路。即冗余的设备端口和链路在正常情况下被阻塞掉,不参与数据报文的转发。只有当前转发的设备、端口、链路出现故障,导致网络不通的时候,冗余的设备端口和链路才会被打开,使得网络能够恢复正常。实现这些自动控制功能的就是 STP 协议了。

不幸的是,由于 STP 的收敛性能等原因,一般情况下 STP 的网络规模不会超过 100 台交换机。同时由于 STP 需要阻塞掉冗余设备和链路,也降低了网络资源的带宽利用率。因此在实际网络规划时,从转发性能、利用率、可靠性等方面考虑,会尽可能控制 STP 网络范围,也就是会尽可能的控制二层域的范围。传统的基于 STP 备份设备和链路方案已经不能满足数据中心规模、带宽的需求,并且 STP 协议几秒至几分钟的故障收敛时间,也不能满足数据中心的可靠性要求。因此,需要能够有新的技术,在满足二层网络规模的同时,也能够充分利用冗余设备和链路,提升链路利用率,而且数据中心的故障收敛时间能够降低到亚秒甚至毫秒级。这个新的技术就是 SDN(软件定义网络)。

  • 虚拟交换机技术:既然二层网络的核心是环路问题,而环路问题是随着冗余设备和链路产生的,那么如果将相互冗余的两台或多台设备、两条或多条链路合并成一台设备和一条链路,就可以回到之前的单设备、单链路情况,环路自然也就不存在了。尤其是交换机技术的发展,虚拟交换机从低端盒式设备到高端框式设备都已经广泛应用,具备了相当的成熟度和稳定度。因此,虚拟交换机技术成为目前应用最广的大二层解决方案。

  • 隧道技术:二层网络不能有环路,冗余链路必须要阻塞掉,但三层网络显然不存在这个问题,而且还可以做ECMP(等价链路),通过在二层报文前插入额外的帧头,并且采用路由计算的方式控制整网数据的转发,不仅可以在冗余链路下防止广播风暴,而且可以做 ECMP。这样可以将二层网络的规模扩展到整张网络,而不会受核心交换机数量的限制。

随着多中心 Datacenter 的部署,虚拟机的跨数据中心迁移、灾备,跨数据中心业务负载分担等需求,使得二层网络的扩展不仅是以单一数据中心为边界,还需要考虑跨越数据中心机房的区域,延伸到同城备份中心、远程灾备中心。多数据中心之间是通过路由连通的,天然是一个三层网络。而要实现通过三层网络连接的两个二层网络互通,就必须依赖 “L2overL3” 技术。例如传统的 VPLS(MPLSL2VPN)技术,以及新兴的 Cisco OTV、H3C EVI 技术等物理方案。另外,还有虚拟化软件方案。例如 VMware 的 VxLAN、微软的 NVGRE,在虚拟化层的 vSwitch 中将二层数据封装在 UDP、GRE 报文中。都是借助隧道的方式,将二层数据报文封装在三层报文中,跨越中间的三层网络,实现两地二层数据的互通。这种隧道就像一个虚拟的桥,将多个数据中心的二层网络贯穿在一起。但由于虚拟化实现是在物理网络拓扑上构建一层虚拟化网络层,在性能、扩展性上不及物理方案。

TCP/IP 协议族

TCP/IP 网络模型

网络包类型:帧、包、段、报文

  • 应用层 — 消息/报文(Message):应用层的信息分组称为数据报文,报文包含了将要发送的完整的数据信息,其长短不需一致。报文在传输过程中会不断地封装成段、包、帧来进行传输,封装的方式就是添加一些控制信息组成的首部,那些就是报文头。

  • 传输层 — 报文段(TCP,Segment)/数据报(UDP,Datagram)

    • 报文段:指起始点和目的地都是传输层的信息单元。
    • 数据段:面向无连接的数据传输,其工作过程类似于报文交换。采用数据段方式传输时,被传输的分组称为数据段。通常指起始点和目的地都使用无连接网络服务的的网络层的信息单元。
  • 网络层 — 数据包(Packet)/分组:分组/包是在网络中传输的二进制格式的单元,为了提供通信性能和可靠性,每个用户发送的数据报文会被分成多个更小的部分。在每个部分的前面加上一些必要的控制信息组成的首部,有时也会加上尾部,就构成了一个分组/包。它的起始和目的地是网络层。

  • 链路层 — 帧(Frame):帧是数据链路层的传输单元。它将上层传入的数据添加一个头部和尾部,组成了帧。它的起始点和目的点都是数据链路层。

  • 物理层 — P-PDU(Bit):以 01 电信号(比特数据位)的形式在物理介质中传输。

参考文档

http://blog.51cto.com/hostman/2106155
https://www.cnblogs.com/sunada2005/articles/2653058.html
https://blog.csdn.net/sld880311/article/details/77840343
https://www.ibm.com/developerworks/cn/linux/1310_xiawc_networkdevice/
https://cloud.tencent.com/developer/article/1076817

转载于:https://www.cnblogs.com/jmilkfan-fanguiju/p/10589744.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_34152820/article/details/93577079

智能推荐

ZZULIOJ-1059,最高分(Java)_java输出最高分学院姓名-程序员宅基地

文章浏览阅读8.3k次。题目描述:输入一批学生的成绩(整数),输出最高分。 输入:输入包含多个非负整数和一个负整数。该负数不作为有效成绩,只表示输入结束。 输出:输出一个整数,即最高分。单独占一行。 样例输入:7 6 5 9 2 -1样例输出:9程序代码:import java.util.*;public class Main{ ..._java输出最高分学院姓名

SpringBoot集成Mybatis实现多表查询(XML版)_mybatis concat(#{sysregion.code,jdbctype=varchar},-程序员宅基地

文章浏览阅读3.2k次。1,EnginCheckOrder(头表实体)public class EnginCheckOrder implements Serializable { private String id; private String checkOrderCode; private String contractCode; private String jobCod..._mybatis concat(#{sysregion.code,jdbctype=varchar},'___')

解决(TeXstudio)Could not start the command: pdflatex.exe -synctex=1 -interaction=nonstopmode的问题_latex.exe 文件夹-程序员宅基地

文章浏览阅读1.2w次,点赞12次,收藏21次。最近用到了Latex,顺便下载了texstudio之前有用到过但是是一次安装完成的没碰过任何问题,这次系统重装之后是先安装的texstudio然后安装的texlive不知是不是先后顺序导致了这个问题,话不多说直接上解决方案。这是一个网上的图片,其实处理方案很简单,它报错的是找不到pdflatex.exe,这个应用程序我们只需找到相应的PdfLaTeX这一行,点击后面的像打印机一样的东西(这个是..._latex.exe 文件夹

单例模式之应用场景_单例模式应用场景实例-程序员宅基地

文章浏览阅读203次。1.用作全局变量,可以作为一个Cache;例如:要获取一个URL服务器请求host,可以通过HttpRequestServerlet**.java获得host,并将其保存在单例实例中,可以供项目直接调用。2.一个简单的单例Test类,测试如下:public class Test { private String str = "abc"; private Test()..._单例模式应用场景实例

ExtAspNet应用技巧(十七) - 新增菜单_ext:pagemanager-程序员宅基地

文章浏览阅读573次。界面截图 点击“新增菜单”,在父页面弹出对话框,选择父菜单为“==根节点==”,这里模拟树的下拉列表是不是很酷(这也是ExtAspNet的一个特色): 点击“保存并继续”,首先会AJAX回发到服务器并新增菜单到数据库,然后重新绑定下拉列表并弹出对话框: 新增另外一个菜单,并设置此菜单的父菜单为刚刚添加的: 点击“保存并关闭”,首先会AJAX回发到服务器并新增菜单到数据库,然后弹出对话框,当你_ext:pagemanager

办公软件不能打印能打印测试页,在office办公软件word中不能打印是什么原因-程序员宅基地

文章浏览阅读3.6k次。Word不能打印,原因可能有以下几种:1、可能没有安装打印机驱动首先检查一下是否安装了打印机驱动程序。方法是:在“计算机”上右键——“属性”——“设备管理器”,打开“设备管理器”窗口,检查里面是否有“打印机”,没有就还没有安装打印机驱动程序。如果是 xp 操作系统,在“我的电脑”上右键——“管理”——“设备管理器”,打开“设备管理器”窗口。2、是否设置了默认打印机依次选择“开始”——“控制面板”,..._表格和文档打印不了,可以打印测试页

随便推点

java 生成html_用java生成html文件实现原理及代码-程序员宅基地

文章浏览阅读1.3k次。原理跟用java生成jsp的servlet差不多。我们可以用printStream来向html文件里输出数据。先创建一个StringBuilder对象,通过append方法来为其添加html语句。如下面例子所示:StringBuilder sb = new StringBuilder();Properties fileProperties = getProperties("file");Prope..._java生成数据写入html模板

eCharts折线图延伸曲线至与y轴相交-程序员宅基地

文章浏览阅读3.6k次,点赞2次,收藏8次。先上效果图:步骤:1、在数据前面加一组虚拟数据,x轴为空,y轴的值比第一个数据稍小一些2、数据标签修改第一个不显示formatter: function(param){ var index = param.dataIndex; if (index === 0) { return &quot;&quot;;//虚拟数据上不显示标签 } else { return..._echarts折线图延伸曲线至与y轴相交

雨林木风系统md5值_新手小白如何重装电脑系统详解-程序员宅基地

文章浏览阅读214次。目前流行四种安装方法:一是windows PE安装,二是网上下载安装,三是Ghost克隆安装,四是盘对盘对拷。windows PE安装成功率高,操作间单,用时短,十几分钟就装完了,为一般人所喜爱。1、首先,要准备好Windows系统文件,大家可以在网上自行下载,我一般都在雨林木风里面下载,里面的系统也比较稳定流畅,http://www.ylmfeng.com/index.html2、下载好了系统之...

linux 内核配置_allocate 2nd-level pagetab-程序员宅基地

文章浏览阅读1.2k次。对于每一个配置选项,用户可以回答"y"、"m"或"n"。其中"y"表示将相应特性的支持或设备驱动程序编译进内核;"m"表示将相应特性的支持或设备驱动程序编译成可加载模块,在需要时,可由系统或用户自行加入到内核中去;"n"表示内核不提供相应特性或驱动程序的支持。只有才能选择M1. General setup(通用选项)[*]Prompt for development and/or _allocate 2nd-level pagetab

shell怎么使用制表符_shell中vi替换特殊字符(制表符\t等)的方法-程序员宅基地

文章浏览阅读1.4k次。今天看shell教程,看了下特殊字符里面还真不少,顺便练下手echo ------------------------------------echo "|a\t|ab\t|abc\t|abcd\t|abcde\t|abcdef\t|"echo -----------------------------------_echo "|\v|"输出还不错-------------------------..._shell \t

solr教程,值得刚接触搜索开发人员一看_solr一个人能开发吗-程序员宅基地

文章浏览阅读1.1k次。Solr调研总结开发类型全文检索相关开发Solr版本4.2文件内容本文介绍solr的功能使用及相关注意事项;主要包括以下内容:环境搭建及调试;两个核心配置文件介绍;维护索引;查询索引,和在查询中可以应用的高亮显示、拼写检查、搜索建议、分组统计、拼音检索等功能的使用方法。版本_solr一个人能开发吗