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

news/2024/5/18 15:59:45 标签: tcp/ip, 网络, udp

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


http://www.niftyadmin.cn/n/1520044.html

相关文章

txt转mysql数据库转换工具_MyToTxt(MySQL转Txt工具) V3.6 官方版

MyToTxt是一款高效实用的MySQL转换Txt工具,帮助您把CSV,文本,数据库,XML和HTML格式导出到MySQL数据文件,以帮助您的工作需要。【功能特点】将MySQL数据导出到平面文件。支持多种格式:TXT、CSV、XML、HTML、…

leetcode1013. 将数组分成和相等的三个部分

给你一个整数数组 A&#xff0c;只有可以将其划分为三个和相等的非空部分时才返回 true&#xff0c;否则返回 false。 形式上&#xff0c;如果可以找出索引 i1 < j 且满足 (A[0] A[1] … A[i] A[i1] A[i2] … A[j-1] A[j] A[j-1] … A[A.length - 1]) 就可以将数…

日常知识点之c语言按行读配置文件,及行尾符CRLF导致的问题

1&#xff1a;知识点总结 Unix每行结尾为"\n", Windows系统每行结尾是"\r\n" printf输出时&#xff0c;如果内部字段含有\r&#xff0c;会自动跳转到行首进行后续的输出。 printf输出时&#xff0c;有时候一直不打印&#xff0c;是因为printf底层是有缓…

mysql等保测评命令_等保测评2.0:Oracle身份鉴别(上)

一、说明本篇文章主要说一下Oracle数据库中身份验证控制点中关于身份鉴别的知识点&#xff0c;由于这个地方比较“复杂”&#xff0c;所以这篇文章就不写测评项方面的东西了&#xff0c;放在下篇文章中。在oracle的身份验证这方面&#xff0c;网上的文章很多&#xff0c;但是真…

python假设有三个列表_python基础三(列表和元组)

数据结构&#xff1a;数据结构是以某种方式(如通过编号)组合起来的数据元素集合。在python中&#xff0c;最基本的数据结构为序列&#xff0c;序列中每个元素都有编号从0开始。1、序列概述&#xff1a;python内置了许多种序列&#xff0c;列表、元组、字符串等。列表和元组的不…

dpdk课程学习之公开课基础知识整理(uio,dma,vfio,大内存页理解)

本文内容仅来源于一次免费试听课&#xff0c;以及自己理解整理&#xff0c;未经过严谨验证&#xff0c;如果有误&#xff0c;请指点。 1&#xff1a;介绍 dpdk是软件&#xff0c;是一个应用程序&#xff0c;是linux环境中的一个进程&#xff0c;是用户层控制的。 dpdk场景&a…

linux mysql默认编码_linux下的mysql修改默认编码

欢迎进入Linux社区论坛&#xff0c;与200万技术人员互动交流 >>进入 安装mysql sudo apt-get install mysql-server 查看mysql默认编码 show variables like character%; ------------------------------------------------------ | Variable_name | Value | ----欢迎进入…

日常知识点之公开课内存碎片优化(内存池)

不善言谈&#xff0c;身边缺少技术大牛交谈&#xff0c;项目缺少使用技术机会&#xff0c;主动知道知识&#xff0c;汲取知识&#xff0c;理解知识的渠道就屈指可数&#xff08;论大厂的重要性&#xff09;。 在闲暇的时候就在b站看看一些自己没有理解的知识点&#xff0c;在时…