惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 三生石上(FineUI控件)
Martin Fowler
Martin Fowler
月光博客
月光博客
AI
AI
B
Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
C
CXSECURITY Database RSS Feed - CXSecurity.com
WordPress大学
WordPress大学
GbyAI
GbyAI
L
Lohrmann on Cybersecurity
O
OpenAI News
Schneier on Security
Schneier on Security
P
Palo Alto Networks Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
T
Troy Hunt's Blog
V2EX - 技术
V2EX - 技术
W
WeLiveSecurity
L
LINUX DO - 最新话题
人人都是产品经理
人人都是产品经理
S
Security Affairs
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
A
Arctic Wolf
Recorded Future
Recorded Future
Microsoft Security Blog
Microsoft Security Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
G
GRAHAM CLULEY
N
Netflix TechBlog - Medium
TaoSecurity Blog
TaoSecurity Blog
C
Check Point Blog
Scott Helme
Scott Helme
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Apple Machine Learning Research
Apple Machine Learning Research
PCI Perspectives
PCI Perspectives
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Vercel News
Vercel News
The Hacker News
The Hacker News
Y
Y Combinator Blog
Latest news
Latest news
SecWiki News
SecWiki News
Hugging Face - Blog
Hugging Face - Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Google Online Security Blog
Google Online Security Blog
Webroot Blog
Webroot Blog
Google DeepMind News
Google DeepMind News
Recent Commits to openclaw:main
Recent Commits to openclaw:main
C
Cisco Blogs
博客园_首页
H
Hackread – Cybersecurity News, Data Breaches, AI and More
宝玉的分享
宝玉的分享
L
LINUX DO - 热门话题

蛮荆

如何获取更多的免费服务器 Kubernetes 调度器队列 - 设计与实现 Kubernetes 调度器 - 核心流程 Kubernetes Networking Model & CNI Kubernetes 控制器管理总结 Kubernetes CronJob 设计与实现 Kubernetes Job 设计与实现 Kubernetes HPA 设计与实现 Kubernetes Deployment 滚动更新实现原理 Kubernetes GC 设计与实现 Kubernetes Pod 驱逐 - 设计与实现 Kubernetes Daemonset 设计与实现 Kubernetes ReplicaSet 设计与实现 Kubernetes EndPoint 设计与实现 Kubernetes Informer 设计与实现 降本增效之应用优化 (三) 日志存储与检索 Kubernetes Pod 设计与实现 - 创建流程 Kubernetes 探针设计与实现 Unix 编程艺术名句摘录 Kubernetes - CRI 概述 Golang 编译速度为什么这么快? Kubernetes Pod 设计与实现 - Pause 容器 Kubernetes - kube-proxy 代理模式工程优化 Kubernetes 应用最佳实践 - 优雅关闭长连接 Kubernetes Service 类型和会话亲和性 Kubernetes 为什么需要 Ingress Kubernetes 架构 - 控制平面和数据平面 降本增效之应用优化 (二) 大报表 Go 语言如何获取 CPU 利用率 降本增效之应用优化 (一) Redis 业务规则引擎演变过程简述 微服务中的熔断算法 漏桶算法和令牌桶算法 jsonparser 为什么比标准库的 encoding/json 快 10 倍 ? zap 高性能设计与实现 HTTP Router 算法演进 fastcache 高性能设计与实现 Web 常见的三个安全问题 ants Code Reading Go 线程安全 map 方案选型 布隆过滤器 死锁、活锁、饥饿、自旋锁 sync.Pool Code Reading Go 内存管理概述 Go netpoll Code Reading goroutine 泄漏与检测 time/Timer Code Reading GMP Scheduler Code Reading Go channel 的 15 条规则和底层实现 为什么 Linux “一切皆文件” context.Context Code Reading runtime/HACKING.md Goland 最佳实践 互联网开发与金庸武学 为什么 Redis 6.0 引入多线程模型? Kubernetes 应用最佳实践 - 金丝雀发布 容器中如何正确配置 GOMAXPROCS ? singleflight Code Reading sync.Map Code Reading sync.Cond Code Reading sync.WaitGroup Code Reading sync.RWMutex Code Reading sync.Mutex Code Reading sync.Once Code Reading Go 无锁编程 sync/atomic Code Reading goroutine 交替打印奇偶数 GODEBUG Go 并发模式 Go 汇编 UUID 通用技术选型 Kubernetes 应用最佳实践 - 水平自动伸缩 Go 高性能 Tips fasthttp 为什么比标准库 net/http 快 10 倍 ? 技术文章配图指南 ChatGPT 初体验 Docker 网络原理概览 iptables 的五表五链 Kubernetes 应用最佳实践 - 亲和性和污点容忍度 Go 的反射与三大定律 Docker 官方提供的最佳实践 Go 语言内置的设计模式 HTTP1 到 HTTP3 的工程优化 Kubernetes 应用最佳实践 - Sidecar 模式 Kubernetes 应用最佳实践 - init 容器和钩子函数 为什么 recover 必须在 defer 中调用? 为什么 defer 的执行顺序和注册顺序不同? Go map 设计与实现 Go 切片扩容底层实现 Go 语言中的零拷贝 Go Delve 云原生和边缘计算简介 Kubernetes Pod 服务质量等级 Kubernetes 应用最佳实践 - 探针 Kubernetes 应用最佳实践 - 资源请求和限制 CDN 原理 Kubernetes 应用最佳实践 - 开篇 缓存策略和模式 Go 内存模型 Kubernetes 核心概念
网络基础: 交换机 (拾遗补缺)
2017-07-16 · via 蛮荆

