一、概述
网络缓冲区用于缓冲待发送的数据或接收了待处理的数据,发送缓冲区可以积累一定量的数据再发送,接收缓冲区可以积累一定量的数据,解决粘包导致的没有收到完整的数据包,缓冲起来等包数据完整了再提交给业务逻辑处理。
二、实现方案
根据我的经验,这里将介绍四种实现机制,包括单块连续内存缓冲,环形缓冲,环形分块缓冲,链表分块缓冲。
1. 单块连续内存缓冲
单块连续缓冲是最简单地实现机制。这种方案采取一块连续的内存来作为缓冲区,随着数据的写入和读取,有效数据块会逐渐往后移动,在合适的时机把整块有效数据移动到头部。如果整块内存都被写完,也可以新分配一块更大内存,并把老的块上数据拷贝过来,并释放掉老的块,具体的实现,看下图。
2. 环形缓冲区
环形缓冲区也是一块连续内存,与第一种方案的区别是end到达内存块尾部时,end可以移动到块的头部,可以无限接近start,但不会超过start。相比第一种方案,当数据写到内存块得的尾部时,不需要拷贝整块有效数据到头部。如果环形缓冲区是固定大小,支持一个线程读,另一个线程写的无锁操作。
3