[tldk][dpdk][dev] TLDK--基于dpdk的用户态协议栈传输层组件简单调研
2024-10-14 02:20:49
原文如题,以下是一份简单的快速调研。
TLDK: Transport Layer Development Kit
一 什么是TLDK
transport layer development kit
处理tcp/udp的库
- 不提供socket api
- 构建在dpdk的上层。
- 专注在tcp, udp不做完整的协议栈。
- 没有arp, ip, eth, 路由表等。
VPP的一个节点
VPP协议栈的组成部分。
非VPP框架也能用
专门补充了一下功能,用来支持非VPP环境。netlink agents, packaging等。
二 TLDK的背景
tldk是VPP的一个graph node,VPP是fd.io项目的核心技术,由思科提交。fd.io是托管在linux基金会的项目。
tldk应该与vpp有相同的license。
什么是fd.io
FD.io (Fast data – Input/Output) is a collection of several projects and libraries to amplify the transformation that began with Data Plane Development Kit (DPDK) to support flexible, programmable and composable services on a generic hardware platform. FD.io offers the Software Defined Infrastructure developer community a landing site with multiple projects fostering innovations in software-based packet processing towards the creation of high-throughput, low-latency and resource-efficient IO services suitable to many architectures (x86, ARM, and PowerPC) and deployment environments (bare metal, VM, container).
什么是vpp
A key component is the Vector Packet Processing (VPP) library donated by Cisco. This code is already running in products on the market today. The VPP library is highly modular, allowing for new graph nodes to be easily “plugged in” without changes to the underlying code base. This gives developers the potential to easily build any number of packet processing solutions with varying forwarding graphs.
In development since 2002, VPP is production code currently running in shipping products. It runs in user space on multiple architectures including x86, ARM, and Power architectures on both x86 servers and embedded devices. The design of VPP is hardware, kernel, and deployment (bare metal, VM, container) agnostic. It runs completely in userspace.