网络基础: 交换机 (拾遗补缺)

2017-07-16 计算机网络

交换机的作用

将很多主机、网关连接在一起,形成一个广播域,使得广播报文仅在这个广播域内传播。

交换机和网卡

可以简单地认为,交换机的每个网线接口后面都是一块网卡,网线接口和后面的电路部分加在一起称为一个 “端口”,也就是说交换机的一个端口就相当于计算机上的一块网卡。

交换机的工作方式和网卡的不同之处在于:

网卡本身具有 Mac 地址,收到到包之后,判断接收方 Mac 地址是不是自己,如果不是发给自己的包,直接丢弃。

交换机的端口不判断接收方 Mac 地址,而是将包存入到缓冲区,然后查询包的接收方 Mac 地址是否已经在 Mac 地址表中有记录了。

Mac 地址表主要包含两个信息:

  1. 设备 (主机) 的 Mac 地址
  2. 设备 (主机) 连接在交换机的哪个端口上

如图所示,Mac 地址和端口一一对应,通过 Mac 地址表可以快速判断出收到的包应该转发到哪个端口。

图片来源: 网络是怎样连接的(户根勤)


Mac 表的维护

交换机 Mac 地址表示例

写入

收到包时,将发送方 Mac 地址以及其输入端口的号码写入 Mac 地址表中。

由于收到包的端口连接着发送这个包的设备,所以只要将这个包的发送方 Mac 地址写入地址表即可。

后续再次收到发往这个地址的包时,交换机就可以将它转发到正确的端口了。

交换机每次收到包时都会执行这个操作,因此只要某个设备发送过网络包,它的 Mac 地址就会被记录到地址表中。

删除

地址表中的记录不能永久有效,应该一段时间不使用后就自动删除。

删除地址表中某条记录,可以防止设备移动时产生问题。

例如开会时把笔记本电脑从办公桌拿到会议室,这时设备就发生了移动,从交换机的角度来看,就是本来 (无线 Wifi) 连接在某个端口上的笔记本电脑消失了。这时如果交换机收到了发往这台笔记本电脑的包,依然会将包转发到原来的端口,通信就会出错。

为了避免上述通信出错问题,必须定时删除过期的记录。

更新

但是,交换机如何知道这台笔记本电脑已经从原来的端口 (位置) 移走了呢?其实很简单,只要笔记本电脑连接到会议室 (新的) 交换机,交换机就会根据笔记本电脑发出的包来更新它的地址表,这样,后续的通信就不会出错了。

重启

当地址表的内容出现异常时,只要重启一下交换机就可以重置地址表,也不需要手动进行维护 (果然,90% 的问题都可以通过重启解决)。


特殊操作

目标端口和源端口相同

