明白Net Device Ingress和Egress 两个角色
发布时间:2023-02-21 13:14:01 所属栏目:云计算 来源:互联网
导读:我在整理 eBPF 相关的内容,尤其是 tc eBPF 的时候,再一次发现如果无法准确地在信息流中识别出网络设备是 Ingress 还是 Egress ,就无法将程序逻辑和系统运行结果对上号,更勿谈能理解tc eBPF 了。 这样的双重角色扮演就如同一个调皮的孩子,总是带上面具在
我在整理 eBPF 相关的内容,尤其是 tc eBPF 的时候,再一次发现如果无法准确地在信息流中识别出网络设备是 Ingress 还是 Egress ,就无法将程序逻辑和系统运行结果对上号,更勿谈能理解tc eBPF 了。
这样的双重角色扮演就如同一个调皮的孩子,总是带上面具在错综复杂的网络里面东躲西藏,肆意玩耍。而当你好不容易抓到它时,却让你猜猜此时此刻他是谁。
简单来说:对于网卡而言,无论它是物理的还是虚拟的,对于 Ingress 角色,它是首先触碰到数据的人,而对于 Egress 角色,它是最后一个触碰到数据的人。
本文我们从一个简单的物理网卡开始,然后对 veth、 bridge 还有 tc eBPF ,分别展开聊聊:
当网卡扮演 Ingress 角色时,它从哪里接收数据,又将数据递交给了谁?
当网卡扮演 Egress 角色时,它从哪里接收数据,又将数据递交给了谁?
1、单个物理网卡
(1)输入流程 Ingress
对于这张网卡而言,输入过程伴随着以下几个重要的事情:物理网卡首先接收到物理信号 -> 物理网卡通过 DMA 机制将数据保存至其专属的 RingBuffer 里面 -> 向 CPU 发起中断 -> OS kernel thread ksoftirqd/x 不断地消费 RingBuffer 里面的数据。
这里的 ksoftirqd 是一个内核线程,每个 CPU 一个,x 为 CPU 编号。如 ksoftirqd/0 为 0 号 CPU 上运行的内核线程。
ksoftirqd/x 将数据以 skb 为处理粒度依次穿过链路层、网络层、TCP/UDP 传输层 。不过 skb 在链路层和网络层还可能直接 forward 给其它网卡,这样的话传输层就不会收到这个 skb 了。
总结:物理网卡起到输入作用的时候,它将来自主机外的接收数据提交给环队列,随后由 ksoftirqd/x进行后续处理,这个处理过程也称为网络的底层。
(2)输出过程 Egress
我们大致可以看出来,对于输出过程,数据来源有两种,分别是通过 ip_forward() 过程和通过 ip_local_out() 过程送过来的数据。我们还会发现,在发送数据的路径上,这两个过程只是起点有些不同,剩下的路程大家都一样。
ip_forward() 过程与 skb 在 IP 层路由结果强相关。具体来说经过路由的判定,可能需要把 skb forward 至本机网络设备或者网络中的其它主机处理,不过无论是哪种情况,都需要将 skb 送往本机的一个网络设备。
而 ip_local_out() 过程则对应了本机进程通过 socket 发送数据的场景。这张图最后标注的“触发 NET_RX 类型软中断”是数据已经被网卡发送完后发生的事情,中断的目的是为了清理 skb ,略过不表。
总结:当物理网卡扮演 Egress 角色时,它从本机 TCP/IP 协议栈接收数据,将数据通过驱动程序送离本机。
(编辑:莱芜站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |