Linux
ip-rule 不適用於大於 0x10 的 ToS
ip-rule
使用特定 IP ToS值會出現一些奇怪的行為。它僅適用於高達 0x10 的值,但不接受 DSCP 部分。我試過:
ip ru a tos 0x20 table 1234
並得到:
RTNETLINK answers: Invalid argument
TOS
在 RFC 791和 RFC 1349 中進一步定義,只有 4 個可能的位,如RFC 1349 的第 3 章所示:0 1 2 3 4 5 6 7 +-----+-----+-----+-----+-----+-----+-----+-----+ | | | | | PRECEDENCE | TOS | MBZ | | | | | +-----+-----+-----+-----+-----+-----+-----+-----+
和 4:
1000 -- minimize delay 0100 -- maximize throughput 0010 -- maximize reliability 0001 -- minimize monetary cost 0000 -- normal service
由於 MBZ(必須為零)位被保留並且優先級(據稱?)從未真正使用過,因此只有 0x00 和 0x1E 之間的偶數值可能。Linux在 ip.h 中定義了這一點:
#define IPTOS_TOS_MASK 0x1E #define IPTOS_TOS(tos) ((tos)&IPTOS_TOS_MASK) #define IPTOS_LOWDELAY 0x10 #define IPTOS_THROUGHPUT 0x08 #define IPTOS_RELIABILITY 0x04 #define IPTOS_MINCOST 0x02
和
ip rule
(的核心部分)只是遵循這些定義來說明允許的內容。現在,如果您想使用
DSCP
RFC 2474中定義的替代機制來替換TOS
相同字節的視圖(以及ECN
RFC 3168中),似乎不存在直接等效的 usingip rule
.您仍然可以做的是使用iptables或nftables來匹配
dscp
欄位值,然後標記數據包並使用 in 重用它fwmark
。ip rule