理解 net device Ingress 和 Egress 双重角色
腾讯云 2023-03-10 21:04:37

大家好,我是二哥。本篇 3700 字,阅读大概需要 20 分钟,下面是内容概览。


【资料图】

本文是书稿《图解 VPC & K8s 网络模型》其中一篇。书稿还在继续写,进度不快也不慢,因为二哥不急也不躁。好肉需要慢炖,好书需要多磨。

为什么要单独讲这个话题呢?因为我在和同事讨论 K8s 网络尤其是网络数据流向的时候,会反复提及到网络设备,无论它是物理的还是虚拟的。而网络设备在我们所讨论到的数据流场景里,时而在接收数据,时而在发送数据。也就是说它同时扮演着双重身份:Ingress 和 Egress。

另外我在整理 eBPF 相关的内容,尤其是 tc eBPF 的时候,再一次发现如果不能准确地在数据流中识别出网络设备是 Ingress 还是 Egress ,就无法将代码逻辑和实际运行结果对上号,更勿谈能理解tc eBPF 了。

这样的双重角色扮演就如同一个调皮的孩子,总是带上面具在错综复杂的网络里面东躲西藏,肆意玩耍。而当你好不容易抓到它时,却让你猜猜此时此刻他是谁。

简单来说:对于网卡而言,无论它是物理的还是虚拟的,对于 Ingress 角色,它是首先触碰到数据的人,而对于 Egress 角色,它是最后一个碰到数据的人。

本文我们从一个简单的物理网卡开始,然后对 veth、 bridge 还有 tc eBPF ,分别展开聊聊:

当网卡扮演 Ingress 角色时,它从哪里接收数据,又将数据递交给了谁?当网卡扮演 Egress 角色时,它从哪里接收数据,又将数据递交给了谁?

1. 单个物理网卡

图 1

这是一个简单的图,图中有一张物理网卡。我们的台式机通常是这样的配置。橘色的线代表着输入流程,而蓝色的线表示输出流程。

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 了。

整个过程如图 2 所示,你可以从整体上感受一下。标号 1 及 1.x 为数据输入和生产过程,这是本文的重点。而标号 3 为数据消费过程,它带着 skb 从入口处的 net_rx_action() 沿着协议栈由底向上穿越协议栈,这个过程对本文所述的所有 Ingress 场景都是通用的,故后文不再赘述这部分。

图 2

总结:当物理网卡扮演 Ingress 角色时,它从主机外接收数据,将数据递交给了环形队列,然后由 ksoftirqd/x 进行后续的处理,这个处理过程也称为网络栈下半部分。

1.2 输出过程 Egress

从图 1 中,我们大致可以看出来,对于输出过程,数据来源有两种,分别是通过 ip_forward() 过程和通过 ip_local_out() 过程送过来的数据。我们还会发现,在发送数据的路径上,这两个过程只是起点有些不同,剩下的路程大家都一样。

ip_forward() 过程与 skb 在 IP 层路由结果强相关。如图 3 所示,具体来说经过路由的判定,可能需要把 skb forward 至本机网络设备或者网络中的其它主机处理,不过无论是哪种情况,都需要将 skb 送往本机的一个网络设备。

图 3

而 ip_local_out() 过程则对应了本机进程通过 socket 发送数据的场景,如图 4 所示。这张图最后标注的“触发 NET_RX 类型软中断”是数据已经被网卡发送完后发生的事情,中断的目的是为了清理 skb ,略过不表。

图 4 ,图片来源:“开发内功修炼”公众号

总结:当物理网卡扮演 Egress 角色时,它从本机 TCP/IP 协议栈接收数据,将数据通过驱动程序送离本机。

2. veth-pair

是不是觉得单个网卡的场景其实很容易分辨出来 Ingress 和 Egress ?

