|
11 | 11 | </image> |
12 | 12 | <generator>Hugo -- 0.152.2</generator> |
13 | 13 | <language>en</language> |
14 | | - <lastBuildDate>Wed, 29 Oct 2025 00:00:00 +0000</lastBuildDate> |
| 14 | + <lastBuildDate>Thu, 23 Oct 2025 00:00:00 +0000</lastBuildDate> |
15 | 15 | <atom:link href="https://kerolt.github.io/categories/ebpf/index.xml" rel="self" type="application/rss+xml" /> |
16 | | - <item> |
17 | | - <title>TC和XDP</title> |
18 | | - <link>https://kerolt.github.io/posts/ebpf/tc%E5%92%8Cxdp/</link> |
19 | | - <pubDate>Wed, 29 Oct 2025 00:00:00 +0000</pubDate> |
20 | | - <guid>https://kerolt.github.io/posts/ebpf/tc%E5%92%8Cxdp/</guid> |
21 | | - <description><p><strong><code>tc</code></strong> 和 <strong><code>XDP</code></strong> 都能对网络数据包进行处理,但它们位于 <strong>不同的网络协议栈层次</strong>,因此性能、能力和适用场景差别都很大:</p> |
22 | | -<table> |
23 | | - <thead> |
24 | | - <tr> |
25 | | - <th>项目</th> |
26 | | - <th>作用层级</th> |
27 | | - <th>处理方向</th> |
28 | | - <th>特点</th> |
29 | | - </tr> |
30 | | - </thead> |
31 | | - <tbody> |
32 | | - <tr> |
33 | | - <td><strong>XDP (eXpress Data Path)</strong></td> |
34 | | - <td><strong>驱动层(最早)</strong>:网络设备驱动入口处(L2 之前)</td> |
35 | | - <td>入站(Ingress)</td> |
36 | | - <td>极快,绕过内核协议栈,可直接丢包/转发</td> |
37 | | - </tr> |
38 | | - <tr> |
39 | | - <td><strong>tc (Traffic Control)</strong></td> |
40 | | - <td><strong>内核网络栈层(L3/L4 之后)</strong></td> |
41 | | - <td>入站 + 出站</td> |
42 | | - <td>通常用于带宽控制、QoS、流量整形等</td> |
43 | | - </tr> |
44 | | - </tbody> |
45 | | -</table> |
46 | | -<h2 id="linux-网络包处理路径">Linux 网络包处理路径</h2> |
47 | | -<p>下面这张图能清晰地看到 <code>XDP</code> 和 <code>tc</code> 各自处在什么位置:</p> |
48 | | -<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span> +----------------------------------------+ |
49 | | -</span></span><span style="display:flex;"><span> | 用户空间 | |
50 | | -</span></span><span style="display:flex;"><span> | (应用层: Nginx, curl, ping, etc.) | |
51 | | -</span></span><span style="display:flex;"><span> +----------------------------------------+ |
52 | | -</span></span><span style="display:flex;"><span> ▲ |
53 | | -</span></span><span style="display:flex;"><span> │ send()/recv() |
54 | | -</span></span><span style="display:flex;"><span> │ |
55 | | -</span></span><span style="display:flex;"><span> +----------------------------------------+ |
56 | | -</span></span><span style="display:flex;"><span> | 内核网络协议栈 | |
57 | | -</span></span><span style="display:flex;"><span> |----------------------------------------| |
58 | | -</span></span><span style="display:flex;"><span> | L4 (TCP/UDP) | |
59 | | -</span></span><span style="display:flex;"><span> | L3 (IP 路由转发) | |
60 | | -</span></span><span style="display:flex;"><span> | L2 (Ethernet frame 处理) | |
61 | | -</span></span><span style="display:flex;"><span> +----------------------------------------+ |
62 | | -</span></span><span style="display:flex;"><span> ▲ ▲ |
63 | | -</span></span><span style="display:flex;"><span> │ │ |
64 | | -</span></span><span style="display:flex;"><span> tc ingress/qdisc tc egress/qdisc |
65 | | -</span></span><span style="display:flex;"><span> │ │ |
66 | | -</span></span><span style="display:flex;"><span> │ ▼ |
67 | | -</span></span><span style="display:flex;"><span> +----------------------------------------+ |
68 | | -</span></span><span style="display:flex;"><span> | XDP (eXpress Data Path) | |
69 | | -</span></span><span style="display:flex;"><span> | (位于网卡驱动中,最靠近硬件的钩子点) | |
70 | | -</span></span><span style="display:flex;"><span> +----------------------------------------+ |
71 | | -</span></span><span style="display:flex;"><span> ▲ |
72 | | -</span></span><span style="display:flex;"><span> │ |
73 | | -</span></span><span style="display:flex;"><span> NIC 驱动 / DMA 收包 |
74 | | -</span></span></code></pre></div><hr> |
75 | | -<h2 id="处理路径细节对比">处理路径细节对比</h2> |
76 | | -<table> |
77 | | - <thead> |
78 | | - <tr> |
79 | | - <th>对比项</th> |
80 | | - <th><strong>XDP</strong></th> |
81 | | - <th><strong>tc (ingress/egress)</strong></th> |
82 | | - </tr> |
83 | | - </thead> |
84 | | - <tbody> |
85 | | - <tr> |
86 | | - <td><strong>所在层级</strong></td> |
87 | | - <td>NIC 驱动层(比内核协议栈还早)</td> |
88 | | - <td>内核网络栈(L3/L4 层之间)</td> |
89 | | - </tr> |
90 | | - <tr> |
91 | | - <td><strong>钩子位置</strong></td> |
92 | | - <td>驱动接收包 → DMA → XDP</td> |
93 | | - <td>skb(socket buffer)进入或离开协议栈时</td> |
94 | | - </tr> |
95 | | - <tr> |
96 | | - <td><strong>作用方向</strong></td> |
97 | | - <td>仅支持 ingress(入站)</td> |
98 | | - <td>支持 ingress + egress</td> |
99 | | - </tr> |
100 | | - <tr> |
101 | | - <td><strong>处理对象</strong></td> |
102 | | - <td>原始数据包(frame)</td> |
103 | | - <td>封装后的 skb</td> |
104 | | - </tr> |
105 | | - <tr> |
106 | | - <td><strong>性能</strong></td> |
107 | | - <td>极高(可在百万 pps 级别)</td> |
108 | | - <td>中等(受内核调度和 qdisc 影响)</td> |
109 | | - </tr> |
110 | | - <tr> |
111 | | - <td><strong>典型用途</strong></td> |
112 | | - <td>DDoS 防护、早期丢包、快速转发、内核旁路</td> |
113 | | - <td>QoS、流量整形、限速、包分类</td> |
114 | | - </tr> |
115 | | - <tr> |
116 | | - <td><strong>可编程性</strong></td> |
117 | | - <td>eBPF 程序(xdp 程序)</td> |
118 | | - <td>eBPF 程序(cls_bpf)</td> |
119 | | - </tr> |
120 | | - <tr> |
121 | | - <td><strong>返回动作</strong></td> |
122 | | - <td>XDP_PASS、XDP_DROP、XDP_TX、XDP_REDIRECT</td> |
123 | | - <td>TC_ACT_OK、TC_ACT_SHOT、TC_ACT_REDIRECT</td> |
124 | | - </tr> |
125 | | - <tr> |
126 | | - <td><strong>使用接口</strong></td> |
127 | | - <td><code>ip link set dev eth0 xdp obj prog.o</code></td> |
128 | | - <td><code>tc filter add dev eth0 ... bpf obj prog.o</code></td> |
129 | | - </tr> |
130 | | - </tbody> |
131 | | -</table> |
132 | | -<h2 id="数据处理流程举例">数据处理流程举例</h2> |
133 | | -<h3 id="xdp-流程最早阶段">XDP 流程(最早阶段)</h3> |
134 | | -<div class="highlight"><pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>[网卡接收包] |
135 | | -</span></span><span style="display:flex;"><span> ↓ |
136 | | -</span></span><span style="display:flex;"><span>[XDP 程序执行] |
137 | | -</span></span><span style="display:flex;"><span> ├── XDP_DROP:直接丢包(不进入内核) |
138 | | -</span></span><span style="display:flex;"><span> ├── XDP_PASS:让包进入内核协议栈 |
139 | | -</span></span><span style="display:flex;"><span> ├── XDP_TX:直接从驱动回发 |
140 | | -</span></span><span style="display:flex;"><span> └── XDP_REDIRECT:转发到其他网卡或 AF_XDP socket |
141 | | -</span></span></code></pre></div><p><strong>典型用途:</strong></p></description> |
142 | | - </item> |
143 | 16 | <item> |
144 | 17 | <title>eBPF中何时使用字节序转换函数</title> |
145 | 18 | <link>https://kerolt.github.io/posts/ebpf/ebpf%E4%B8%AD%E4%BD%95%E6%97%B6%E4%BD%BF%E7%94%A8%E5%AD%97%E8%8A%82%E5%BA%8F%E8%BD%AC%E6%8D%A2%E5%87%BD%E6%95%B0/</link> |
|
0 commit comments