组播可以分成MAC层组播/IP层组播和应用层组播. 局域网里三种都可以用, 用第一种最多, 第二种其次. 广域网里只能用后两者, 第三种最普遍, 第二种需要网中的路由器支持, 这是最近几年才成熟的, 老的路由器可能不支持.(https://bbs.csdn.net/topics/390715120?page=1#new_post)
一、前言
其实主要总结vxlan的,但说明vxlan,又离不开组播、IGMP协议,所以放在一起总结了。主要是一些要点的总结,并没有太详细的分析,这样便于以后的查阅和复习,也可作为快速了解vxlan的途径。
本文主要根据RFC、tcp/ip详解卷一来总结。
先来两个网络图,为了便于查看协议。
二、vxlan
解决2、3层之上的多租户数据中心网络环境。
可以部署在2、3层之上。
vtep(VXLAN Tunnel End Point)不能对vxlan包分段。所以一般设置最大的MTU、或者使用MTU发现协议设置MTU。
对广域网的地址学习是无能为力。
OTV(覆盖网络传输虚拟化)相较于vxlan的最大特点是可以在广域网上进行地址学习。因为OTV在大二层建立了控制平面,IS-IS可以在三层建立控制平面。
整体报文封装头:
IPv6传输的整体报文格式:
1.vxlan头(8字节)
flag(8位,1个字节):R|R|R|R|I|R|R|R,I为1,其他为0。
VNI:24位(3个字节)。定义不同的vxlan通道,不同VNI之间的虚拟机不能通信。
保留位:24位+8位(4个字节)。传输端设置为0,接收端不关心。
2.外部UDP头
目的端口号:周知的端口号4789.
源端口号:建议根据内部报文(例如,以太网头)哈希一个端口号。可利用该值做负载均衡。
建议的范围是49152-65535。
UDP校验和:应该设置为0。接收端必须接受为0的包。如果不为0,(根据UDP伪首部、UDP、VXLAN、携带的MAC帧),接收端如果验证了该值,且不正确,那么必须丢弃该包,如果未验证,或者验证是正确的包,那么必须解析该包。
3.外部IP头
源地址:是VM(用内部的源MAC代表)所在的VTEP的IP地址。
目的地址是目的VM(用内部的目的MAC代表)所在的VTEP的IP地址。目的地址可以是单播或者组播。
4.外部以太网头
外部的vlan标签是可选的,如果存在,同正常的vlan,那么是用来在lan中划分vxlan流量的。
5、控制平面
两种,自动学习、中央分配。
远端的VTEP,根据来的vxlan包,学习内部源MAC和外部的源IP之间的对应关系。
多播路由协议(例如PIM-SM)可以提供3层网络的多播树。
vm的arp是通过组播向其他VTEP发送,VTEP再在所属的VNI局域网内arp。VTEP之间是通过组播交流arp的。VNI和组播号的对应是通过管理通道配置的。VTEP发送IGMP报告到组播路由器,来监听指定的组播。
6、应用场景
接收方向:除非明确将其传递给非VXLAN接口,否则具有内部VLAN ID的解封装帧应该被丢弃。
发出方向:根据非vxlan的包的vlan映射到vxlan。除非明确配置传输带有vlan ID的帧给某个vxlan,否则去除vlan id。
6.1内部vlan tag
不应该包含内部vlan tag,除非明确配置了。
原来的vlan网络,使用vxlan之后,应该把vlan映射进vxlan中。并且vlan 12位的id,完全可以映射进vxlan的24位的id中。
三、广播和组播
广播和组播(也成为多播)仅应用于UDP。因为UDP才是一对多的。
组播服务,例如:无盘工作站BOOTP系统(可能广播实现)、交互式会议系统(可能向每个目的地址传送一个TCP数据复制来实现)。应用程序可以向一个服务器发送一个请求,而不用知道任何特定服务器的IP地址
以太网只是组播和广播的一种实现。
1.以太网广播、组播的实现
广播地址:ff : ff : ff : ff : ff : ff
多播地址:0 1 : 0 0 : 0 0 : 0 0 : 0 0 : 0 0,地址中最高字节的最低位设置为 1时表示该地址是一个多播地址。
如果当前没有进程使用该目的端口号,就丢弃该数据报并产生一个 I C M P不可达报文( T C P根据它的端口号作相似的过滤)。
2.IP 广播实现
四种:受限的广播、指向网络的广播、指向子网的广播、指向所有子网的广播。
2.1 受限的广播
路由器不转发受限的广播。仅在本地网路。本地广播。
如果主机是多个接口时,广播发到哪个接口是个问题,随不同系统的实现而不同。
2.2 指向网络的广播
A类网络广播地址为 n e t i d . 2 5 5 . 2 5 5 . 2 5 5,其中n e t i d为A类网络的网络号。
一个路由器必须转发指向网络的广播,但它也必须有一个不进行转发的选择。
2.3 指向子网的广播
主机号为全1且有子网号的地址。
可能因为漏配置子网号,导致不是一个指向子网的广播地址。
2.4 指向所有子网的广播
子网号和主机号为全1.所以需要了解目的网络的子网掩码。
例如128.1.255.255/255.255.255.0,是一个指向所有子网的广播地址。但如果没有指明子网掩码,那么这就是个指向网络的地址。相反,如果不该配置子网掩码的指向网络的广播地址,误配置了子网掩码,那么就会是一个指向所有子网的广播地址。
当前的路由器没有将一个指向所有子网的广播地址传送给所有的子网。这样避免了因错误的配置,导致一个指向网络的广播地址误为一个指向所有子网的广播地址。
这样的需求尽量使用多播满足。
3.IP组播实现
IP多播提供的两类服务:
1)向多个目的地址传送数据。
2)客户对服务器的请求。也可能广播实现(BOOTP)。
使用D类IP地址实现。
最高4位是1110.
范围是2 2 4 . 0 . 0 . 0到2 39 . 2 5 5 . 2 5 5 . 2 5 5。
知名多播地址:
例如, 2 2 4 . 0 . 0 . 1代表“该子网内的所有系统组”, 2 2 4 . 0 . 0 . 2代表“该子网内的所有路由器组”。多播地址 2 2 4 . 0 . 1 . 1用作网络时间协议 N T P, 2 2 4 . 0 . 0 . 9用作R I P - 2, 2 2 4 . 0 . 1 . 2用作S G I公司的d o g f i g h t应用。多播地址2 2 4 . 0 . 0 . 4是一个知名的地址,它被当前用于多播选路的距离向量多播选路协议 D V M R P。
3.1 IP组播组地址和以太网地址的转换
IP多播对应的以太网地址范围:0 1 : 0 0 : 5 e : 0 0 : 0 0 : 0 0到0 1 : 0 0 : 5 e : 7 f : ff : ff
地址映射不是唯一的,32个对1个以太网地址。设备驱动程序或者IP层需要对数据报进行过滤。
局域网网卡趋向两种处理类型:一种是网卡根据对多播地址的散列值实行多播过滤,这意味仍会接收到不想接收的多播数据;另一种是网卡只接收一些固定数目的多播地址,这意味着当主机想接收超过网卡预先支持多播地址以外的多播地址时,必须将网卡设置为“多播混杂(multicast promiscuous)”模式。
通过路由器转发多播时,需要IGMP协议。
3.2 FDDI和令牌环网中的组播
FDDI使用相同的IP多播到48位FDDI地址的映射过程。令牌环网有所不同。
4. 任播(anycast,ipv6特有地址类型)
多个主机提供一个服务,该服务用一个地址表示,该地址就是anycast。
向哪个主机请求服务,取决于路由处理,路由会选择最近的服务点服务,所以也达到了负载均衡的效果。
Anycast 指IPV6协议中一个发送方同最近的一组接收方之间的通信。one-to-one-of-many.任播同单播地址格式,但从地址上是分不出任播的。所以,节点必须使用明确的配置指明它是一个任播地址。目前,任播仅被作为目的IP地址,且仅分配给路由器。
它的最初语义是,在IP网络上通过一个Anycast地址标识一组提供特定服务的主机,同时服务访问方并不关心提供服务的具体是哪一台主机(比如DNS或者镜像服务),访问该地址的报文可以被IP网络路由到这一组目标中的任何一台主机上,它提供的是一种无状态的、尽力而为的服务。
Anycast 的定义是: 当一个单播地址被分配到多于一个的接口上时,发到该接口的报文被网络路由到由路由协议度量的“最近”的目标接口上。
感觉像是路由协议定义出来的最近的路径。
四、IGMPv1
知名多播地址:2 2 4 . 0 . 0 . 1代表“该子网内的所有系统组”。
I G M P v1有固定的报文长度,
没有可选数据。
I GM P报文通过I P首部中协议字段值为 2来指明。
1. 报文字段解析
版本号为1:IGMPv1,另外有IGMPv2、IGMPv3
IGMPv1类型字段:为0表示多播路由器发出的查询报文,为1表示主机发出的报告报文。
检验和:计算和I C M P协议相同。
组地址:为D类IP地址。查询报文中为0,报告报文中为要参加的组地址。
2. IGMP查询和报告
主机:
1)第一个进程加入一个多播组时,主机发送一个IGMP报告。如果主机的多个进程加入同一个组,只发送一个IGMP报告。报告发送到组所在的接口上(网卡)。
2)主机的进程离开一个多播组时,不发送IGMP报告,即便是最后一个进程离开。在随后收到的IGMP查询中就不再发送该组的报告报文了。
3)主机通过发送IGMP报告来响应一个IGMP查询。对每个至少包含一个进程的组均要发回IGMP报告。
多播路由器:
1)多播路由器定时向每个接口发送IGMP查询报文。报文中的组地址设置为0。
2) 多播路由器根据收到的IGMP报告更新IGMP表信息。
TTL字段固定为1,所以数据分组仅限于本地子网。对发往一个多播地址的数据报从不会产生 I C M P差错。当T T L值为0时,多播路由器也不产生I C M P“超时”差错。
3. 实现
多播路由器中,保留了一个表,该表有接口和多播组的对应信息。当要路由一个多播时,先根据多播组查询该表,找到所有出接口,然后发送。也可能在每个接口上都有一个类似的表,来保存该接口上的多播组信息。
主机也保留了一张表,包含所有至少含有一个进程的多播组以及多播组中的进程数量。
首个IGMP报告发出后,会在间隔一段时间后(0~10秒随机),再次发出。
主机收到查询后,并不立即响应,而是等待一定的时间。因为参加同一多播组的主机都会发出响应,且目的地址是多播组地址,所以,当收到其他主机发出的同一组的报告时,就不必重复响应了。(但IGMPv3中去除了该功能)
出处:https://www.2cto.com/net/201709/679992.html