别得意,我们来加点难度。我们知道 K8s 的默认 CNI flannel 用到了 veth 。veth 是什么以及它的特性二哥就不细说了。我们聊一个话题:图 5 中,当左侧进程向右侧进程通信发送数据时, 左端的 veth_left 是 Ingress 还是 Egress ? 右端的 veth_right 呢?

图 5

结合图 5 上的箭头示意,答案应该不难猜。对 veth_left 来说,它扮演的是 Egress 角色,因为进程需要通过它把数据发送出去。对 veth_right 而言是 Ingress ,因为它需要负责接收数据并把它送给右侧的进程。

下一个问题:既然 veth_left 扮演了 Egress 角色,流量从离开 network namespace 1 之后去哪里了?既然 veth_right 是 Ingress ,那它从哪里接收到流量的?

答案都在图 6 里面。图中标号 2 及 2.x 在进行数据发送的工作,都属于 veth_left 的 Egress 的过程,这个过程是发生在 network namespace 1 里面的,函数调用栈和图 4 一样。而标号 3 为数据消费也即 veth_right 的 Ingress 过程,这个过程和物理网卡一模一样。

更多详细讲解请参考《看图写话:聊聊veth数据流》。

图 6

总结:既然 veth 是一对虚拟网卡,那我们把对它俩的总结放在一起。

当 veth 网卡扮演 Egress 角色时,如图 7 中的 veth_left,它从其所在的 network namespace TCP/IP 协议栈接收数据,并将数据递交给了 per CPU input_pkt_queue 队列,并触发软件中断。

当 veth 网卡扮演 Ingress 角色时,如图 7 中的 veth_right,它并没有物理网卡那种环形队列,而是由 ksoftirqd/x 直接从 per CPU input_pkt_queue 队列读取 veth_left 塞进来的数据。

veth_left 和 veth_right 共享了同一个 queue 。典型的生产者 / 消费者设计模式的即视感有没有?

图 7

3. bridge

上一节,二哥把 veth pair 单独拿出来和大家一起观赏。可它们终究不是花瓶,它们被创造出来是要有实际使用价值的。veth 典型使用场景就是把一端插入到 bridge 里面,如图 8 所示。

从 veth 的特性来说,流量从下图 veth1-left 流出后,会进入 veth1-right ,这也就意味着流量进入了网桥。

我想这个时候你可以确定 veth1-left 是 Egress ,而 veth1-right 是 Ingress 。那么对于 bridge 的 Port 1 和 Port 2 呢?再进一步,对于 veth2-left 和 veth2-right 呢 ?

图 8

其实对于 bridge 这种虚拟的网桥,它的 port 口也是一个虚拟的概念,说得更直白一点,在内核里它就是一个数据结构:struct net_bridge_port 。这个结构里有 3 个重要的成员:br / port_no / dev 。下面的代码用于插入网络设备到 bridge ,这 3 个成员的作用显而易见。

//file: net/bridge/br_if.cstatic struct net_bridge_port *new_nbp(struct net_bridge *br,          struct net_device *dev){  //申请插口对象  struct net_bridge_port *p;  p = kzalloc(sizeof(*p), GFP_KERNEL);  //初始化插口  index = find_portno(br);  p->br = br;  p->dev = dev;  p->port_no = index;  ...}

对于图 8 来说, Port 1 (net_bridge_port) 就是一个粘合剂,左手 bridge ,右手 veth1-right 。理解了这点也就明白了对于 bridge 的 Port 而言,它是没有所谓的 Ingress 和 Egress 的概念的。

Port 1 接收数据其实是 veth1-right 在 Ingress,而 bridge 把这个流量 forward 给 veth2-right 时,veth2-right 其实在扮演 Egress 角色。那流量从 veth2-right 传至 veth2-left 的过程和 veth1-left 向 veth1-right 发送数据的过程是完全一样的。

总结:当 veth 这样的虚拟网卡插入在 bridge 上时:

