之前合集《计算机网络从入门到放弃》第一阶段算是已经完成了。都是理论,没有实操,让"程序猿"很难受,操作性不如 Modbus发送的报文何时等到应答和 tcp通信测试报告单1------connect和send。开始是想看linux内核网络协议栈的源码,然后编译调试,找了下流程,感觉不适合刚开始接触网络协议栈的初学者。受益于之前Modbus UDP开源库的想法,萌生了找一些开源网络协议栈来学习的想法。下面介绍几款开源的网络协议栈,希望最终可以不用linux系统的网络协议栈然后用"自己的网络协议栈"写出socket通讯。
一、几种开源网络框架对比
开源 Linux 高效网络协议栈通常用于优化网络性能,尤其是在高吞吐量和低延迟场景中,如数据中心、云计算、高频交易等领域。以下是一些常见的开源 Linux 高效网络协议栈和相关框架:
- DPDK(Data Plane Development Kit)
特点:
·高性能用户态网络框架,绕过内核网络协议栈,直接处理网卡上的数据包。
·提供零拷贝和高效内存管理。
·支持多核并行,常用于数据中心和网络功能虚拟化(NFV)应用。
应用场景:
·高性能网络转发(如 vSwitch)。
·流量分析、负载均衡、深度包检测等。
官网和资源:
·DPDK 官方网站 https://www.dpdk.org
- eBPF/XDP(eXpress Data Path)
特点:
·eBPF 是 Linux 内核中的一种高效沙盒技术,允许在内核中运行用户定义的代码。
·XDP 是 eBPF 的扩展,用于加速数据包处理,支持直接在网卡驱动层面处理数据包。
·延迟低,适用于 DDoS 防护、流量分类等场景。
应用场景:
·超低延迟的网络应用。
·数据包过滤、负载均衡。
学习资源:
·eBPF 官方文档 https://ebpf.io
·XDP 入门指南 https://github.com/xdp-project/xdp-tutorial
- VPP(Vector Packet Processing)
特点:
·由 FD.io 社区开发的高性能网络数据平面框架。
·基于数据包矢量处理,利用 CPU 的 SIMD 指令集加速数据包转发。
·提供插件式架构,可支持多种协议。
应用场景:
·数据包转发、IPSec 加速、LISP 协议等。
官网和资源:
·VPP 官网 https://fd.io
- Netmap
特点:
·一个高效的网络 I/O 框架,用于绕过传统内核协议栈。
·轻量级设计,提供直接访问网络设备的能力。
·比传统网络栈具有更低的延迟和更高的吞吐量。
应用场景:
·高性能数据包捕获和发送。
·自定义用户态协议栈开发。
官网和资源:
·Netmap 项目主页 https://github.com/luigirizzo/netmap
- mTCP
特点:
·专为高性能环境设计的用户态 TCP/IP 协议栈。
·支持多核并行化和高效内存管理。
·提供传统内核栈无法实现的高吞吐量和低延迟。
应用场景:
·高性能服务器应用程序(如 Web 服务器、代理服务器)。
官网和资源:
·mTCP 官方网站 https://github.com/mtcp-stack/mtcp
- SEASTAR
特点:
·基于事件驱动的 C++ 框架,内置高效网络协议栈。
·专为低延迟和高吞吐量的分布式系统设计。
·被 ScyllaDB 等高性能数据库广泛采用。
应用场景:
·数据库、高性能分布式系统。
官网和资源:
·Seastar 官方网站 https://seastar.io
- LWIP(Lightweight IP)
特点:
·一款开源轻量级 TCP/IP 协议栈,专为嵌入式设备设计。
·资源占用低,适合低性能设备或 IoT 应用。
·可移植性强,可运行在 bare-metal 环境或操作系统上。
应用场景:
·嵌入式设备、物联网。
官网和资源:
·LWIP 项目主页
- TAS(TCP Acceleration as a Service)
特点:
·一种高效的用户态 TCP 协议栈。
·提供高性能和低延迟,支持 RDMA 等技术。
·在用户态实现高效连接管理和数据传输。
应用场景:
·高性能服务器和分布式存储。
如何选择?
·高性能数据包处理:选择 DPDK、eBPF/XDP、VPP。
·用户态协议栈:选择 mTCP、Seastar、TAS。
·嵌入式应用:选择 LWIP。
·可扩展性和灵活性:选择 eBPF 或 VPP。
这些开源项目广泛应用于现代网络系统,可以根据需求和场景选择合适的解决方案。
二、开源网络框架与linux系统自带网络协议栈对比
在 5ms 间隔发送网络数据包 的场景中,开源高效网络协议栈与 Linux 自带协议栈的效果对比主要取决于以下几个因素:
1> 数据包处理路径的效率:自带协议栈的内核路径较长,而高效网络协议栈(如 DPDK、Netmap)优化了数据包处理路径。
2> 发送速率的瓶颈:开源高效网络协议栈绕过了内核中的部分机制,可以显著降低 CPU 消耗和延迟。
3> 需求场景:如果发送间隔和吞吐量要求较低,Linux 自带协议栈已经能满足需求;但如果需要极高性能或处理更复杂的场景,则开源网络协议栈可能表现更好。
分析比较:
1、何时选择 Linux 自带协议栈
适用场景:
·发包速率较低(例如每 5ms 一个包,约 200 PPS)。
·需要使用通用的系统工具和库,无需额外依赖。
·应用程序不需要极低的延迟或极高的吞吐量。
优点:
·简单易用,开发周期短。
·适配性强,几乎可以在任何 Linux 发行版上运行。
缺点:
·受内核网络协议栈开销限制,性能相对较低。
·如果网络负载增加,可能受到内核中断或队列的瓶颈影响。
2、何时选择开源高效网络协议栈
适用场景:
·需要更低的延迟和更高的吞吐量(比如发包速率接近线速)。
·CPU 资源有限,希望降低内核和用户态切换的开销。
·有硬件支持并需要处理高负载的场景。
推荐协议栈:
DPDK:
o最适合高性能发包需求。
o提供直接操作网卡队列的能力,绕过内核协议栈。
o在 5ms 间隔发包场景下,CPU 占用率和延迟表现优于自带协议栈。
Netmap:
o实现简单,比 DPDK 更易上手。
o提供高效的用户态数据包发送能力。
优点:
·高性能,绕过内核,提高了吞吐量和降低延迟。
·支持零拷贝和批量发送,适合高频发包。
缺点:
·开发复杂,需要熟悉框架。
·可能需要特定硬件支持。
结论
Linux 自带协议栈:
o如果 5ms 发一次数据包的负载较低(<200 PPS),它已经足够胜任,无需额外引入复杂的工具。
o开发和部署都更简单,适合资源充足且不追求极限性能的场景。
开源高效网络协议栈:
o如果需要处理更高的负载、追求极低延迟、或 CPU 资源有限(避免频繁用户态和内核态切换),建议选择高效网络协议栈,如 DPDK 或 Netmap。
o对于 5ms 发一次的需求,优化后的性能将大幅优于内核自带协议栈,但开发和配置成本更高。
建议根据你的硬件条件(如网卡是否支持 DPDK)和开发周期需求来选择适合的方案。如果是新手且性能要求不高,推荐先尝试 Linux 自带协议栈;若追求高性能或部署于生产环境,建议采用 DPDK 或类似的高效网络协议栈。
欢迎关注:
网络相关的其他笔记: