dpdk课程学习之练习笔记三(tcp的简单实现)

2023-05-16

dpdk(数据平面开发套件),提供给我们一套框架,使我们可以在此基础上进行数据面相关软件开发。

1:基于DPDK实现tcp数据包的处理的测试

1.1:整理基于dpdk实现tcp协议业务处理的思路:

1:dpdk接管网卡数据后,放入中间接收缓冲区。

​ dpdk提供接口rte_eth_rx_burst 从以太网接收队列中提取接收的数据。

2:专门的线程处理中间接收缓冲区的数据,进行过滤,依次业务处理。(arp/tcp/udp/icmp)(这里可以继续启动线程分类处理)

3:相关其他线程处理完业务数据包,需要回复,则构造相关结构放入中间发送缓冲区中,

4:通过用dpdk对应接口(rte_eth_tx_burst),放入以太网缓冲区中发送数据。

5:考虑tcp的实现,tcp涉及三次握手,四次挥手,通过十一种状态进行控制,以及各种拥塞控制,流量控制,定时器等。

1.2:简单实现测试逻辑

这里从tcp server端的角度考虑,实现tcp 三次握手,正常通信,四次挥手的正常流程测试,其他机制后期扩展。

===> 需要定义结构,保存多个fd与五元组,发送缓冲区和接收缓冲区等。

===>需要定义11中状态,控制tcp业务流程。

===>dpdk发送和接收网卡的控制,接收到的是协议包,发送的也是协议包,最终我们要构造的是tcp的协议包放入缓冲区中。(通过两个缓冲区in_ring_buff和out_ring_buff作为中间层进行数据交互)

===>这里tcp的server端对应多个连接,涉及fd与五元组每个连接发送的细节,在业务处理时,需要关注缓冲区与每个五元组结构的交互。

在这里插入图片描述

1.3:在tcp server的角度,测试三次握手,交互,以及四次挥手的逻辑测试

根据每个fd对应的五元组的结构中保存的状态,对每种状态做不同的业务处理。

	switch (stream->status) {
		case NG_TCP_STATUS_CLOSED: //client 
			break;
		case NG_TCP_STATUS_LISTEN: // server
			ng_tcp_handle_listen(stream, tcphdr);
			break;
		case NG_TCP_STATUS_SYN_RCVD: // server
			ng_tcp_handle_syn_rcvd(stream, tcphdr);
			break;
		case NG_TCP_STATUS_SYN_SENT: // client
			break;
		case NG_TCP_STATUS_ESTABLISHED: // server | client
			uint8_t hdrlen = tcphdr->data_off & 0xF0;
			hdrlen >= 4;
			uint8_t *payload = (uint8_t *)(tcphdr + 1) + hdrlen * 4;

			printf("payload: %s\n", payload);		
			break;

		case NG_TCP_STATUS_FIN_WAIT_1: //  ~client
			break;
		case NG_TCP_STATUS_FIN_WAIT_2: // ~client
			break;
		case NG_TCP_STATUS_CLOSING: // ~client
			break;
		case NG_TCP_STATUS_TIME_WAIT: // ~client
			break;
		case NG_TCP_STATUS_CLOSE_WAIT: // ~server
			break;
		case NG_TCP_STATUS_LAST_ACK:  // ~server
			break;

	}

运行已有的老师的测试代码,09_tcp_transmission。

使用网络串口工具进行测试:

​ ==》通过抓包分析,这里的192.168.0.123是我dpdk接管网卡,代码内部配置的ip,则三次握手可以看到:
在这里插入图片描述

正常发送数据以及收到dpdk回复报文:

在这里插入图片描述

注意:这里的测试demo只是提供了tcp实现思路,简单实现了三次握手及正常的收发通信,相关正常通信数据的ack,以及四次挥手的完善处理,后续完善。

1.4:实现可提供给用户使用的常用api接口测试

专门启动一个线程,提供api,通过fd查找每个连接对应结构,提取、存入数据实现发送、接收。

通过网络串口工具进行连接,测试发送与接收业务都正常。

思考:tcp相关协议栈是比较复杂的,内部处理流程,交互,拥塞控制,定时器等,有待实现。

参考免费课程链接:https://ke.qq.com/course/417774?flowToken=1040954

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

