SQM队列管理
SQM队列管理

SQM队列管理


在 OpenWrt 软路由中使用 SQM(Smart Queue Management,智能队列管理)时,选择合适的规则(即队列调度算法和脚本)取决于你的网络需求和使用场景。SQM 的主要目标是减少缓冲区膨胀(bufferbloat),优化延迟和带宽分配。以下是常见的规则推荐及适用场景分析:

常用队列调度算法(Queue Discipline)

1. fq_codel(Fair Queuing Controlled Delay) 
    fq_codel(公平排队受控延迟)
   
    - 特点:这是 SQM 的默认算法,结合了公平队列(FQ)和控制延迟(CoDel)技术,能够有效减少延迟并公平分配带宽。
       
    - 优点:配置简单,对大多数家庭网络足够,适用于带宽较低或中等(比如 100Mbps 以下)的场景。
       
    - 缺点:在高带宽或复杂流量(如多用户、多任务)场景下,可能不够精细。
       
2. cake(Common Applications Kept Enhanced) 
    cake(常见应用不断增强)
   
    - 特点:cake 是 fq_codel 的升级版,集成了更多功能,比如更好的带宽整形、差分服务(DiffServ)支持和更强的抗缓冲区膨胀能力。
       
    - 优点:适合现代高速网络(比如 100Mbps 以上甚至千兆网络),能更智能地处理复杂流量,提供更低的延迟和更高的公平性。
       
    - 缺点:对硬件性能要求稍高,可能需要更仔细的参数调整。
       

常用脚本(Queue Setup Script)

1. piece_of_cake.qos
   
    - 特点:最简单的 SQM 脚本,通常搭配 cake 或 fq_codel 使用,专注于基本的带宽整形和延迟控制。
       
    - 推荐场景:适合单用户或简单家庭网络,配置几乎无需调整,填入上下行带宽即可。
       
    - 建议:如果你是初学者或网络需求不复杂,这是最佳起点。
       
2. layer_cake.qos
   
    - 特点:更高级的脚本,支持基于 DSCP(差分服务代码点)的流量优先级分类,能区分不同类型的流量(如游戏、视频、下载等)。
       
    - 推荐场景:适合多用户或混合流量场景,比如家里有人玩游戏、看视频,同时还有大流量下载(BT/PT)。
       
    - 建议:如果你需要更细致的控制(比如优先保障游戏延迟),可以选择这个脚本,但需要了解 DSCP 配置。
       

如何选择“最好”的规则?

以下是根据常见场景的推荐:

- 简单家庭网络(带宽 < 100Mbps,无复杂需求):
   
    - 队列算法:fq_codel
       
    - 脚本:piece_of_cake.qos
       
    - 理由:配置简单,性能要求低,能有效控制延迟,适合大多数普通用户。
       
- 高速网络(带宽 ≥ 100Mbps,或千兆网络):
   
    - 队列算法:cake
       
    - 脚本:piece_of_cake.qos
       
    - 理由:cake 在高带宽下表现更优,能充分利用带宽,同时保持低延迟。
       
- 多用户或复杂流量(游戏 + 下载 + 流媒体):
   
    - 队列算法:cake
       
    - 脚本:layer_cake.qos
       
    - 理由:支持流量分类,能优先保障对延迟敏感的应用(如游戏、语音),同时限制大流量任务(如 BT 下载)的干扰。
       

配置建议

1. 带宽设置:
   
    - 在 SQM 的“Basic Settings”中,下载和上传速度建议设置为实际带宽的 80%-95%。比如,100Mbps 下行就填 80,000-95,000 kbps,30Mbps 上行填 24,000-28,500 kbps。
       
    - 为什么要打折?避免超出实际带宽导致 SQM 失效。
       
2. 接口选择:
   
    - 通常选择 WAN 接口(比如 eth0 或 pppoe-wan,视你的网络类型而定)。
       
3. 链路层适配(Link Layer Adaptation):
   
    - 如果是 PPPoE 接入,选择“Ethernet with overhead”并设置适当的开销值(通常 8-44 字节,具体取决于 ISP)。
       
    - 如果是光纤直连,可以保持默认。
       

我的推荐

综合来看,cake + piece_of_cake.qos 是目前最通用的选择。它简单易用,同时在大多数场景下表现优异。如果你的软路由硬件性能较好(比如 x86 架构或高性能 ARM 设备),直接用这个组合几乎不会出错。若有特殊需求(如游戏优先),再考虑切换到 layer_cake.qos 并调整 DSCP 规则。

你可以用这个配置试试,然后根据实际体验(比如用 ping 测试延迟或跑速测试)微调。

用Wireshark分析数据包,并确定链路层适配值
用Wireshark 分析数据包,并确定链路层适配值

