关于VxLAN封装

网络工程 虚拟局域网
2021-08-02 19:24:04

我正在阅读 VxLAN 并了解封装过程如下:

步骤 1:获取原始以太网帧。

Step2:放到VxLAN封装里面。

步骤 3:VxLAN 应该进入 UDP 标头内部。

Step4:UDP进入IP内部(我猜这应该是传输IP)

第 5 步:IP 进入任何传输方式(例如以太网)

Q1:请确认以上理解是否正确。

Q2:为什么我们需要 VxLAN 标头进入 UDP 内部,为什么不通过普通 IP 发送?

Q3:在其他隧道机制中,如OTV,我们不使用任何第4层协议(如TCP或UDP),为什么在这里使用它?任何具体原因。

Q4:为什么使用UDP(因为它是尽力而为的),为什么不使用TCP?

Q5:我可以像看待 HTTP 或 Telnet 的方式看待 VxLAN(两者都是应用程序并在第 7 层运行),HTTP 使用 TCP 端口 80,telnet 使用 TCP 端口 23,我想了解的是 VxLAN 是一个运行的应用程序在第 7 层并适合 osi 模型?此外,OTV 将在哪个 OSI 层运行以及为什么?下面的一个答案说 OTV 也可以使用 UDP 而不是 MPLS/GRE 来完成,这是否使 OTV 成为在第 7 层运行的协议?

我还附上了一个视频讲座中 VxLAN 标头的数据包捕获快照。在此处输入图片说明

4个回答

是的 - 您对封装的理解是正确的:给定的帧应用了 VXLAN 标头。这是在 UDP 数据包中携带的。

UDP 在编程方面被用作一种方便的格式,它对 src/dst 端口的使用为多路连接提供了一种现成的方法,以及一种中间转发元素可以通过并行链接散列连接的方法。简而言之,UDP 很熟悉,开销很低,并且已经非常好理解。

OTV 可以在 MPLS-GRE 或 UDP 上运行,UDP 是过去几年的首选机制。同样,一大驱动因素是流量的去极化(允许并行路径携带确定性散列的总流量部分)。

为什么不是TCP?封装设备上的过多开销和增加的延迟就是很好的例子。然而,更重要的一点是,要从 TCP 中获取任何值,需要能够将要封装的单个数据包连接到一个整体流中,以便通过滑动窗口进行管理,而不是简单地维护 1:1 映射。加上与具有重传能力相关的状态跟踪和缓冲问题的数量,它变得真正不守规矩。

使用 UDP 与 L2oIP 的另一个原因是增强熵。在大多数情况下,负载平衡是按流/5 元组完成的,UDP 端口是散列中的键,VxLAN 允许将 UDP 源端口设置为任意值(在范围内),这可以暴露给应用层,因此,在向远程 VTEP 遍历网络时增加流设置的粒度和更好的负载平衡

使用 UDP 的另一个原因是它是一种“标准”协议,因此与 GRE/IPSEC 和类似协议不同,您不需要中间设备来支持任何异国情调的东西。

还要考虑一下,您可以在 UDP 之上稍微有效地实现 TCP,但反之则不然:如果您选择 TCP,您将选择加入所有类型的附加功能(与 UDP 相比),例如错误检测和重新传输,无论您是否充分利用它们,这都会使您付出代价。

最初开发 VxLAN 的一个原因是将报头直接放在帧中可以有效地使其成为 GRE 或 VLAN。它也有局限性,特别是因为在需要在整个网络中调整 MTU 或开始影响吞吐量之前,您只能将额外的 20 个字节堆放在帧上很多次,或者开始影响吞吐量(更不用说与读取相关的切换开销/弹出/添加 VLAN 标签)。

VxLAN 通过点对点连接提供类似 VLAN 的隔离,这意味着您的网络可能完全不知道覆盖网络的细节,甚至完全不知道。

与 VxLAN 无关,但对于“从 UDP + 时间构建 TCP”,请参见例如https://hpbn.co/building-blocks-of-udp/(我建议阅读 TCP 部分以了解TCP vs UDP 可以)。

虽然接受的答案很好地解释了为什么使用 UDP 而不是原始 IP,但它并没有很好地解释为什么不使用 TCP。简短的原因是在 VXLAN 隧道内传输的以太网数据包通常已经具有一层 TCP。如果将这些数据包封装在另一层 TCP 中,则同一数据包中有两层 TCP。

TCP over TCP 是一个坏主意:http : //sites.inka.de/bigred/devel/tcp-tcp.html

如果数据包丢失率低,TCP over TCP 似乎可以工作,但在两个不同级别进行重传会使系统在高数据包丢失率时效率越来越低。

所以:不要那样做!UDP 或原始 IP 是一种更好的封装,因为它们不提供另一种不必要的重传级别。隧道协议既适用于 UDP(GTP、VXLAN、Geneve),也适用于原始 IP (GRE)。