Skip to content

Commit

Permalink
fix typo
Browse files Browse the repository at this point in the history
  • Loading branch information
isno committed Jun 20, 2024
1 parent d3ecad4 commit 5f02807
Show file tree
Hide file tree
Showing 3 changed files with 9 additions and 7 deletions.
2 changes: 1 addition & 1 deletion http/protobuf.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# 2.4.2 使用 Protocol Buffers 序列化数据

无论是微服务场景还是 Google 所开源的技术体系中,经常能看到 Protobuf 的身影。Protobuf 这个数据格式有何独特之处?以至于工程师们无论是高性能场景还是各类的标准/协议制定都默认选择它。
微服务或者 Google 开源的技术体系中,经常能看到 Protobuf 的身影。Protobuf 数据格式有什么独特之处?以至于工程师们无论是高性能场景还是各类的标准/协议制定都默认选择它。

:::tip Protocol Buffers
Protocol Buffers(简称 Protobuf 或者 pb)是 Google 公司开发的一种轻便高效的结构化数据存储格式,用来描述各种数据结构进行结构化数据串行化,或者说序列化。相比 XML 和 JSON,Protobuf 更小、更快、更简单,很适合做数据存储或 RPC 数据交换格式。
Expand Down
10 changes: 6 additions & 4 deletions network/linux-bridge.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,16 +10,18 @@ Linux Bridge 是 Linux 内核 2.2 版本开始提供的二层转发工具,由
:::


对于通过 brctl 命令显式接入网桥的设备,Linux Bridge 与物理交换机的转发行为是完全一致的,当有二层数据包(帧)从网卡进入 Linux Bridge,它就会根据数据包的类型和目标 MAC 地址,按照如下规则转发处理
Linux Bridge 与物理交换机的转发行为是完全一致的,当有二层数据包(帧)从网卡进入 Linux Bridge,它就会根据数据包的类型和目标 MAC 地址,按照如下规则处理

1. 如果数据包是广播帧,转发给所有接入网桥的设备
1. 如果数据包是广播帧,转发给所有桥接到该 Linux Bridge 的设备
2. 如果数据包是单播帧:
- 地址转发表中找不到该 MAC 地址(网桥与交换机类似,会学习 MAC 地址与端口的映射),则洪泛(Flooding)给所有接入网桥的设备,并把响应设备的接口与 MAC 地址学习到自己的 MAC 地址转发表中;
- 地址转发表中找到了 MAC 地址,则直接转发到地址表中指定的设备。
3. 如果数据包是此前转发过的,又重新发回到此 Bridge,说明冗余链路产生了环路。由于以太帧不像 IP 报文那样有 TTL 来约束,所以一旦出现环路,如果没有额外措施来处理的话,就会永不停歇地转发下去。那么对于这种数据包,就需要交换机实现生成树协议(Spanning Tree Protocol,STP)来交换拓扑信息,生成唯一拓扑链路以切断环路。

Linux Bridge 与普通物理交换机非常相似,但还是有点区别,普通的交换机只会做二层转发,**Linux Bridge 却还能把发给它的数据包再发送到主机的三层协议栈中**
Linux Bridge 肯定是在某台 Linux 主机上创建的,我们可以看作是 Linux Bridge 有一个与自己名字相同的隐藏端口,隐式地连接了创建它的那台 Linux 主机。因此,Linux Bridge 允许给自己设置 IP 地址,这样就比普通交换机多出了一种特殊的转发情况:**如果数据包的目的 MAC 地址为网桥本身,并且网桥设置了 IP 地址的话,那该数据包就会被认为是收到发往创建网桥那台主机的数据包**,这个数据包将不会转发到任何设备,而是直接交给上层(三层)协议栈去处理。这时,网桥就取代了物理网卡 eth0 设备来对接协议栈,进行三层协议的处理。

Linux Bridge 肯定是在某台 Linux 主机上创建的,我们可以看作是 Linux Bridge 有一个与自己名字相同的隐藏端口,隐式地连接了创建它的那台 Linux 主机。

因此,Linux Bridge 允许给自己设置 IP 地址,这样就比普通交换机多出了一种特殊的转发情况:**如果数据包的目的 MAC 地址为网桥本身,并且网桥设置了 IP 地址的话,那该数据包就会被认为应该发往创建网桥那台主机**,这个数据包将不会转发到任何设备,而是直接交给主机(三层)协议栈去处理。这时,网桥就取代了物理网卡 eth0 设备来对接协议栈,进行三层协议的处理。

读者们是否还记得 3.3.2 节提到的设置 bridge-nf-call-iptables 参数?就是因为 Linux Bridge 与普通交换机的一点不同。

4 changes: 2 additions & 2 deletions network/linux-kernel-networking.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ Netfilter 实际上就是一个数据包过滤器框架,Netfilter 在网络包
- LOCAL_OUT:本机产生的准备发送的包,在进入协议栈后立即触发此 hook。
- POST_ROUTING:本机产生的准备发送的包或者转发的包,在经过路由判断之后,将触发此 hook。

**其它内核模块(例如 iptables、IPVS 等)可以向这些 hook 点注册钩子函数。当有数据包经过时,就会自动触发内核模块注册在这里的钩子函数,这样程序代码就能够通过钩子函数来干预 Linux 的网络通信**进而实现对数据包过滤、修改、SNAT/DNAT 等各类功能。
**其它内核模块(例如 iptables、IPVS 等)可以向这些 hook 点注册钩子函数。当有数据包经过时,就会自动触发内核模块注册在这里的钩子函数,这样程序代码就能够通过钩子函数来干预 Linux 的网络通信**实现对数据包过滤、修改、SNAT/DNAT 等各类功能。

:::tip 额外知识

Expand All @@ -38,7 +38,7 @@ Hook 设计模式在其他软件系统中也随处可见,譬如 eBPF、Git、K
图 3-3 Kubernetes 服务的本质
:::

如图 3-4 Kubernetes 网络模型说明示例,当一个 Pod 跨 Node 进行通信时,数据包从 Pod 网络 Veth 接口发送到 cni0 虚拟网桥,进入主机协议栈之后,首先会经过 PREROUTING hook,调用相关的链做 DNAT,经过 DNAT 处理后,数据包目的地址变成另外一个 Pod 地址,再继续转发至 eth0,发给正确的集群节点。
如图 3-4 Kubernetes 网络模型说明示例,当一个 Pod 跨 Node 进行通信时,数据包从 Pod 的 veth-pair 接口发送到 cni0 虚拟网桥,进入主机协议栈之后,首先经过 PREROUTING hook,调用相关的链做 DNAT,经过 DNAT 处理后,数据包目的地址变成另外一个 Pod 地址,再继续转发至 eth0,发给正确的集群节点。

:::center
![](../assets/netfilter-k8s.svg)<br/>
Expand Down

0 comments on commit 5f02807

Please sign in to comment.