图8 中 veth1-left 扮演 Egress 角色,它从其所在的 network namespace TCP/IP 协议栈接收数据,将数据递交给了 per CPU input_pkt_queue 队列,并触发软件中断。

veth1-right 扮演 Ingress 角色,它并没有物理网卡那种环形队列,而是由 ksoftirqd/x 直接从 per CPU input_pkt_queue 队列读取 veth1-left 塞进来的数据。当 ksoftirqd/x 把流量送至链路层时,从 br_forward() 开始进入 forward 流程。这个流程的效果就是流量从 veth1-right 转至 veth2-right 发送出去了。

那自然 veth2-right 这个时候就扮演了 Egress 角色,veth2-left 扮演了 Ingress 角色。

4. veth-pair plus

如果你没有晕的话,那抖索一下精神,我们开始 veth-pair 的进阶版。

上一节我们看到 veth 和 bridge 搭配使用的场景。veth 另一端一定要插在 bridge 上吗?从图 9 你也看到了,答案是:不一定。

图 9

现在我们知道,在图 9 中,从 container-1 发出的流量经过 veth 发出后,veth-p 会以 Ingress 角色开始接收。根据前文的解释,当网卡进行 Ingress 时,流量会被 ksoftirqd/x 送往协议栈进一步处理。这个处理的过程当然也就包括了图 9 中的路由过程。

图 9 这里巧妙的地方是:流量是产生于容器内,但对这份流量的路由却发生在主机 root(default) network namespance 里面,使用的也是主机的路由表。如果路由结果发现需要把这份流量发往其它主机,那自然流量就从主机的 eth0 这个网卡设备离开了。在这个过程中,主机其实扮演了网关的角色。

说到这里,你能理解图 10 的工作过程了吗?它是 K8s host-gateway 网络模型,顾名思义,这种网络模型以 host 为 gateway ,更具体地说,host 的 root network namespace 充当了路由的角色。

图 10

5. tc eBPF

如果你对 tc 和 eBPF 了解得不多或者不感兴趣,可以跳过这部分。

以 Cilium 为代表的 K8s CNI 提供商一直在尝试使用 eBPF 代替 iptables 以便优化服务网格数据面性能。其中 bpf_redicrect() 函数即为其中一项优化产出。

bpf_redicrect() 函数的特性用一句话就能解释清楚:当 veth Ingress 时,将流量直接通过 bpf_redirect() 重定向到另一个 veth Ingress。如图 11 所示。

不过如果你对 veth pair 哪一端在何时会扮演 Ingress 角色了解得不是很清楚的话,上面这句话其实会把你绕晕。

图 11

但在看完二哥这篇文章后,希望你不会再晕了。在图 11 中,从右下 Pod 出来的流量会流到位于 host network ns 这一端的 veth 上,这个 veth 是以 Ingress 角色工作的。

你看到在它身上附上了一个 eBPF 小蜜蜂图标,表示这个时候 eBPF 程序会介入执行,执行的结果就是流量被直接通过 dev_forward_skb() forward 给了另外一个同样位于 host network ns 端的 veth (如图 11 箭头所指的那个 veth),当然对这个 veth 而言,它会扮演 Egress 角色。

这个过程也可以用下面这样的函数调用层次图来表示。

pkt -> NIC -> TC ingress -> handle_ing()                            |-verdict = tc_classify()     // exec BPF code                            |           |-bpf_redirect() // return verdict                            |                            |-switch (verdict) {                              case TC_ACK_REDIRECT:                                  skb_do_redirect()       // to the target net device                                    |-if ingress:                                    |   dev_forward_skb()                                    |-else:                                        dev_queue_xmit()

下面是网易轻舟的一篇文章里面所附的图。它画出了网易轻舟基于 Cilium 网络方案的探索和实践细节,包括跨节点 Pod 间通信、同节点 Pod 间通信、Pod 访问外网等各类常见的场景。

