IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 【协议森林】基于DPDK的用户态协议栈mTCP -> 正文阅读

[网络协议]【协议森林】基于DPDK的用户态协议栈mTCP

1.背景

TCP短连接变得越来越普遍,90%以上的TCP流都是小于32KB的,50%的小于4KB。高速处理TCP短连接对于面向用户的在线服务和后台系统都是一项重要的需求,但是Linux TCP的处理速度峰值是30万/s(来源mTCP: A Highly Scalable User-level TCP Stack for Multicore Systems),而packet I/O可以扩展到千万/s,所以当前的Linux TCP架构的处理速度是跟不上实际需求的。

2.MTCP特点

mTCP(User-Level TCP Stack for Multicore System)是一款开源的用户态TCP协议栈。在MTCP看来,原有的Linux内核态TCP/IP栈的实现主要存在以下问题:

  • 由于文件的描述符(File Descriptor, FD)在一个进程内部都是共享的,因此不同的CPU核在处理FD的时候存在相关的竞争。这些竞争包括:共享的监听FD的队列(锁保护)、FD的管理、需要在共享的空间内寻找空闲的FD。
  • 破坏了应用程序的局部最优原则,比如在基于per-core的包处理队列中,收到中断的CPU和最后实际处理网络数据读写的CPU不是同一个,这就带来大量的系统开销。
  • 低效的批处理方式,比如accept/read/write等系统调用效率不高,不断地要进行上下文的切换,并引起cache的不断更新。
  • 内核的TCP/IP栈处理报文的时候也很低效,对每个包都要进行内存的分配。
    在这里插入图片描述
    官网链接:mtcp官网

3.MTCP框架

MTCP
mTCP对TCP报文的处理流程,简要介绍如下。
(1)epoll_server接收到TCP 3次握手的SYN或ACK报文;
(2)收发线程将新建的TCP连接的tcb结构加入accept queue;
(3)收发线程把报文的有效载荷复制到接收缓存,产生一个 ACK 报文发送到 TXmanager,并为监听线程的Socket生成一个read event;
(4)收发线程处理完所有接收的报文后,激活业务线程;
(5)业务线程处理事件,并为多条流构建响应报文;
(6)业务线程将tcb入队到write queue中;
(7)收发线程将需要发送数据的tcb从write queue入队到发送list;
(8)收发线程接收待发送报文,并将报文通过对应的队列发送出去。

4.socket API

mctx_t mctx = mtcp_create_context ();
ep_id = mtcp_epoll_create (mctx , N);
mtcp_listen (mctx , listen_id , 4096);

while (1) 
{
	n= mtcp_epoll_wait (mctx ,ep_id ,events ,N,-1);
	for (i = 0; i < n; i++)
	{
		sockid = events[i]. data.sockid;
		if (sockid == listen_id)
		{
			c = mtcp_accept(mctx , listen_id , NULL);
			mtcp_setsock_nonblock (mctx , c);
			ev.events = EPOLLIN | EPOLLOUT;
			ev.data.sockid = c;
			mtcp_epoll_ctl (mctx , ep_id ,
			EPOLL_CTL_ADD , c, &ev);
		}
		else if (events[i]. events == EPOLLIN) 
		{
			r = mtcp_read(mctx , sockid , buf , LEN);
			if (r == 0)
			mtcp_close(mctx , sockid);
		} 
		else if (events[i]. events == EPOLLOUT)
		{
			mtcp_write(mctx , sockid , buf , len);
		}
	}
}

5.参与讨论

在这里插入图片描述

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-11-17 13:06:20  更:2021-11-17 13:07:53 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年7日历 -2024/7/3 21:07:26-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码