在网络中,基本会遇到如下拓扑
1. 实体,交互
我们在图中可以看到两个东西,即“实体”和“动作(信息交互)”。 按照基本程序设计:图中的动作对应两个阶段:if 匹配规则和匹配后执行
代码中的 if 匹配(规则),肯定是基于缓存变量的,所以在实体 A 和 B 中肯定有缓存的:网络中一般谈 2347 层,那么这缓存都是:
- 二层:ARP 表
- 三层:路由表
- 四层:连接跟踪表
- 七层:cookie
分层也对应编程中的重要概念(抽象 类 结构体)等,为了隐藏细节。 比如,七层封装在四层数据包中,四层隐藏在三层数据包中,三层隐藏在二层数据包中 下层只管封装上层数据,不必关系数据细节。
比如 三层关注 IP:源IP和目的IP,四层关注五元组:源IP和目的IP,源端口和目的端口,以及协议
二层不需要看到三层的IP就能完成数据发送(交换) 三层不需要关注端口就完成数据发送(路由转发)
每个层次之需要关注自己那一点业务,不需要解析所有数据,即可完成信息发送的方向的判定,然后执行发送动作。 上一层的发送动作,到下一层就是封包动作。按照协议层级:当前层完成封包动作后,再向下传递
这样每一层的动作抽象起来都是一样的,封装,发送。
这里强调一些路由表:
- 基于源地址(网段)
- 基于目标地址(网段)
- 基于源地址和目标地址
小结: 各层实现都是基于缓存结合if匹配规则,然后执行封包,发送动作,两个字:匹配,发送
2. 包的修改
上面我们说了封装和发送。 二层交换和三层路由都不会修改包,包只会从一个地方到另一个地方。 这里延伸下包的修改,包的修改包含大致如下内容:
基本都是4层功能,基于源|目标地址,源|目标端口,协议
- 丢包
- 地址转换
- 数据加密
- 复制
2.1 丢包
比如安全组,防火墙 ACL 场景:有放通和阻止两种行为
- 基于源地址
- 基于目标地址
- 基于源端口
- 基于目标端口
- 基于协议
- 基于以上组合
2.2 地址转换
其实策略也是一样的,比如地址转换,需要基于匹配策略,进行地址修改,然后封包,发送 snat dnat 端口转换可以简单参考 iptables 的规则定义
防火墙上也可以做地址转换,一般要考虑配合 ACL,先放通流量,然后再修改包
2.3 加密
比如,IPSec 在路由决策后,是基于 ip xfrm policy 对内网包的目标地址进行匹配,进行数据加密,然后将内网数据包,封装为一个公网数据包,在公网上看到的只是加密后的包数据
防火墙上也可以做ipsec,一般要考虑配合 ACL,先放通流量,然后再修改包
复制
一般交换机都具备流量镜像等功能
3. 异常情况:丢包,环路
3.1 丢包
如果说从A->C: 现象看到 A 的包发出去了(traceroute,tcpdump 工具),但 C 没有收到:
- 检查 A 互联 B 的ACL,当前路由平面,互联地址,(甚至,互联地址之后的路由平面,检查光信号,物理链路)
- 检查 B 互联 C 的ACL,当前路由平面,互联地址,(甚至,互联地址之后的路由平面,检查光信号,物理链路)
考虑并行路由,路由无效,路由黑洞等情况
3.2 环路
环路至少对应两条(路由):两侧各有一条路由。
如果只说一条路由就说环路,那就是不知道在说啥。