图中 cilium_net/cilium_host是一对 veth pair ,它们在 Kernel 4.19+ Cilium 1.8部署中已经没什么作用了(事实上社区在考虑去掉它们)。

我想有了上面所有的铺垫和知识,至少对标号 ① ② 所示的流程,你应该能看得懂了。

图 12

6. 总结

文末,二哥来做个小总结:

对于网卡而言,无论它是物理的还是虚拟的,对于 Ingress 角色,它是首先触碰到数据的人,而对于 Egress 角色,它是最后一个碰到数据的人。对于 Ingress 过程,无论是物理网卡还是虚拟网卡,在它接收到数据后,总是通过 ksoftirqd/x 进行网络栈下半部分处理。对于 Egress 过程,无论是物理网卡还是虚拟网卡,在它从链路层那里拿到数据后,总是通过网卡驱动程序将数据送离本设备。Ingress 过程和 Egress 过程在内核中的处理路径完全不同,也更无对称可言。对于 veth ,无论是搭配 bridge 还是用于 host-gateway 场景,在数据流经过的关键位置区分是 Ingress 还是 Egress ,有助于理解系统对数据流的处理行为。tc eBPF 强依赖 Ingress 和 Egress,理解了它们也才能更好地理解 bpf_redirect() 。

理解 net device Ingress 和 Egress 双重角色

2023-03-10 21:04:37

天羽人体艺术摄影

2023-03-10 20:47:55

韩国一载230人客机起飞前发现实弹 乘客紧急疏散

2023-03-10 18:44:39

北交所如何开户

2023-03-10 16:11:55

上市前土储仅26万平米 毛利率却连年超过70% 焦点简讯

2023-03-10 14:19:22

今日报丨流感多发 疾控专家提醒:正确识别,有效预防

2023-03-10 11:51:30

轮胎好坏的区别在哪里

2023-03-10 09:46:21

天天看点:布鲁克小提琴版宾克斯的美酒_宾克斯的美酒布鲁克钢琴独唱版

2023-03-10 09:28:09

环球百事通!gitlab ssh无法clone(ssh-keygen加密算法问题)

2023-03-10 07:03:01

3月9日基金净值:易方达安盈回报混合A最新净值2.209,跌0.36%|每日资讯

2023-03-10 02:17:13

天天动态:作文摘抄400字加赏析_400字美文摘抄加赏析

2023-03-09 23:27:50

【世界热闻】特斯拉得州厂加紧招聘 筹备Cybertruck夏季生产

2023-03-09 22:01:52

【世界播资讯】安徽特种电缆有限公司

2023-03-09 20:02:25

电脑升级硬件的软件_电脑硬件升级建议软件

2023-03-09 18:29:04

靖江港口集团:5.50亿元超短期融资券获准注册-当前头条

2023-03-09 17:47:10

焦点播报:成都积分入学办理需要什么材料2023

2023-03-09 15:49:13

漫改日剧《放学后海堤日记》定档6月开播!

2023-03-09 13:56:51

莫道君行早更有早行人的意思造句_莫道君行早更有早行人的意思_热点评

2023-03-09 12:17:18

【独家】奚梦瑶一身行头45万,时尚都是钱堆得?他一T恤穿三年,照样时髦

2023-03-09 11:56:12

村庄颜值进一步提升!苏州太平街道沈桥村努力打造宜居美丽乡村

2023-03-09 10:05:45

浙江世宝收深交所审核问询函,被要求说明公司毛利率呈下降趋势的原因,与可比公司是否一致

2023-03-09 07:58:51

全球速讯:薄膜干涉检查平整度原理题目_薄膜干涉检查平整度

2023-03-09 06:55:03

送锦旗怎么说感谢的话(送锦旗感谢语)

2023-03-09 02:19:58

世界微资讯!宁德时代宜春枧下窝选矿厂基建完工时间存疑,已较原计划延期

