8. 通过多播组的方式获取mac
introduction
我们在上一节里描述了为什么需要vxlan, 以及为了让vxlan运行, 你可能需要设置一个多播组/或者一个控制中心来提供一些必要信息(收件人mac+vtep_ip). 这一节我们详细描述一下这两种方案具体是怎么工作的. 我们先提出几个term
backgroud
多播组: 解决对端vtep的ip/mac地址信息
局域网内, 某些机器加入的一个小组, 多播组信息只会被这个小组成员收到, 对应我们的场景下, 就是同一个vni下的机器, 会加入同一个多播组. 这基本上就是"群里吼一嗓子"的效果(也叫arp洪泛), 某个人想发消息给另一个人, 但不知道那个人的信息, 就去小群里吼一嗓子, 然后知道的人就会告诉他
这个人知道了这个信息以后, 会把这个信息存到自己的fdb表里, 下次再发消息给他的时候就不用再到处问了, 你可以通过下面这种方式往fdb表里添加信息:
多播模式下的vxlan
我们再仔细回顾一下这些概念
vxlan是一种网络方案, 创建出的接口/网卡叫vxlan0
, 某些消息会被路由到vxlan0, 并最终由vtep
负责发出:
vtep有自己的ip,
vxlan0
也有自己的ip区别在于vxlan的ip是你们私有网络的ip
而vtep的ip则是宿主机的ip(这也是为什么我们指定vtep消息要从eth0网卡发出)
在你的程序里, 你以为你是在跟172.17.1.3
通信, 实际上外部网络根本不知道这个ip指的是谁, 不过没关系:
这条消息会经过vxlan0出口出去, 经过vtep处理并封包.
vtep在外层封上的udp报头中写上的ip是
192.168.1.2
, 那么这个包现在正式成为一个udp消息了目标地址已经从
172
变成192.168
也就是收件人主机/vtep的ip收件人主机拿到这个消息发现是vxlan消息, 并不会自己处理而是交给自己身上的vtep
一次完整的通讯过程
主机1上的某个程序要想要发一条消息给
172.17.1.3
, 主机1的路由判定这个消息应该从vxlan0出, 内核发现这个地址跟自己的地址(自己是172.17.1.2
)在同一网段下, 因此需要知道对端的mac地址, 故发起了一次arp查询arp报文的源mac地址为vxlan0的mac地址, 目标mac地址是
255.255.255.255
(广播地址), 并添加上了vxlan头vni=42, 不知道对端vtep在那台主机上但是却配置了多播地址, 因此vtep会往多播地址224.1.1.1
上发送多播报文多播组里的所有主机都会收到这条报文, 内核发现是一条vxlan消息, 因此会转交给vtep. 主机2的vtep去掉vxlan头, 取出arp报文, 同时将主机1的源IP/mac记录到自己的fdb表中, 这就是我们说的学习过程.
接下来主机2要开始生成应答报文, 因为已经知道主机1的mac地址了所以不需要多播了, 直接回复给主机1就好了
主机1收到arp应答报文, 自己也完成了一次主机2的ip/mac的学习. 双方通信地址都已经知道了, 现在可以直接开始通话了
Last updated
Was this helpful?