xiaohanliang
OS
OS
  • hi
  • PROCESS
    • 0. 你的程序是怎么用内存的
    • 1. 为什么内存要区分堆与栈
    • 2. 什么叫你的程序
    • 3. 搞玄学?看看进程切换
    • 4. 进程是怎样调度的
    • 5. 理解进程线程有啥用
    • 6. 没有人真正见过的进程通信
    • 7. [WIP]mutex的起源CAS
    • 8. [WIP]mutex的下一步信号量
    • 9. [WIP]如何人为制造死锁
    • 10. 怎么什么东西都是fd
    • 11. IO各种模型
    • 12. Epoll内部是怎么工作的
  • NETWORK DEVICES
    • 1. 一个新的namesapce
    • 2. veth对讲机
    • 3. 如何靠网桥连接对讲机
    • 4. 左耳进右耳出的tun设备
    • 5. 如何用iptables改包头
    • 6. 在ip报头上再包个头
    • 7.如何用vxlan隧道分割局域网
    • 8. 通过多播组的方式获取mac
    • 9. 自动维护的fdb/arp表
    • 10. [WIP]macvlan网卡
Powered by GitBook
On this page
  • introduction
  • backgroud
  • 多播模式下的vxlan
  • 我们再仔细回顾一下这些概念
  • 一次完整的通讯过程

Was this helpful?

  1. NETWORK DEVICES

8. 通过多播组的方式获取mac

introduction

我们在上一节里描述了为什么需要vxlan, 以及为了让vxlan运行, 你可能需要设置一个多播组/或者一个控制中心来提供一些必要信息(收件人mac+vtep_ip). 这一节我们详细描述一下这两种方案具体是怎么工作的. 我们先提出几个term

backgroud

多播组: 解决对端vtep的ip/mac地址信息

局域网内, 某些机器加入的一个小组, 多播组信息只会被这个小组成员收到, 对应我们的场景下, 就是同一个vni下的机器, 会加入同一个多播组. 这基本上就是"群里吼一嗓子"的效果(也叫arp洪泛), 某个人想发消息给另一个人, 但不知道那个人的信息, 就去小群里吼一嗓子, 然后知道的人就会告诉他

这个人知道了这个信息以后, 会把这个信息存到自己的fdb表里, 下次再发消息给他的时候就不用再到处问了, 你可以通过下面这种方式往fdb表里添加信息:

bridge fdb add \                # 往fdb表中添加信息
       to  00:17:42:8a:b4:05 \  # 对端vtep的mac地址
       dst 192.19.0.2 \         # 对端vtep的IP地址
       dev vxlan0               # 使用vxlan0设备

多播模式下的vxlan

ip link add vxlan0 type vxlan \  # 创建一块vxlan网卡
        id       42 \            # vni为42
        dstport  4789 \          # 对端vtep监听端口为4789
        local    192.168.1.2 \   # 本节点vtep的ip地址
        group    224.1.1.1 \     # 多播组ip 
        dev      eth0            # vtep使用什么网卡通信

ip addr add 172.17.1.2/24 dev vxlan0
ip link set vxlan0 up
ip route

# 路由表被改了, 这里试图说明, 所有172.17.1.x的消息都必须通过
# vxlan0网卡这个出口才能出去
172.17.1.0/24 dev vxlan0 src 172.17.1.2

# fdb表也被改了
00:00:00:00 dev vxlan0 dst 224.1.1.1 via eth0 self permanent

我们再仔细回顾一下这些概念

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. 主机1上的某个程序要想要发一条消息给172.17.1.3, 主机1的路由判定这个消息应该从vxlan0出, 内核发现这个地址跟自己的地址(自己是172.17.1.2)在同一网段下, 因此需要知道对端的mac地址, 故发起了一次arp查询

  2. arp报文的源mac地址为vxlan0的mac地址, 目标mac地址是255.255.255.255(广播地址), 并添加上了vxlan头vni=42, 不知道对端vtep在那台主机上但是却配置了多播地址, 因此vtep会往多播地址224.1.1.1上发送多播报文

  3. 多播组里的所有主机都会收到这条报文, 内核发现是一条vxlan消息, 因此会转交给vtep. 主机2的vtep去掉vxlan头, 取出arp报文, 同时将主机1的源IP/mac记录到自己的fdb表中, 这就是我们说的学习过程.

  4. 接下来主机2要开始生成应答报文, 因为已经知道主机1的mac地址了所以不需要多播了, 直接回复给主机1就好了

  5. 主机1收到arp应答报文, 自己也完成了一次主机2的ip/mac的学习. 双方通信地址都已经知道了, 现在可以直接开始通话了

Previous7.如何用vxlan隧道分割局域网Next9. 自动维护的fdb/arp表

Last updated 4 years ago

Was this helpful?