dpdk课程学习之练习笔记三(tcp的简单实现) 的相关文章

  • 螺旋桨转矩

    xfeff xfeff 在螺旋桨气动力分析时 xff0c 首先应用翼型理论进行螺旋桨叶素分析 利用翼型升阻特性数据 xff0c 回避了有限机翼的展弦比问题 xff0c 诱导流动由涡流模型确定 xff0c 取决于桨叶数目 间距以及作用于每片桨
  • 给初学者们讲解人工神经网络(ANN)

    1 介绍 这份教学包是针对那些对人工神经网络 xff08 ANN xff09 没有接触过 基本上完全不懂的一批人做的一个简短入门级的介绍 我们首先简要的引入网络模型 xff0c 然后才开始讲解ANN的相关术语 作为一个应用的案例 xff0c
  • OpenMP基本概念

    OpenMP是一种用于共享内存并行系统的多线程程序设计方案 xff0c 支持的编程语言包括C C 43 43 和Fortran OpenMP提供了对并行算法的高层抽象描述 xff0c 特别适合在多核CPU机器上的并行程序设计 编译器根据程序
  • 散度和旋度的物理意义是什么?

    高等数学学的时间有点久远了 xff0c 最近需要推倒一些公式 xff0c 以前高数学的时候这公式那定理的都没说什么物理意义 xff0c 现在接触的问题都是具有一定物理意义的 xff0c 感觉对不上 xff0c 回来找找资料好好理解一下 xf
  • 格林公式、高斯公式及斯托克斯公式的理解及相互关系

    最近要推倒波动方程积分解 xff0c 要对散度 旋度以及他们之间的相互关系有一个理解 看了两天 xff0c 自己认为理解的差不多了 xff0c 现在写在这个地方 xff0c 作为笔记 xff0c 以后忘记了拿过来看一下 xff0c 加深一下
  • Radon变换理论介绍

    本人最近在研究Radon变换 xff0c 在查阅了各种资料之后在此写下个人的理解 xff0c 希望与各位牛牛进行交流共同进步 xff0c 也使得理解更加深刻些 Radon变换的本质是将原来的函数做了一个空间转换 xff0c 即 xff0c
  • test

    lt DOCTYPE html gt lt html lang 61 34 en 34 gt lt head gt lt meta charset 61 34 utf 8 34 gt lt meta http equiv 61 34 X U
  • BIT内存顺序

    机器的最小寻址单位是字节 xff0c bit无法寻址 xff0c 也就没有高低地址和起始地址的概念 xff0c 我们需要定义一下bit的 地址 以一个字节为例 xff0c 我们把从左到右的8个bit的位置 position 命名按顺序命名如
  • 无人驾驶感知篇之融合(五)

    今天早上看到上海新增一万七千左右 xff0c 看的真的很揪心 xff01 希望白衣战士能早点战胜这场疫情 xff0c 期待明天能有好消息 xff01 今天具体讲讲多贝叶斯估计算法的原理 xff0c 多贝叶斯估计法的主要思想是将传感器信息依据
  • MAC地址的介绍(单播、广播、组播、数据收发)

    MAC地址组成 网络设备的MAC地址是全球唯一的 MAC地址长度为48比特 xff0c 通常用十六进制表示 MAC地址包含两部分 xff1a 前24比特是组织唯一标识符 xff08 OUI xff0c OrganizationallyUni
  • stm32通用定时器输出PWM控制舵机

    stm32的通用定时器有TIM2 TIM3 TIM4 TIM5 xff0c 每个定时器都有独立的四个通道可以作为 xff1a 输入捕获 输出比较 PWM输出 单脉冲模式输出等 stm32除了基本定时器 xff0c 其他定时器都能输出PWM
  • Linux内核Socket CAN中文文档

    自己在年假中空闲之余翻译的内核中Socket CAN的文档 xff0c 原文地址在 xff1a http lxr linux no linux 43 v2 6 34 Documentation networking can txt 但是这篇
  • c/c++自定义通讯协议(TCP/UDP)

    前言 xff1a TCP与UDP是大家耳熟能详的两种传输层通信协议 xff0c 本质区别在于传输控制策略不相同 xff1a 使用TCP协议 xff0c 可以保证传输层数据包能够有序地被接受方接收到 xff0c 依赖其内部一系列复杂的机制 x
  • ubuntu 使用虚拟can 与 socketCAN使用

    原文链接 xff1a https blog csdn net xiandang8023 article details 127990159 创建虚拟CAN接口 在Linux上能使用虚拟CAN接口之前 xff0c 需要在终端执行以下三个步骤
  • cmake引入第三方库

    cmake引入第三方库 第三方库包含 lib文件和 h hpp文件动态库还包含 dll文件 小例程 3rdparty bin test dll include test hpp lib Debug test lib Release test
  • AHB-APB总线协议

    AHB APB总线协议 文章目录 AHB APB总线协议一 AHB APB总线介绍二 AHB总线设备1 AHB主设备 xff08 master xff09 2 AHB从设备 xff08 slave xff09 3 AHB仲裁器 xff08
  • Modelsim缺失库快速添加

    Modelsim缺失库快速添加 文章目录 Modelsim缺失库快速添加前言一 ini文件二 器件库配置1 将器件库放在modelsim文件夹下2 ini配置文件修改 前言 在单独使用modelsim时 xff0c 假如要编译复杂的工程文件
  • AHB-APB_Lite总线协议及Verilog实现

    AHB APB Lite总线协议及Verilog实现 文章目录 AHB APB Lite总线协议及Verilog实现一 AHB Lite协议介绍二 系统框架介绍三 代码设计四 仿真测试 一 AHB Lite协议介绍 AHB xff08 Ad
  • 通信协议详解(二):IIC总线协议(传输时序+数据格式+设计实现)

    文章目录 一 IIC xff08 Inter Integrated Circuit xff09 介绍二 传输协议1 时序传输时序写操作时序数据有效性开始 amp 结束信号从机应答信号 2 数据格式 三 设计实现1 时钟2 传输过程3 三态门
  • Qt error ------ 'XXX' has not been declared

    1 头文件没加 2 调用函数者的头文件在XXX头文件的下方 转载于 https www cnblogs com god of death p 8572306 html

随机推荐