2023-03-08 21:56:44

高密度脂蛋白胆固醇偏低是怎么回事吃什么好

2023-03-08 21:30:07

全球最资讯丨极品皇妃安知晓下载_极品皇妃安知晓

2023-03-08 19:03:32

君子于役不知其期-全球观察

2023-03-08 17:49:31

益客食品:2023年以来鸭产品的销售价格持续上升-世界微资讯

2023-03-08 16:56:33

“三八”节柳叶湖游船推出“踏春福利” 吸引众多游客打卡

2023-03-08 14:57:33

环球快看点丨vibram是什么牌子

2023-03-08 14:49:19

微信昵称大全女生2021_适合女生的微信名

2023-03-08 12:02:25

国联证券:首予中国财险(02328)“买入”评级 目标价10.1港元

2023-03-08 09:54:43

达音科

2023-03-08 08:10:49

米其林轮胎质量怎么样能用几年_米其林轮胎质量怎么样 天天快播

2023-03-08 08:10:28

天空之城 韩剧 当前速递

2023-03-08 04:53:02

“套套”上面的尖尖是做什么用的?涨知识了

2023-03-08 04:08:06

呷哺呷哺预计2022年度收入47.2亿 净亏损3.2亿-3.4亿_天天最新

2023-03-07 23:26:50

天天最新:世界名车排行榜

2023-03-07 21:08:53

今日热闻!柳州火车站“刘三姐·映梅服务台”统一启用袖章新标识

2023-03-07 20:22:40

【天天播资讯】四氯化碳的作用是什么_四氯化碳的作用

2023-03-07 18:06:14

世界新动态:谁有重生洪荒系列小说

2023-03-07 17:52:29

2023年养老金上涨4%可能吗?缴纳20-30年,养老金会增加多少?

2023-03-07 15:56:55

智能狂拼下载_实时焦点

2023-03-07 14:43:20

当前焦点!sho和nagi_关于sho和nagi的基本详情介绍

2023-03-07 14:17:44

3月7日湖北祖安化工磷酸报价动态 今日最新

2023-03-07 11:48:13

突发事件应急机制

2023-03-07 11:52:46

当前速看:为什么有那么多人买小米,小米有哪些优势?

2023-03-07 09:56:42

什么是支线飞机和干线飞机

2023-03-07 08:37:14

U20亚洲杯:中国队2:0战胜沙特队_全球快资讯

2023-03-07 07:42:45

美团月付怎么关闭呢_美团月付怎么关闭-环球快播报

2023-03-07 05:19:33

头文字d音乐合集_头文字d音乐

2023-03-07 01:57:06

环球快资讯:leapyear函数_leapyear

2023-03-06 21:57:01

海贼王狙击王是谁_焦点速看

2023-03-06 21:15:27

庹庆明代表:建议将“犬只伤人”的刑事责任写入刑法修正案 新资讯

2023-03-06 19:43:07

微速讯:红心大战怎么玩儿_红心大战怎么玩

2023-03-06 18:10:42

【为民创城不停步】排查市政设施,服务群众出行

2023-03-06 17:18:59

世界野生动植物日 成都武侯区林长制志愿服务活动启动|头条焦点

2023-03-06 15:18:08

每日速讯:拳皇对战平台

2023-03-06 15:09:34

不甘认输,再度逆转,澳州小野兔战胜强敌迎来职业生涯新突破

2023-03-06 13:01:35

厦门到哈尔滨机票价格_厦门到哈尔滨机票

2023-03-06 11:48:08

只有 ChatGPT 可以阻止 Bixby 如此浪费空间

2023-03-06 11:04:21

3月6日人民币兑美元中间价上调166个基点 环球要闻

2023-03-06 09:34:21

全球快看点丨iphone如何节省手机内存_iphone如何节省手机内存

2023-03-06 05:54:34

视点!周克华死了没

2023-03-06 05:21:23

