Veth Pair
veth 虚拟网络设备一端连着协议栈,另外一端不是物理网络,而是另一个 veth 设备,成对的 veth 设备中一个数据包发送出去后会直接到另一个 veth 设备上去。每个 veth 设备都可以被配置 IP 地址,并参与三层 IP 网络路由过程。
下面就是一个典型的 veth 设备对的例子:
我们配置物理网卡 eth0 的 IP 为 12.124.10.11, 而成对出现的 veth 设备分别为 veth0 和 veth1,它们的 IP 分别是 20.1.0.10和 20.1.0.11。
|
|
然后尝试从 veth0 设备 ping 另一个设备 veth1:
|
|
Note: 在有些 Ubuntu 中有可能 ping 不通,原因是默认情况下内核网络配置导致 veth 设备对无法返回 ARP 返回包。解决办法是:
|
|
可以尝试使用 tcpdump 看看在 veth 设备对上的请求包:
|
|
可以看到在 veth1 上面只有 ICMP echo 的请求包,但是没有应答包。仔细想一下,veth1 收到 ICMP echo 请求包后,转交给另一端的协议栈,但是协议栈检查当前的设备列表,发现本地有 20.1.0.10,于是构造 ICMP echo 应答包,并转发给 lo 设备,lo 设备收到数据包之后直接交给协议栈,紧接着给交给用户空间的 ping 进程。
我们可以尝试使用 tcpdump 抓取 lo 设备上的数据:
|
|
由此可见,对于成对出现的 veth 设备对,从一个设备出去的数据包会直接发给另外一个设备。在实际的应用场景中,比如容器网络中,成对的 veth 设备对处于不同的网络命名空间中,数据包的转发在不同网络命名空间之间进行,后续在介绍容器网络的时候会详细说明。
Linked Mentions
-
No backlinks found.