当交换机发现一个包的目标端口和源端口是同一个端口,就会直接丢弃这个包。

找不到指定的 Mac 地址

如果交换机在 Mac 地址表中找不到指定的 Mac 地址,这可能是因为具有该地址的设备还没有向交换机发送过包,或者这个设备 (主机) 已经离线,导致其地址被删除了。

这种情况下,交换机无法判断应该把包转发到哪个端口,只能将包转发到除了源端口之外的所有端口上 (类似广播),这样无论该设备连接在哪个端口上都能收到这个包 (当然,除了该设备外,其他设备收到包之后会直接丢弃)。

广播

如果接收方 Mac 地址是一个广播地址,那么交换机会将包发送到除源端口之外的其他所有端口 (这里的端口指的是交换机上的 “网线接口”)。

Mac 广播地址: FF:FF:FF:FF:FF:FF

IP 广播地址: 255.255.255.255

如图所示,设备 1 发送了一个广播消息,然后被交换机转发到了设备 2 和设备 3。

交换机广播示例


三层交换机

L3 (三层) 交换机是一种在 L2 (二层) 交换机的基础上增加了路由选择功能的网络硬件,能够基于硬件实现网络功能和转发分组。

L2 交换机可以通过使用 VLAN 分割广播域,但主机之间的包交换必须位于同一 VLAN 范围内,对位于不同 VLAN 上的主机进行通信时,则必须使用路由功能,因此需要在网络上添加额外的路由器。

图片来源: 图解网络硬件(三轮贤一)

L3 交换机无需其他路由器,自身就可以直接完成 VLAN 配置、不同 VLAN 之间的通信。

图片来源: 图解网络硬件(三轮贤一)

现代化的基础设施架构方案中,越来越多组织的内部网络核心交换机采用 L3 交换机。

交换机 VS 集线器

全双工模式

全双工模式是交换机特有的工作模式,它可以同时进行发送和接收操作,集线器不支持。

使用集线器时,如果多台计算机同时发送信号,信号就会在集线器内部混杂在一起,进而无法使用,这种现象称为碰撞,是以太网的一个重要特征。

转发

交换机只将包转发到具有特定 Mac 地址的主机所连接 (对应) 的端口,其他无关端口都是空闲的,这些空闲的端口可以传输其他的包,因此交换机可以同时转发多个包。

集线器会将输入的信号广播到所有的端口,如果同时输入多个信号就会发生碰撞,无法同时传输多路信号,因此从设备整体的转发能力来看,交换机要高于集线器。


FDB

转发表(Forwarding Information Base,FIB)存储了路由器或交换机用于转发数据包的路由信息,用于指导网络设备对数据包进行转发和路由选择,表中的每个条目包含目标网络地址、下一跳地址(或出接口)以及其他相关信息。

网路邻接表 表示网络设备上的邻居关系列表,存储了网络设备直接相连的其他设备的信息,如 Mac 地址、IP 地址等,主要用于维护设备之间的直接通信关系,以便进行数据包的交换和转发。

图片来源: 图解网络硬件(三轮贤一)

# 转发信息库示例

Destination       Next Hop          Interface
0.0.0.0/0         192.168.1.1       Ethernet0
192.168.1.0/24    0.0.0.0           Ethernet1
10.0.0.0/8        192.168.1.2       Ethernet2

所有目标 IP 为 0.0.0.0/0 的数据包,都会被转发到下一跳路由地址 192.168.1.1 (也可以称为网关)。

# 邻接表示例

Neighbor Device   Interface         Mac Address        IP Address
Router1           Ethernet0         00:1A:2B:3C:4D:5E  192.168.1.1
Switch1           Ethernet1         00:11:22:33:44:55  10.0.0.1
Host1             Ethernet2         00:AA:BB:CC:DD:EE  192.168.1.10

下一跳路由地址 192.168.1.1 的路由设备,对应的 Mac 地址为 00:1A:2B:3C:4D:5E。

L3 交换机将转发表和邻接表整合成一份表,FDB(Forwarding Database,转发数据库),注册于内存中并通过硬件处理完成高速检索。

下面是 L3 交换机的内部处理示例图。

图片来源: 图解网络硬件(三轮贤一)