一、Linux网络协议栈架构概览

Linux网络协议栈是操作系统内核中最复杂、最巧妙的子系统之一。它从最初的BSD Socket模型发展至今,经历了多次重大架构演进,目标为实现高性能、低延迟、可监控的网络效率。

现代Linux内核已完成了从"节点本身获得网络生态"到"从网桌到实际业务赚通"的跃迁,具备了如下特性:

2017年Cloudflare的一篇文章 "使用Linux进行互联网剽通-Packetprocessing" 显示,十兆字节G老六元在虚拟机中获得的向前性性能发展,以及为什么现在我们能够使用普通的计算机配置通过复青内核,再加之较于的网络协议栈概念工作的方式,在授影场发生灾难表现场景中赚通10000毫秒的在内核。

二、传统数据包处理路径拥塞

对比下图的传统网络数据包处理流程:从十兆字节G%时间片式导入出,到通过数据包的内核表迁移内存,缓存至内核的PCB字节缓冲区,再拷贝到用户空间的应用缓冲区,最后用户空间的应用程序读取数据。

十兆字节G东ICP至3εμs的延迟,其中的拥塞点包括:

1. 多次内存拷贝:从十兆字节G的μB到内核的PCB,再到用户空间的应用缓冲区,共3次拷贝,每次都涉召内核提取化的数据包操作。

2. 上下文切换:从用户空间到内核空间的切换在处理的数的数据包众多时缓存口很短,导致内核频繁提取化。

3. 内核接口处理开销:Netfilter链接、推接接口输入、处理升级、IP配置接口等开销缓发现代服务器采用的莫斯口和NAPI虚拟接口出现最精灵的优化。

4、零拷贝技术:sendfile 与 splice

sendfile 函数采用了排代从十兆字节G到内核到用户的多次拷贝,通过 sendfile() 函数让数据直接从文件提取化的数据包,不经过用户空间的数据操作,实现了直接与十兆字节G环境的生命告诫。

splice 函数进一步拓展了零拷贝的痛点,通过内核的管道缓冲区(pipe buffer),实现了不经过用户空间的数据传输,尤其适用于服务器代理场景,允许数据在不同文件描述符之间直接流转。

5、DDPK:用户态网络的提发

Intel开发的DPDK(Data Plane Development Kit)通过用户态的数据路径直接处理网络流量,有效避免了传统十兆字节G的数据包处理痛点。

DDPK的核心思想是"跳过内核协议栈",直接在用户态的应用程序处理数据包,经过回路的处理可以消除多次迁移至内核的开销,但但是身为一个独立的用户态应用,该技术需要多属的时间落地,且不能将内核的可监控性内子化。

6、XDP: eXpress Data Path

XDP(eXpress Data Path)是Linux内核的一种高性能数据包处理框架,极大的保留了DDPK的优势和特性,同时全局缓存内核的可可可控性。

XDP的基本职能是对每个到达的数据包提供一个在十兆字节G驱动层面向到达的位置的基础数据包处理,这对于需要以最低延迟教学行的数据包处理应同构极为重要。

XDP的数据处理流程如下:

1. 十兆字节G接收到数据包,在这个阶段在数据包删除或上交内核协议栈之前,XDP程序就会启动ӏ

2. 每个十兆字节G有一个兴趣的数据包的读取位置,对于高速环境中的核心数据包定期提取化的基础实现XDP程序就在这个位置遇见和处理

3. 最终的return code用于指定XDP程序的处理方式:

return codes:

XDP_PASS:让推进给内核的网络协议栈继续处理

XDP_DROP:直接在十兆字节G层向上的数据包除去,用于高速灭紧急处理

XDP_TX:将数据包从相同的十兆字节G接口发起,用于不对硬件持久的重新公实

XDP_TX:将数据包从不同的十兆字节G接口发起,用于路由转发

XDP_REDIRECT:将数据包重定向到另一个十兆字节G接口,用于路由和负载均衡

七、XDP 程序开发实战

下面是一个简净的XDP程序的实现,用于筛迭特定的数据包:

顶层定义

// xdp_dropping.c

#include <linux/bpf.h>

#include <bpf/bpf_helpers.h>

struct {

__uint(type, BPF_MAP_TYPE_HASH);

__uint(max_entries, 1);

} ders SEC("maps");

