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

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

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

目录
相关文章
|
缓存 网络协议 Linux
手把手实现tcp/ip用户态协议栈,帮你实践网络知识(网络必备,面试项目)
手把手实现tcp/ip用户态协议栈,帮你实践网络知识(网络必备,面试项目)
|
14天前
|
网络协议
TCP报文格式全解析:网络小白变高手的必读指南
本文深入解析TCP报文格式,涵盖源端口、目的端口、序号、确认序号、首部长度、标志字段、窗口大小、检验和、紧急指针及选项字段。每个字段的作用和意义详尽说明,帮助理解TCP协议如何确保可靠的数据传输,是互联网通信的基石。通过学习这些内容,读者可以更好地掌握TCP的工作原理及其在网络中的应用。
|
6月前
|
网络协议 网络架构
【网络编程入门】TCP与UDP通信实战:从零构建服务器与客户端对话(附简易源码,新手友好!)
在了解他们之前我们首先要知道网络模型,它分为两种,一种是OSI,一种是TCP/IP,当然他们的模型图是不同的,如下
234 1
|
存储 运维 网络协议
深入浅出:这次终于能把 TCP/IP 协议搞明白了
深入浅出:这次终于能把 TCP/IP 协议搞明白了
深入浅出:这次终于能把 TCP/IP 协议搞明白了
|
网络协议 Unix Linux
CCNA 必备:Linux 网络基础知识入门及 tcp 协议(二)|学习笔记
快速学习CCNA 必备:Linux 网络基础知识入门及 tcp 协议
CCNA 必备:Linux 网络基础知识入门及 tcp 协议(二)|学习笔记
|
网络协议 安全 Linux
CCNA 必备:Linux 网络基础知识入门及 tcp 协议(一)|学习笔记
快速学习CCNA 必备:Linux 网络基础知识入门及 tcp 协议
CCNA 必备:Linux 网络基础知识入门及 tcp 协议(一)|学习笔记
|
网络协议 测试技术
第三章TCP/IPip地址概念与应用
一 什么是ip地址 IP地址是用来唯一标识互联网上计算机的逻辑地址,让电脑之间可以相互通信,每台连网计算机都依靠IP地址来互相区分,相互联系。 二 什么是域名 由于IP地址是数字标识,使用时难以记忆和书写,因此在IP地址的基础上又发展出一种符号化的地址方案,来代替数字型的IP地址。每一个符号化的地址都与特定的IP地址对应,这样网络上的资源访问起来就容易得多了。这个与网络上的数字型IP地址相对应的字符型地址,就被称为域名。
111 0
|
存储 缓存 网络协议
TCP常见知识点整理
TCP常见知识点整理
192 0
TCP常见知识点整理
|
缓存 网络协议 安全
《TCP IP 详解卷1:协议》阅读笔记 - 第四章
阅读须知:笔记为阅读《TCP IP 详解卷1:协议》后摘抄的一些知识点,其间也有加入一些根据英文原版的自己翻译和结合网上知识后的理解,所以有些段落之间并不能够串联上或者知识点与书上略有差别(基本差别不大,参考的资料属RFC官方文档)。
1348 0
|
网络协议 算法 安全
《TCP IP 详解卷1:协议》阅读笔记 - 第五章
阅读须知:笔记为阅读《TCP IP 详解卷1:协议》后摘抄的一些知识点,其间也有加入一些根据英文原版的自己翻译和结合网上知识后的理解,所以有些段落之间并不能够串联上或者知识点与书上略有差别(基本差别不大,参考的资料属RFC官方文档)。
1494 0

热门文章

最新文章