MAC学习-基础知识002 pause报文格式

本文详细介绍了IEEE802.3协议中的Pause报文,这是一种用于控制MAC层数据流量的机制。当接收端数据处理能力达到上限时,通过发送Pause报文通知发送端暂停数据传输,避免数据溢出或丢失。文章深入解析了Pause报文的格式及各字段含义,包括目的MAC地址、源MAC地址、类型字段、操作码、停止时间等。

MAC学习-基础知识002 pause报文格式

1、什么是pause报文?

Pause报文是IEEE802.3协议中描述的一种用于控制MAC数据流量的报文。当对端数据量过大,将无法及时处理数据时,会向数据上游MAC发送Puase报文,告诉上游MAC在一段时间内停止发送数据,停止时间记录在报文的PAUSE_TIMING字段。当上游MAC接受到对端的有效Puase报文时,会开始计时,并会停止发送数据,防止对端无法及时处理数据,导致对端FIFO溢出或者数据丢失。若计时结束,并且没有收到新的pause报文,将重新发送数据。若计时没有结束,且新收到的pause报文PAUSE_TIMING字段为全0,则表示可以重新发送数据,此时停止计时,重新开始发送数据。

2pause报文格式

字段

字节

说明

数值

DA

6

目的MAC地址

0x180c2000001

SA

6

源MAC地址

-----

TYPE

2

类型

0x8808

OPCODE

2

操作码

0x0001

PAUSE_TIMING

2

MAC停止发送数据时间,单位为512bit传输时间

-----

PAD

42

填充字段

全0

FCS

4

帧校验字段,通常为CRC

------

Pause报文由IEEE802.3协议规定,与标准以太帧格式相似:

DA表示目的地址,地址数据固定为0x180c2000001

SA表示源地址 地址由发送方确定

TYPE为报文类型字段,固定为0X8808

OPCODE为操作码,固定为0X0001

PAUSE_TIMING字段为上游MAC停止发送数据的时间,每单位为512bit传输时间,数值为16’d1024表示暂停时间为MAC传输1024*512bit数据所需要的时间

PAD:为填充字段,所有值为0

FCS: 为校验字段,通常为CRC校验值

 

PAUSE报文帧格式与标准以太帧格式相似,可互相参考(https://blog.youkuaiyun.com/icxiaoge/article/details/83420269)

### PFC Pause 帧的消息格式 优先流量控制 (Priority Flow Control, PFC) 是一种用于减少网络中丢包的技术,在以太网环境中通过发送Pause帧来实现。PFC允许基于IEEE 802.1Qbb标准的设备仅暂停特定优先级的数据传输,而不是整个端口上的所有流量。 #### IEEE 802.3 暂停帧结构 PFC Pause帧遵循IEEE 802.3定义的标准Ethernet II帧格式: | 字段 | 长度(字节) | 描述 | | --- | ------------ | ---- | | 目标MAC地址 | 6 | 广播或多播MAC地址,通常为`01:80:C2:00:00:01`表示LLDP/Pause多播组 | | 源MAC地址 | 6 | 发送方的硬件地址 | | 类型 | 2 | 表明这是一个EtherType类型的帧,对于Pause帧来说总是`0x8808` | | Opcode | 2 | 操作码字段,对于Pause帧固定设置为`0x0001` | | Time | 2 | 定义接收者应停止转发的时间量,单位是512比特时间。最大值可以达到约65秒。| | Padding | 可变长度 | 如果存在,则填充至最小帧大小 | 当启用PFC时,Time字段会被扩展成两个独立的部分,分别对应不同的优先级队列: - **Priority Enable Vector**: 占用第一个字节中的高四位,用来指示哪些优先级被启用了PFC功能。 - **Quanta for each priority queue**: 后续的一个或多个两字节字段,指定各个已启用优先级对应的暂停时间段。 这种设计使得可以在不影响其他低优先级业务的情况下精确地管理高优先级流的行为[^1]。 ```python def create_pfc_pause_frame(source_mac, priorities_enabled, times): """ 创建一个带有给定参数的PFC Pause帧 :param source_mac: 发送者的源MAC地址字符串形式 'xx:xx:xx:xx:xx:xx' :param priorities_enabled: 已启用PFC的一系列整数列表 [0..7] :param times: 对应于每个已启用优先级的时间间隔列表 (如果某个优先级未启用则忽略) 返回构建好的二进制数据作为字节数组 """ import struct dest_mac = bytes.fromhex('0180C2000001'.replace(':', '')) # LLDP/Pause Multicast Group Address src_mac_bytes = bytes.fromhex(source_mac.replace(':', '')) ethertype = b'\x88\x08' # EtherType value for PAUSE frames opcode = b'\x00\x01' # Always set to this value for PAUSE pfc_vector = sum((1 << i) for i in priorities_enabled[:4]) & 0xF0 time_fields = [] for idx, t in enumerate(times): if idx >= len(priorities_enabled): break # Only process enabled priorities quantums = int(t / 512).to_bytes(2, byteorder='little') time_fields.append(quantums) padding_length = max(0, 60 - (len(dest_mac)+len(src_mac_bytes)+len(ethertype)+len(opcode)+1+len(time_fields)*2)) padding = bytearray([0]*padding_length) return ( dest_mac + src_mac_bytes + ethertype + opcode + struct.pack('!B', pfc_vector) + b''.join(time_fields) + padding ) ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值