以太网交换机在转发帧之前,可以使用缓冲技术存储帧。当目的端口由于拥塞而繁忙时,也可以使用缓冲,交换机将一直存储帧,直到可以传送该帧。
1.基于端口的内存缓冲
在基于端口的内存缓冲中,帧存储在链接到特定输入/输出端口的队列中。一个帧只有在队列中位于它前面的所有帧都成功传送之后才会传送到外发端口。由于目标端口处于繁忙状态,可能会导致所有帧的传输都被延迟。
2.共享内存缓冲
共享内存缓冲将所有帧都放入交换机上所有端口共享的公共内存缓冲区中。交换机动态分配各个端口所需要的缓冲内存量。该端口会动态分配所需的缓冲RAM空间。 目标端口与缓冲区中的帧之间存在着动态关联关系。 这样,数据包可以在一个端口上接收,同时在另一个端口上进行广播,而无需转移到其他队列中。 该交换机会保存一份关于帧与端口之间连接的映射信息,这些信息可以指示数据包应该被发送到哪里。 在成功传输了该帧数据之后,该地图链接就会被移除。
优点及缺点对比:
| 维度 | 基于端口的缓存 | 共享内存缓存 |
|---|---|---|
| 存储组织 | 每个入端口一组物理FIFO队列,帧固定存入本端口的队列 | 公共内存池,帧存入任意空闲单元 |
| 帧→队列关系 | 物理绑定:帧的存放位置由入端口决定,查表结果只写在描述符里 | 逻辑关联:帧通过描述符挂到“目的出端口(+优先级)”的逻辑队列链表上 |
| 分配方式 | 静态:端口缓存大小出厂即固定 | 动态:按需向池申请,用完归还 |
| 队头阻塞(HOL) | 存在:同一入端口的单一FIFO里,混排着去往不同出端口的帧——队首卡住,全队遭殃 | 消除:不同出端口的帧在不同逻辑队列里,各自排队,互不挡道 |
| 缓存利用率 | 低:忙端口爆满丢弃,闲端口空转浪费 | 高:闲端口资源自动让给忙端口 |
| 非对称交换(10M入→100M出) | 差:低速入端口的固定小缓存瞬间积压丢帧 | 好:帧可临时占用池中较大空间,等出口排空 |
| 缓存上限 | 单个端口的缓存容量 | 整个缓冲池的容量 |
| 端口间公平性 | 天然隔离,一端口异常不波及他人 | 无天然隔离,单端口可吃光整池→需动态阈值(DT)兜底 |
| 硬件复杂度 | 简单,逻辑直观 | 复杂:描述符/链表管理、空闲单元分配、阈值机制 |
“为什么现代交换机普遍采用共享缓存而不是基于端口的缓存?”
“两种方案的报文进来时都是先查表、后入队,出端口信息在入队时已经已知。区别在存储组织:基于端口的缓存把帧锁进入端口的物理FIFO,去往不同出端口的帧混排在一条队里,队首阻塞拖累全队,且静态划分导致忙端口丢包、闲端口浪费;共享内存把帧挂到按目的出端口组织的逻辑队列上,消除了队头阻塞,动态分配让利用率和非对称交换能力都大幅提升。代价是失去了端口间隔离,单端口可能吃光整池,所以要用动态阈值机制限制单队列上限,随活跃队列数动态调整。”