资料
扫盲概述:https://fd.io/about/
什么是VPP: https://wiki.fd.io/view/VPP/What_is_VPP%3F
VPP的基本架构:https://fd.io/technology/
tldk主页:https://wiki.fd.io/view/TLDK
tldk代码页:https://github.com/FDio/tldk
IRC Channel: #fdio, #fdio-tldk
三 编译
kernel
version: 3.10.0-327.36.3.el7.x86_64
dpdk
version:tag v18.02-rc4
tldk
version: tag v18.02
代码结构
$(TLDK_ROOT)
|
+----app
| |
| +-- nginx - a clone of nginx integrated with TLDK
| (refer to app/nginx/README.TLDK for more information)
|
+----lib
| |
| +--libtle_dring - dring library
| |
| +--libtle_l4p - implementation of the TCP/UDP packet processing
| |
| +--libtle_timer - implementation of the timer library
|
+----examples
| |
| +--l4fwd - sample app to demonstrate and test libtle_l4p TCP/UDP
| usage (refer to examples/l4fwd/README for more information)
|
+----test - unit-tests
| |
| +--dring - UT for libtle_dring (standalone app)
| |
| +--gtest - UT for libtle_dring, libtle_l4p and libtle_timer
| | (googletest)
| |
| +--timer - UT for libtle_timer (standalone app)
步骤
export RTE_SDK=/root/Src/thirdparty/dpdk.git
export RTE_TARGET=x86_64-native-linuxapp-gcc
[root@T9 tldk.git]# make all
四 接口
接口文件
tle_ctx.h
tle_dpdk_wrapper.h
tle_dring.h
tle_event.h
tle_tcp.h
tle_timer.h
tle_udp.h
tle_version.h
接口文档
doc/l4_api_desc.txt
主要接口
模型
数据结构
ctx
|
|-----> stream
|-----> stream
| |
| |--------------> 属性 endpoint(addr, port) # 类型 socket
| |
| `--------------> 方法 open/send/recv/close
|
|-----> dev (网卡的抽象)
|
`-----> dev
初始化API
tle_ctx_create()
tle_ctx_destroy()
tle_add_dev()
tle_del_dev()
recv/send机制
类型:
callback
event
API:
tle_tcp_stream_recv()
tle_tcp_stream_send()
tle_tcp_readv()
tle_tcp_writev()
tle_udp_stream_recv()
tle_udp_stream_send()
BackEnd API
tle_tcp_rx_bulk()
tle_tcp_tx_bulk()
tle_tcp_process()
tle_udp_rx_bulk()
tle_udp_tx_bulk()
FrontEnd API
tle_tcp_stream_open(ctx, send_callback/event, recv_callback/event)
tle_tcp_stream_close()
tle_tcp_stream_abort() /* 重置tcp状态,不释放资源。 */
tle_udp_stream_open()
tle_udp_stream_close()
server side API
tle_tcp_stream_listen()
tle_tcp_stream_synreqs()
tle_tcp_stream_accept()
client side API
tle_tcp_stream_connect()
五 例子程序
l4fwd
+----------------------------+ +-------------------------------+
| TLDK Box | | Linux Box |
| | | |
| port 0 +----------------+ port 0 |
| 192.168.1.1 | | 192.168.1.2 |
| 2001:4860:b002::1 | | 2001:4860:b002::2 |
| AA:BB:CC:DD:EE:F1 | | AA:BB:CC:DD:EE:F2 |
+----------------------------+ +-------------------------------+
运行方法
- 加载dpdk uio驱动,并绑定好网卡。
- 写配置文件
[root@D129 app]# cat b.conf
port=0,addr=192.168.8.0,masklen=24,mac=82:8c:82:22:33:a5
[root@D129 app]# cat f.conf
lcore=1,op=echo,laddr=192.168.8.100,lport=8088,raddr=0.0.0.0,rport=0
- 运行
# server
[root@D129 app]# ./l4fwd -l 0,1 -w 0000:00:04.0 -- -P -T -L -R 256 -S 256 -s 256 -b b.conf -f f.conf -a port=0,lcore=1,ipv4=192.168.8.100
# client
sudo arp -s 192.168.8.100 00:00:00:01:00:02
参数解读:
在我的虚拟机里,必须要显示指定-w
-R/-S 影响window大小。
-P/-a 可以不设置。
- 运行结果演示
client端的echo效果
client设备出口抓包
- 代码分析

