3. MAC 发送短帧(runt frame)处理验证

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,说明填充逻辑有误。

处理流程

构造帧 50B 长度 < 64 ? (runt 判定) 是 drop: 丢弃 是 pad: 填充至 64B 否 直接发送

说明

本模型聚焦长度判定与填充/丢弃决策,未实现真实 FCS 计算与物理层发送;FCS_LEN 仅用于标注帧长口径。若需覆盖含 FCS 的判定,可将比较阈值改为 MIN_FRAME - FCS_LEN 并相应调整填充目标。