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
  • 说说这个vxlan报头

Was this helpful?

  1. NETWORK DEVICES

7.如何用vxlan隧道分割局域网

Previous6. 在ip报头上再包个头Next8. 通过多播组的方式获取mac

Last updated 4 years ago

Was this helpful?

这一篇的内容很长, 因为vxlan网络本身基于一些基础方案实现的, 这一节我们先简单介绍一下这个神秘的家伙到底是什么, 想要处理什么问题, 以及实现过程中可能遇到的一些tricky的点在哪儿

我们想象一下云服务的基本场景, 就是好几个人要共享一个很大的服务器, 作为提供商, 你的服务器上会有好几个租户. 保证他们彼此相互隔离是一个很重要的议题, 这句话带出了两个隐藏条件:

  1. 不同的服务器之间, 同一个服务器上的不同租户之间是三层可达的(IP报文互通)

  2. 某租户的服务可能落在好几个服务器上, 要求服务彼此互通, 同时也只能收到自己服务的消息, 我不想收到别人服务的消息

那么在这个租户眼里看来, 他自己一大堆的, 跨越了好几个服务器的服务, 彼此组成了一种类似局域网的东西. 多个租户累加在一起, vxlan想要解决的问题, 就是如何在一众服务器上管理诸多局域网的问题, vxlan, virtual extensible local area network, 虚拟局域网, 顾名思义就是来处理这种问题的

还是introduction

vxlan其实也是一种隧道网络, 只不过跟ipip那种点对点的隧道网络不一样, 它是一种多对多的网络, 这是一个四通八达的隧道, 不同租户之间大家一起用这个大隧道. 一个vxlan包含好多个端点(vtep, virtual tunnel endpoint), 这些端点可能属于不同的租户, 每个隧道里的包通过包头的标识符(vni, network identifier)表名自己属于哪个租户, 你是不可能收到别的租户 / 别的vni的包的

vxlan并不需要你改动原先的网络, 只要你是三层互通的, 那么我们就在这个基础上布置vxlan就可以了.

  • 我们说原先的网络他是: "三层互通, 指的是物理层+MAC+IP",

  • 那么在上面包装一层vxlan头, 就变成了:"两层, 指的是内层(原IP消息), 与外层(vxlan封装出来的头)"

有了这样的概念以后, 我们就继续往下说, 一次发消息的过程是你发出了IP包, 然后这个包会被你所属的vtep包装出vxlan报头, 里面包含vni信息, 到达对端以后, 对端的vtep会把这个报头拿掉, 然后把这条消息拿去给收件人

说说这个vxlan报头

vxlan工作的原理就围绕着这个vxlan报头展开, 假设你想要发一条IP报文, 这说明原先就有IP报头, 以及MAC报头. 这里的IP指的是收件人的IP以及MAC. 接着本机的vtep继续封装, 依次添加上vtep报头(包含vni信息), 以及一个UDP报头(对端vtep的mac+ip+udp报头). 我们总结一下, 为了让你发一条消息, 你一共需要这些信息:

  • 内层: 一条IP报文

    • 收件人IP: 这你是知道的

    • 收件人mac: 需要想个办法知道

  • 外层: 一个vxlan头+一个udp头

    • vni, 来构建vxlan报头: 你只往你自己的局域网发, 因此就填你自己的vni就好

    • udp报头: 本vtep的发出端口随机确定, 对端的udp监听端口写死4789

    • 对端vtep的ip: 需要想个办法知道

    • 对端vtep的mac: 如果知道ip就能通过arp知道对端的mac, 毕竟vtep之间是三层互通的

所以为了能让vxlan工作起来发消息, 我们要解决两个问题: 内层mac + 外层的vtep-ip. 常用的解决方法是让vxlan内的

  • 所有vtep加入同一个多播网络, 每次想要知道以上信息的时候就通过多播来查询(村口大喇叭喊人)

  • 设置控制中心, 设置一个agent, 里面存了所有机器的所有信息, 每次vtep想要知道这些信息的时候直接来这个agent里查就好了