nginx
TODO
六 性能
TODO
七 VPP场景
TODO
八 实现分析
TODO
九 其他
约1w行代码。
┬─[tong@T7:~/Src/thirdparty/tldk.git]─[03:36:35 PM]
╰─>$ find ./lib/ -name '*.c' -exec cat \{\} \; |wc -l
5549
┬─[tong@T7:~/Src/thirdparty/tldk.git]─[03:36:38 PM]
╰─>$ find ./lib/ -name '*.h' -exec cat \{\} \; |wc -l
5480
[tldk][dpdk][dev] TLDK--基于dpdk的用户态协议栈传输层组件简单调研的更多相关文章
- [转帖]技术扫盲:新一代基于UDP的低延时网络传输层协议——QUIC详解
技术扫盲:新一代基于UDP的低延时网络传输层协议——QUIC详解 http://www.52im.net/thread-1309-1-1.html 本文来自腾讯资深研发工程师罗成的技术分享, ...
- NFV、DPDK以及部分用户态协议研究
本文为作者原创,转载请注明出处(http://www.cnblogs.com/mar-q/)by 负赑屃 对我而言,这是一个新的领域,很有意思. 一.解释名词: NFV(Network Functio ...
- 基于DPDK的高效包处理系统
一.概念 Intel® DPDK全称Intel Data Plane Development Kit,是intel提供的数据平面开发工具集,为Intel architecture(IA)处理器架构下用 ...
- 用户态tcp协议栈调研
一.各种用户态socket的对比 1.MTCP 简单介绍: 韩国高校的一个科研项目,在DPDK的2016年的技术开发者大会上有讲,所以intel将这个也放到了官方上,所以一般搜索DPDK的用户态的协议 ...
- C1000k 新思路:用户态 TCP/IP 协议栈
现在的服务器支撑上百万个并发 TCP 连接已经不是新闻(余锋2010年的演讲,ideawu 的 iComet 开源项目,WhatsApp 做到了 2.5M).实现 C1000k 的常规做法是调整内核参 ...
- [中英对照]Introduction to DPDK: Architecture and Principles | DPDK概论: 体系结构与实现原理
[中英对照]Introduction to DPDK: Architecture and Principles | DPDK概论: 体系结构与实现原理 Introduction to DPDK: ...
- 基于jwt的用户登录认证
最近在app的开发过程中,做了一个基于token的用户登录认证,使用vue+node+mongoDB进行的开发,前来总结一下. token认证流程: 1:用户输入用户名和密码,进行登录操作,发送登录信 ...
- Laravel 5 中使用 JWT(Json Web Token) 实现基于API的用户认证
在JavaScript前端技术大行其道的今天,我们通常只需在后台构建API提供给前端调用,并且后端仅仅设计为给前端移动App调用.用户认证是Web应用的重要组成部分,基于API的用户认证有两个最佳解决 ...
- 项目一:第十一天 2、运单waybill快速录入 3、权限demo演示-了解 5、权限模块数据模型 6、基于shiro实现用户认证-登录(重点)
1. easyui DataGrid行编辑功能 2. 运单waybill快速录入 3. 权限demo演示-了解 4. Apache shiro安全框架概述 5. 权限模块数据模型 6. 基于shiro ...
随机推荐
- Rabbit五种消息队列学习(二) – 简单队列
队列结构图 P:消息的生产者 C:消息的消费者 红色:队列 生产者将消息发送到队列,消费者从队列中获取消息. 测试 1.连接MQ public static Connection getConnect ...
- MySQL技术内幕读书笔记(七)——锁
锁 锁是数据库系统区分与文件系统的一个关键特性.为了保证数据一致性,必须有锁的介入.数据库系统使用锁是为了支持对共享资源进行并发访问,提供数据的完整性和一致性. lock与latch 使用命令 ...
- mina websocket 粘包、断包、(丢包)解决心得
被这3个(其实是2个)问题坑惨了,目前没发现存在丢包问题,之前认为的丢包问题事实是不存在的. 粘包和断包的情况是存在的,这两个问题不怕,只要发送接收到的数据包顺序没有被打乱颠倒,一切都好办. 容易掉的 ...
- python sphinx 文档自动生成方法
## sphinx 生成开发文档#### 配置 1. 运行如下命令,即可生成 conf.py index.rst Makefile 三个文件: `sphinx-quickstart` 2. conf. ...
- 小型互联网公司的IT系统建设思路
最近一些想创业的一帮兄弟来问我,准备借助互联网的翅膀,做某某事情,并想尽快的做出一个系统平台. 我给的思路,分6个步骤: 需求-> 灵感设计 ->实现 ->迭代改进 ->成 ...
- Java读取Excel内容
借助于apathe的poi.jar,由于上传文件不支持.jar所以请下载后将文件改为.jar,在应用程序中添加poi.jar包,并将需要读取的excel文件放入根目录即可 本例使用java来读取exc ...
- Navicat(数据库可视化操作软件)安装、配置、测试
Navicat(数据库可视化操作软件)安装.配置.测试(win7_64bit) 目录 1.概述 2.本文用到的工具 3.Navicat安装.激活与配置 4.简单测试 5.注意事项 6.相关博文 > ...
- 判断回文字符串、回文链表、回文数(python实现)
所谓回文字符串,就是正读和反读都一样的字符串,比如"level"或者"noon"等等就是回文串.即是对称结构 判断回文字符串 方法一: def is_palin ...
- (原)kenel开机logo的制作
今天项目需要,需要制作一个kernel的开机logo,所以在rk3288的平台上进行测试一番. 第一步:配置kernel:选上CONFIG_LOGO_LINUX_CLUT224选项 make menu ...
- python列表的切片操作允许索引超出范围
其余的不说,列表切片操作允许索引超出范围: