3. MAC 发送短帧(runt frame)处理验证
任务说明
以太网 MAC 发送路径对短帧(runt frame,长度 < 64 字节)有两种合规处理:丢弃,或填充至 64 字节最小帧长。本案例构造一个 46 字节的 runt 帧,通过一个可配置的 MAC 发送模型分别验证两种策略,并给出判定标准。
环境与依赖
- Python 3.8+,仅用标准库,无需第三方包。
- 文件:
mac_tx_runt.py,直接运行。
核心实现
MIN_FRAME = 64 # 以太网最小帧长(不含前导码/SFD)
FCS_LEN = 4 # 帧校验序列长度
PAD_BYTE = 0x00
def build_frame(dst, src, ethertype, payload):
"""按 目的MAC|源MAC|类型|载荷 组装帧,返回字节串。"""
return dst + src + ethertype.to_bytes(2, "big") + payload
def mac_tx(frame, policy):
"""
MAC 发送路径模型。
policy="drop" : 长度 < 64 直接丢弃,返回 None
policy="pad" : 长度 < 64 填充 0x00 至 64 字节后发送
返回 (sent_frame, action) 或 (None, "dropped")
"""
if len(frame) < MIN_FRAME:
if policy == "drop":
return None, "dropped"
pad = MIN_FRAME - len(frame)
return frame + bytes([PAD_BYTE]) * pad, "padded"
return frame, "sent"
def check(frame, policy):
out, action = mac_tx(frame, policy)
if out is None:
print(f"[{policy}] 丢弃 runt 帧, 原长={len(frame)}")
return
print(f"[{policy}] {action}, 原长={len(frame)} -> 发送长={len(out)}")
assert len(out) >= MIN_FRAME, "发送帧仍小于最小帧长"
if __name__ == "__main__":
dst = bytes.fromhex("001122334455")
src = bytes.fromhex("aabbccddeeff")
# 载荷 36 字节 -> 帧总长 6+6+2+36 = 50 字节 (< 64)
payload = bytes(range(36))
frame = build_frame(dst, src, 0x0800, payload)
print("构造帧长度:", len(frame))
check(frame, "drop")
check(frame, "pad")
运行与验证
python3 mac_tx_runt.py
判定标准:
drop策略输出丢弃 runt 帧, 原长=50,不产生发送帧。pad策略输出padded, 原长=50 -> 发送长=64,且断言通过(发送帧 ≥ 64 字节)。- 若断言失败或发送长度仍 < 64,说明填充逻辑有误。
处理流程
说明
本模型聚焦长度判定与填充/丢弃决策,未实现真实 FCS 计算与物理层发送;FCS_LEN 仅用于标注帧长口径。若需覆盖含 FCS 的判定,可将比较阈值改为 MIN_FRAME - FCS_LEN 并相应调整填充目标。