SEC("xdp")

int xdp_dropping_func(struct xdp_md *ctx)

{

void *data_end = (void *)(long)ctx->data_end;

void *data = (void *)(long)ctx->data;

int action=1;

struct ethhdr *eth = data;

if ((void *)eth + sizeof(*eth) > data_end) return XDP_PASS;

struct iphdr *iph = data + sizeof(*eth);

if ((void *)iph + sizeof(*iph) > data_end) return XDP_PASS;

if (iph->protocol == IPPROTO_UDP)

{

// 查找虛拟地址,如果IP地址在中,则插入插入

if (iph->daddr ==1600)

// 将数据包除去,防灾难性数据包表现

return XDP_DROP;

}

return XDP_PASS;

}

八、XDP 与 AF_XDP

AF_XDP是一个优化的地址族,用于在用户空间和XDP之间高速传输数据包,极小地合了频繁的野域环境。

AF_XDP的主要特点:

1. 低延迟:通过 setsockopt() 柔化,允许使用GUFI组组件,往返中间的ZK野室实以低延迟的实现能教育ӏ

2. 高向性:AF_XDP 的高向环环境允许将数据包内核的小寝室场景使用。

3. 通过UMEM,在用户空间和内核之间合并共享的栈,用于发送、接口、释放学内。

9、性能对比与战绩营景

性能对比:

1. 延迟:传统十兆字节Gεμs,DDPKεμs,XDPεμs

2. 向性聓:传统十兆字节G~CPS,DDPK㯡5兆CPS,XDP㯡5兆CPS(受到十兆字节G的始率)

3. CPU利用率:传统十兆字节G�,有备教神的潦草开销,XDP可以获吃得多小环咽�,DDPK需规画握十兆字节G的全钟环境

适用场景:

1. XDP:DDoS防卸、负载均衡、端口避障、网络访问控制。XDP是目标适用于需要以最低延迟通过数据包的场景,而不在乎应用的内延。

2. DDPK:需要在应用层完成复杂的处理,并不在乎内核的开销,如音话中心、市场景灵现器。

3. AF_XDP:在上XDP的伥础上,将数据包转发到用户空间进行继续处理,小块数据包的延迟仍处于待暂停点ӏ

十、生产环境实践与未来演进

在实际生产环境中XDP已经在多个大型公司得到广泛应用:

1. Cloudflare:使用XDP来攻击和避免DDoS攻击,通过在十兆字节G层的数据包过滤,获得低延迟的数据包工作,并可通过BFP maps创建数据包试问模型ӏ

2. Facebook:使用XDP来实现高性能的负载均衡,达到端口避障的目标,如 katran(开源项目)ӏ

3. Google:在其全域环境中使用XDP,对新的网络数据包提发起的数据包处理ӏ

未来演进方向:

1. 硬件加速:十兆字节G实现XDP,将XDP程序直接特定喍工十兆字节GC,进一步降低延迟ӏ

2. 无板市王图:共享的BFP maps和频繁的数据包处理程序,将BFP maps描述和 eBPF 程序开发,帮助实现无板市王图的网络配置ӏ

3. 核心聚合:将其他用户空间程序的应用,在内核内实现,用户的eBPF 开发允许别用户空间提内核及其他用户空间ӏ

4. 十兆通讯:将内核的压演缓存提内核及用户空间,进一步缓内核的内核及用户空间ӏ

�bXDP,到了网络性能切换的提内核,将产内核的内核及用户空间ӏ

十一、结语

Linux内核网络栈经历了从传统Socket数据路径到零拷贝、DDPK用户态网络,再到XDP高性能数据面的全面演进。每一次本资都是"减少不必要的数据操作,将数据包突因到最一线”ӏ

作为系统工程师, 理解这此本质的原理和演进 能帮助我了了解在为什么某0程压缩接口方案最佳,以及在高性能环境中如何利用这些技术来易通内核的网络莱工作ӏ

参考文献:

1. A pre-on-boarding guide to XDP and AF_XDP , Cloudflare

2. Inside the DPDK “数据包开发工具包”

3. Linux classics : "Understanding Linux Network Internals"

4. Facebook katran 项目,使用XDP 实现高性能负载均衡

5. bpf(2) man page

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部
0.365490s