使用 Wireshark 查看实际数据包的头部大小需要抓取网络流量并分析数据包的结构。以下是具体步骤,帮助你在 PPPoE 接入场景下确认头部开销:

步骤 1:抓包准备

  1. 安装 Wireshark:

    • 在你的电脑上安装 Wireshark(官网:https: //www.wireshark.org/),或者如果你的 OpenWrt 软路由支持,可以直接在路由器上安装(需要安装 tcpdump 或 wireshark 包,但通常硬件性能有限,建议在电脑上操作)。
  2. 选择抓包接口:

    • 如果在电脑上抓包,连接到软路由的 LAN 口,确保流量经过路由器。
    • 打开 Wireshark,选择正确的网络接口(比如连接路由器的网卡,通常是 Ethernet 或 Wi-Fi 接口)。
    • 如果在路由器上抓包,SSH 登录路由器,使用 tcpdump 命令抓取 WAN 接口流量,例如:

      tcpdump -i eth1 -w capture.pcap
    • 通常在路由器的目录/root中,会生成capture.pcap。
      然后将 capture.pcap 文件传输到电脑,用 Wireshark 打开。

步骤 2:打开抓包文件

  1. 启动 Wireshark。

  2. 导入 pcap 文件:

    • 点击菜单栏的 File -> Open,选择你从路由器传输过来的 capture.pcap 文件。
    • 文件加载后,你会看到数据包列表。

步骤 3:查看数据包是否包含FCS(帧校 验序列),

展 开最上面的frame项,查看Protocols in frame子项。例如[Protocols in frame: eth:ethertype:pppoes:ppp:ip:tcp]则表明抓取的这个数据包中没有包含FCS。

步骤 4:分析数据包结构

  1. 展开链路层相关部分:

    • Wireshark 会按层级显示数据包内容,重点关注以下部分:
      • Ethernet II(以太网帧):
        • 展 开此层,查看:
          • Destination MAC(6 字节)
            目标 MAC(6 字节)
          • Source MAC(6 字节)
          • Type(2 字节,通常是 0x8864 表示 PPPoE)
          • 长度:固定 14 字节。
        • 检 查是否有 VLAN:
          • 如果 Type 是 0x8100(VLAN),会多出一个 4 字节的 VLAN Tag(包含优先级和 VLAN ID)。
      • PPPoE (Point-to-Point Protocol over Ethernet):

        • 展 开 Point-to-Point Protocol over Ethernet Session:
          • Version(1 字节)
            版本(1 字节)
          • Type(1 字节)
          • Code(1 字节,通常是 0x00 表示会话数据)
          • Session ID(2 字节)
            会话 ID(2 字节)
          • Length(2 字节)
          • 长度:固定 8 字节。
      • PPP (Point-to-Point Protocol):

        展开此层,通常是 2-4 字节(协议字段,如 0x0021 表示 IPv4)。
    • FCS (帧校验序列):
      • 以太网帧末尾的 4 字节校验字段,Wireshark 默认不显示,但实际存在。
  2. 计算链路层开销:

    链路层开销通常包括从物理层到数据链路层的头部,即 Ethernet II + PPPoE + PPP 的总和:

    • Ethernet II:14 bytes
    • PPPoE:6 bytes
    • PPP:2 bytes

    链路层开销 = 14 + 6 + 2 = 22 bytes


步骤 5:验证链路层开销值

验 证链路层开销值,可以用另一种方法:记录Frame的值(比如86);展开Internet Protocol Version 4,找到值Total Length记录数据(比如64);Frame-Internet Protocol Version 4=86-64=22



步骤 6:因为数据包中没有包含FCS(步 骤 2中的说明)。openwrt中的“单 个数据包开销(bytes)” 它指的是包含FCS呢还是不包含FCS呢?不确定的情况下,可以先试填22。如果值22的延迟偏高则改为22+4=26。

可 以SpeedTest测试网速,比 较22和26,哪个网络顺畅、延迟低则选哪个。

_____________________________________________________________________________________________________________________________________



实际操作步骤



1.


           Converted Image

2.

Openwrt安装tcpdump,运行命令 tcpdump -i eth1 -w capture.pcap 抓取PPPoE数据包:

           Converted Image

3.

将capture.pcap导入到Wireshark中分析:
 
           Converted Image


           Converted Image


           Converted Image

4.

根据 Ethernet II(14) + PPPoE(6) + PPP(2) = 22  字节
如 果加上FCS则为:Ethernet II(14) + PPPoE(6) + PPP(2) + FCS(4) = 26  字节


5.


           Converted Image

证计算 : "Frame" - "Internet Protocol Version 4" = 86 - 64 = 22 字 节
果加上FCS则为 :22 + FCS(4) = 26  字节

6.


OpenWrt系统中,SQM的链路层单个数据包开销值:


           Converted Image 



Converted Image