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

推荐订阅源

F
Fortinet All Blogs
美团技术团队
T
Tenable Blog
大猫的无限游戏
大猫的无限游戏
Schneier on Security
Schneier on Security
S
Schneier on Security
博客园_首页
C
Cyber Attacks, Cyber Crime and Cyber Security
I
Intezer
T
Tailwind CSS Blog
GbyAI
GbyAI
C
CERT Recently Published Vulnerability Notes
博客园 - 【当耐特】
IT之家
IT之家
G
Google Developers Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
P
Privacy International News Feed
Vercel News
Vercel News
Cyberwarzone
Cyberwarzone
N
News and Events Feed by Topic
Application and Cybersecurity Blog
Application and Cybersecurity Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
The Register - Security
The Register - Security
人人都是产品经理
人人都是产品经理
Cisco Talos Blog
Cisco Talos Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Project Zero
Project Zero
V
V2EX
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
月光博客
月光博客
Hacker News - Newest:
Hacker News - Newest: "LLM"
WordPress大学
WordPress大学
L
LangChain Blog
阮一峰的网络日志
阮一峰的网络日志
MongoDB | Blog
MongoDB | Blog
F
Full Disclosure
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
N
News and Events Feed by Topic
G
GRAHAM CLULEY
H
Hacker News: Front Page
Forbes - Security
Forbes - Security
H
Heimdal Security Blog
L
LINUX DO - 最新话题
L
Lohrmann on Cybersecurity
Apple Machine Learning Research
Apple Machine Learning Research
Help Net Security
Help Net Security
C
Cybersecurity and Infrastructure Security Agency CISA
Recent Announcements
Recent Announcements
C
Cisco Blogs
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 核心概念
网络基础: 交换机和路由器的区别
2018-01-25 · via 蛮荆

网络基础: 交换机和路由器的区别

2018-01-25 计算机网络

  • 前言
  • 工作层次
    • 交换机
    • 路由器
  • 转发依据
  • 转发表的维护方式
  • 转发规则
  • 端口和 Mac 地址
  • 附录
    • 三层交换机与路由器的比较
  • 扩展阅读

前言

本文中提到的交换机指的是 “二层交换机”,路由器指的是 “三层路由器”,三层交换机 (或者带有路由功能的交换设备等) 不在本文讨论范围内。

工作层次

  • 交换机主要工作在数据链路层,主要用于组建局域网
  • 路由器工作在网络层,主要用于将交换机组建的局域网相互连接起来,或者接入互联网

有个很形象的比喻:

交换机是小区看门大爷,路由器是快递小哥。

交换机

交换机是基于以太网设计的,实现了特定网络内的 数据帧 转发。

路由器

路由器是基于 IP 设计的,实现了不同网络之间的 数据包 转发。

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

路由器在转发网络包时,需要在前面加上 Mac 头部 (将 IP 报文包装进二层数据帧),委托数据链路层去传输数据 (传输到下一个路由器)。

创建 Mac 报文头部时,从路由表中查找出下一个路由器的 IP 地址,并通过 ARP 查询出对应的 Mac 地址,然后将 Mac 地址写入 Mac 报文头部中,表示 IP 对以太网的委托只是将包传输到下一个路由器就行了。

当包到达下一个路由器后,下一个路由器又会重新委托以太网将包传输到再下一个路由器,以此类推,包最终到达 IP 目标地址。


转发依据

  • 交换机转发所依据的对象是 Mac 地址
  • 路由转发所依据的对象是 IP 地址

Mac 地址通常是硬件实现的,由网卡生产商来分配,一般情况下不可修改。

IP 地址是在软件中实现的,描述的是设备所在的网络,通常由网络管理员或系统自动分配。

转发表的维护方式

  • 交换机维护 Mac 表
  • 路由器维护路由表

交换机对 Mac 地址表的维护是数据包转发操作中的一个 (顺带的) 步骤。

路由器对路由表的维护和数据包的转发操作相互独立的,也就是说,在转发数据包的过程中不需要对路由表的内容进行维护。

对路由表进行维护的方法有几种,大体上可分为以下两类。

  1. 由人手动维护路由记录
  2. 根据路由协议机制,通过路由器之间的信息交换,由路由器自行维护路由表的记录

转发规则

  • 交换机在地址表中只匹配完全一致的记录
  • 路由器只匹配网络号部分,忽略主机号部分
  • 交换机不会校验包中的目标 Mac 地址,全部收下做转发
  • 路由器会校验包中的目标 Mac 地址是不是自己,如果是的话存入内存缓冲区,否则丢弃
  • 交换机匹配不到时广播消息
  • 路由器匹配不到时丢弃消息

如果交换机在 Mac 地址表里找不到转发端口时,会选择广播。

如果路由器在路由表中无法找到匹配的记录,会丢弃这个包,并通过 ICMP 消息 (Destination Unreachable) 告知发送方。

两者的处理机制完全不同,原因在于网络规模的大小。

交换机连接的网络最多也就是几千台设备的规模,这个规模并不大。如果只有几千台设备,遇到不知道应该转发到哪里的包,交换机可以将包发送到所有的端口上,虽然这个方法很简单粗暴,但不会引发什么问题。

然而,路由器工作的网络环境就是互联网,它的规模是远远大于以太网的,全世界所有的设备都连接在互联网上,在如此庞大的网络中,如果将不知道应该转发到哪里的包发送到整个网络上,那就会产生大量的网络包,造成网络拥塞。因此,路由器遇到不知道该转发到哪里的包,就会直接丢弃。

端口和 Mac 地址

交换机只是将数据包转发到正确的端口,它自己并不会成为数据包的 (源) 发送方、(目标) 接收方。

路由器的各个端口都具有 Mac 地址和 IP 地址,因此能够成为数据链路层/以太网的发送方和接收方。从这个意义上来说,它和计算机的网卡是一样的。当转发数据包时,首先路由器端口会接收发给自己的以太网包,然后查询转发目标,再由相应的端口作为发送方将以太网包发送出去。


附录

前文中提到了交换机和路由器的几个区别,那么两者之间有哪些相同点呢?

路由器和交换机不考虑请求包和响应包之间的关联,而是将它们作为独立的包来对待,因此请求和响应有可能通过不同的路由来传输,具体走哪条路由,是由路由器的路由表和交换机的地址表中的配置来决定的。

服务器向客户端返回的响应消息 和 客户端向服务器发送的请求消息 不一定通过相同的路由传输。

三层交换机与路由器的比较

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

传统路由器的路由选择功能、分组转发以及管理功能等均由 CP U处理,管理功能负载的增加,就会带来分组转发能力的下降。

L3 交换机改善了这一缺点,将硬件设备内部分离成两个区域,即以路由选择、管理功能为主的控制平面,和以数据转发功能为主的数据平面,从而实现了能够高速转发分组的系统架构。

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

扩展阅读