- 博客(33)
- 收藏
- 关注
原创 用户态网络缓冲区
我们在处理数据包的时候需要将内核中的数据包读到缓冲区及生产者,在处理时(消费者)需要将将缓冲区的数据拿出来进行处理,此时缓冲区就是我们需要设计的东西。它是在TCP/UDP发送包的时候发现此时协议栈有半个包和一个半的包的时候需要对半个包进行缓存的操作,也即粘包问题。udp在发送时不需要用户态网络缓冲区,直接发就行。在接受的时候需要,因为存在生产者速度>消费者速度的问题。是在接受发送数据包时需要将数据包缓存起来发送与接受的一个缓冲区。需要缓存没有发送的数据。
2026-10-20 00:02:37
182
原创 dpdk环境搭建
其实这里有一点小坑,在更换vmx文件内容后,运行ip route发现ip找不到了,原因IP地址没有分配。而此时网卡名字变为了ens160,所以可以用dhclient重新分配ip。上图表示我此时不支持多队列网卡,只有一条数据。打开此文件,添加如下两行,(第一行存在)在虚拟机文件夹中找到一个叫vmx的文件。然后启动虚拟机就能支持多队列网卡了。如何知道虚拟机是否支持多队列网卡。ens33为我虚拟机的网卡名字。
2026-06-25 22:05:06
187
原创 RDMA基本原理
在进行通信传输时,通信的主体时QP而不是结点,在建立连接阶段如果QP之间没有建立连接,那么就无法进行通信,每一对QP之间都要建立一对一通信。WR与WC分别是工作请求与工作完成,因为WQE与CQE是不可见的是在驱动层的,分别是WQE与CQE的映射,用户能操作的是WR与WC。工作队列元素,是软件给硬件提供的需要传输的数据的一个队列元素,WQ即为工作队列。完成队列元素,即硬件在完成后需要反馈给软件。QP是有两个队列组成发送队列SQ与RQ,即完成队列编号,用来标识完成队列的。
2026-06-10 00:26:22
160
原创 RDMA技术
因为用户态一些非连续的虚拟内存的数据,物理空间不连续,而网卡传输数据不支持非连续数据的访问。所以要将用户态非连续物理内存的数据拷贝到物理空间连续的内核态。1、send/recv等系统调用,导致系统需要在用户态和内核态之间进行切换,增加传输延时。2、发送数据时需要将数据从用户态拷贝到内核态,这也是需要消耗大量时间。1、数据传输时没有系统调用,不需要用户态和内核态的切换。3、数据包的解析与封装,由网卡完成,降低CPU的负载。2、网卡需要对非连续数据的封装与解析。2、省去了内核态与用户态之间的拷贝。
2026-06-09 22:32:09
217
原创 kvstore项目--实现:内存泄漏检测
我们在调用malloc的时候往往有时候没有做到及时的释放改区域的空间,而导致内存泄漏。现代操作系统往往可以做到在该进程结束后,对该进程所占用的内存进行回收,但是如果是需要长期上线的服务类进程,若发生内存泄漏,可能会导致系统内存持续增长而导致宕机的可能,故检测出内存有泄漏以及哪里泄漏这件事是十分重要的。
2026-04-27 21:43:52
170
原创 kvstore项目实战--理论篇:sendfile详解
sendfile是Linux系统的一个系统调用,通过在两个文件描述符fd之间完成数据传递,避免了文件从用户缓冲区与内核缓冲区的交换。
2026-04-23 21:34:59
49
原创 kvstore项目实战--理论篇:RDMA进行主从机数据同步
RDMA(Remote Direct Memory Access,远程直接内存访问)是一种高性能网络通信技术。它允许一台机器的网卡直接读写另一台机器已授权的内存区域,尽量绕过内核协议栈和多次数据拷贝,从而实现低延迟、高吞吐、低 CPU 占用的数据传输。通过建立专用的你要用于数据传输的一块内存MR,该内存的数据将打包到对应QP里,由RNIC专线进行发送,不需要由cpu装载与卸载对应到接收端也直接放在接收端的MR中,以此完成高效传输。
2026-04-23 20:53:24
209
原创 kv存储项目原理及其背景
形如Key-Value这样的存储方式,即为kv存储,这是一种键值对存储,通过不同的key值来找到对应的value值。可以把它理解为一张超大的hash表或字典。Key(键):唯一标识,比如 “user:1001”Value(值):对应的数据,比如 “张三”,或者一段 JSON、二进制数据等我们在进行传输数据时,通常用到的不是TCP协议吗,为什么还要在这里重新设计专门的协议?这里的协议是指私有的协议,是指在kv存储内部,如何解析到来的命令的意思,以及要传出去的指令。
2026-03-14 19:21:13
253
原创 kv存储架构
kv,全称是key-value存储,是一种键值对,与普通的表格性即关系型数据库不同,普通数据库是建好表后每个位置都需要填上相应的值,而kv存储只需要对应的key,和其所有的存储的信息,也就是value。例如:Redis,MongoDB,Memcached。
2026-02-15 01:44:01
271
原创 http服务器的简单实现
仅需另起一个文件:webserver.c,将request逻辑与response的逻辑写入即可,再在reactor层级将其加入到recv与send的回调函数中即可。假设客户端发送32个字节,服务端接收10个字节,边沿只触发一次,一次性将32个字节全发送;而水平触发会发4次。边沿触发是指只会在变换的时候会触发,只会触发一次,一次性把数据发完。水平触发是指整个时间段都能触发,都能发数据。水平触发,适合大小固定的数据包。边沿触发,适合大小不固定。
2026-02-10 18:31:44
300
原创 iocp的原理及其实现
iocp(I/O Completion Port),它是一种在windows下实现的网络编程模型(proactor)在操作IO的时候,socket与iocp进行绑定后,可以将io操作的投递堆叠在一起,就可以向iocp发很多io操作。将其存在请求队列里面。具体实现如下图:在很多接口中都有体现。
2026-01-24 12:24:42
686
原创 io_uring的性能测试以及其与epoll的对比
通过编写命令行测试工具来对该io_uring服务器进行测试。由于一次测试需150秒,故仅测了这一组数据,后续可自行进行测试。uring_tcp_server的结果。epoll_tcp_server的结果。将这些信息存在一个结构体中。
2026-01-16 00:38:04
378
原创 io_uring的原理及其应用
我们在对IO进行操作,如读写IO的时候,如有read,write,recv,send这四个函数都是同步的。意思是read(fd,buffer,length)函数执行时在读请求和返回数据是一起的,没有做到分开,write,recv,send同理。异步IO就是要把这两个步骤拆开来做,io_uring就是这样的一个工具。由于这三个系统调用不太好理解,故使用liburing这个库来封装了前面三个系统调用。
2026-01-14 16:45:28
610
原创 markdown语法
你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:撤销:Ctrl/Command + Z重做:Ctrl/Command + Y加粗:Ctrl/Command + B斜体:Ctrl/Command + I标题:Ctrl/Command + S
2025-12-22 11:58:04
623
原创 UDP的可靠传输----KCP以及前景
举个简单的例子,我们从服务器发送数据时,网关通常有其限速,再G0,G1,G2带宽都为100M,这时服务器都以100M速率发送过来,但在G2分配给两个客户端的速率总和最多只有100M,这其中的发送方的速率与接受方的速率不相等,其实就可以降低发送方速率来进行一定的控制。举个例子:在发送端发送了1,2,3,4,5这几个包之后,远端收到ACK1,3,4,5,收到ACK3时,跳过一次,收到ACK4时,知道2被跳过两次,则认为2号包丢失,不用等超时时间,直接重传2号数据包,fastresend = 2。
2025-11-16 00:44:43
1174
1
原创 理解Posix网络编程7个API
POSIX:可移植操作系统接口(Portable Operating System Interface of UNIX,缩写为 POSIX )。它是一套标准,Unix与Linux和苹果系统的Unix-base都遵循这个标准,话不多说,赶紧进入正题。
2025-10-23 01:17:56
531
原创 理解Reactor
reactor用来关注网络中的事件,在处理网络的时候由网络IO的管理变为网络事件管理,其核心的思想就是通过回调函数来处理这些IO,也称为IO事件。每一个不同的IO事件调用不同的回调函数。
2025-10-08 23:47:58
271
原创 网络IO中多路复用:select,poll与epoll的理解与应用
在上篇中实现的一请求一线程的方式优点是其代码逻辑简单,但缺点也是很明显的,不太利于并发,若每个线程8M,16G内存大概能做到1k的并发,无法做到更多。故而需要用多路复用技术如select、poll、epoll。
2025-10-08 11:08:54
248
原创 理解网络IO
Socket FD(File Descriptor)是用来标识网络IO与管理网络连接的。在linux中,它仅仅代表一个整数,用来表示当前创建的IO的编号,是在从0开始依次增加。0是标准输入:stdin,1是标准输出:stdout,2是标准错误:stderr。如下图在客户端连接服务端的时候,服务端创建一个监听的fd等待客户端的连接,在listenfd收到连接请求后,服务端会创建一个用于与客户端通信的fd来进行数据传输。下面我将创建一个server端的网络IO来进行实验。
2025-09-22 00:27:53
423
原创 65536个端口如何做到百万并发
端口数量为65536,这个数字是因为在Linux系统中,系统用一个唯一的四元组来标识一个TCP连接,{本机IP,本机端口,远程IP,远程端口}。而在Linux系统中,端口号这个变量是个unsigned short,占16位,故其端口号有65536个。
2025-09-20 16:51:00
392
原创 线程池原理
线程池是一种多线程处理机制,通过预先创建和复用线程来优化资源管理。它包含任务队列、执行队列和管理组件三个核心部分,适用于服务器通信(避免大量线程耗尽内存)和日志处理(分离任务与执行)等场景。线程池的优势包括防止内存耗尽、减少线程创建销毁开销、实现任务与执行解耦。其实现涉及线程创建、任务调度(使用互斥锁和条件变量同步)和资源销毁等API。管理组件负责协调任务分配与线程执行,通过条件变量唤醒休眠线程处理任务队列中的请求,从而提升系统性能和资源利用率。
2025-09-19 01:40:52
377
原创 多项式除以多项式代码思路
即A[n] = 4,然后拿一个数组存商,对于商的每一项,若t1为多项式A的最高次幂,t2为多项式B的最高次幂t1-t2即为商的指数,其系数为A[t1]/B[t2].然后更新A数组,用更新后的A数组继续去算直到t1
2023-04-13 15:40:10
126
1
原创 重庆邮电大学python实验6
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档重庆邮电大学python实验6汉诺塔:st = 1def hnt(h,s1,s2,s3): global st; if h == 1: if st >= 10: print("[STEP %d] %c->%c " %(st,s1,s2)) else : print("[STEP %d] %c->%c " %(st,.
2022-04-14 19:44:23
1499
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