板栗的作用_板栗的三大功效-全球速看

2023-03-06 00:16:59

类似沉香如屑的小说_今日看点

2023-03-05 21:35:37

大学代号985是什么意思_大学代号

2023-03-05 19:51:56

直接胆红素偏高是什么意思_直接胆红素偏高是什么意思|环球快报

2023-03-05 18:16:58

天天观天下!孟仲叔季与伯仲叔季的区别_伯仲叔季十个怎么排

2023-03-05 16:49:49

鲸鱼是哺乳动物吗_鲨鱼是哺乳动物吗|天天观点

2023-03-05 15:16:29

恩比德:哈登关键球一个接一个&带领我们逆转 料到他会这样

2023-03-05 13:04:46

大良美食-环球今头条

2023-03-05 11:58:15

荆门市掇刀区掇刀石街道党群服务中心服务群众走心-焦点热议

2023-03-05 09:53:16

日本jk的意思_在日本穿JK是什么含义-天天头条

2023-03-05 08:42:15

朱顶红花期在几月_朱顶红花|全球热文

2023-03-05 00:03:49

天天消息!人大代表中基层群众占有相当比例

2023-03-04 18:00:50

动态焦点:冬奥会主题绘画作品简介_冬奥会主题绘画作品

2023-03-04 16:24:31

艾斯

2023-03-04 12:04:26

蚂蚁保险少儿重疾险值得购买吗?以健康福少儿重疾险为例进行说明

2023-03-04 11:15:44

世界最资讯丨国象国家队新秀对抗赛许翔宇、宋宇新分获男女冠军

2023-03-04 07:21:53

送老婆比较实用的礼物_送老婆什么礼物最实用

2023-03-02 18:10:30

当前简讯:浙江省水利厅领导来江山调研水土保持工作

2023-03-02 15:51:41

3月2日早盘两市机构大单抢筹40股(名单)|环球热资讯

2023-03-02 10:59:11

老虎简笔画彩色 卡通 可爱_老虎简笔画彩色

2023-03-02 06:17:36

世界新资讯:房产是新加坡资产配置的第一选择吗

2023-03-02 04:46:40

那些年,和我擦肩而过的极品钱币...... 全球百事通

2023-03-02 00:13:45

期待有天收——《毒舌律师》

2023-03-01 21:01:39

曹衣出水吴带当风_曹衣出水

2023-03-01 20:46:53

全球今热点:女子用童子尿煮鸡蛋,网友吐槽无法接受,当事人:闻起来很臭,吃起来很香,是当地非遗

2023-03-01 18:44:20

自动驾驶初创公司知行科技据悉考虑最早今年在香港IPO 世界热点评

2023-03-01 16:45:57

ATS双电源自动切换开关_每日信息

2023-03-01 15:17:19

“醉美湖畔·青春相约”——邵阳县天子湖首届优秀单身青年联谊活动举行|全球要闻

2023-03-01 15:00:06

男子酒后吃布洛芬,全身皮肤大面积剥脱

2023-03-01 12:55:17

当前速看:华北地区地下水超采综合治理成效显著

2023-03-01 10:50:15

热消息:扬州大学是211还是双一流_扬州大学是211还是985

2023-03-01 09:56:53

万马股份(002276.SZ):智能科技集团2月27日大宗交易减持2%股份|世界动态

2023-03-01 08:56:47

德智体美劳的自我评价_德智体美劳分别指什么|世界今头条

2023-03-01 06:04:07

电脑不显示可移动磁盘怎么回事_电脑不显示可移动磁盘 全球微头条

2023-03-01 04:30:48

尚品宅配:公司经营正常,达晨减持是基于其自身经营发展需要_环球快播报

2023-03-01 01:01:09

世界快讯:教育学专业基础综合模拟试题 2011版_关于教育学专业基础综合模拟试题 2011版简介

2023-02-28 21:40:48