C++高性能服务框架revover:rudp总体介绍(可靠UDP传输)

来源:互联网 发布:淘宝账号怎么多个账号 编辑:程序博客网 时间:2024/06/13 08:39

在revolver框架中实现了一个高效可靠的RUDP通信方式,这个通信方式是基于UDP实现一种模拟TCP传输数据的行为。在很多实际应用中,udp/TCP都不是最好的通信方式,例如:点对点文件传输、视频数据高速传输、服务器之间大数据备份同步、高实时rts操作类网游等。TCP和UDP在一定程度上是无法满足此类要求。故revolver实现了一套可靠UDP的传输方式。我们先来看看它的传输效率,以下是WINDOWS和LINUX下它的单连接传输速度。


左边的是WIN7下的速度,我测试的极限大概是30M/S,右边是linux下的速度,极限速度在50M/S.

revolver rudp不仅在网络好的情况下可以有很好的速度,在比较差的网络情况下一样可以获得高吞吐量低延迟的通信效果。具体的可以到git上下载revolver做测试,下载:点击打开链接

这里我主要介绍revolver rudp的总体接口和通信协议流程

rudp总体框架与模块




从上图可以看出,rudp是基于revolver BASE之上的,先介绍下基本的模块组件:
RUDP packet是所有RUDP通信协议定义
RUDP recv buffer是RDUP接收缓冲模块,实现对RUDP数据接收策略和反馈的核心控制模块。
RUDP send buffer是RUDP发送缓冲模块,实现RUDP的发送策略、叠包策略、发送速度控制、报文重发等。
RUDP CCC 是RUDP发送速率控制和网络状态监测模块,实现对慢启动、快恢复、及时平衡、RTT评估等。
RUDP SOCKET是RUDP的连接对象,实现握手、数据收发、连接断开、心跳等功能。
RUDP Stream是RUDP流对象封装
RUDP Interface是RUDP连接对象管理和接口控制器,实现对多RUDP连接的管理和控制的模块


rudp interface

RUDP interface是RUDP总体外部接口,由以下宏定义构成:
#define init_rudp_socket() \CREATE_RUDP()#define destroy_rudp_socket() \DESTROY_RUDP()//创建一个RUDP SOCKET#define rudp_socket()\RUDP()->create_socket()//正常关闭#define rudp_close(rudp_id) \RUDP()->close_socket(rudp_id)//强制关闭#define rudp_force_close(rudp_id) \RUDP()->force_close_socket(rudp_id)//绑定本地地址,一般是本地UDP对象的地址#define rdup_bind(rudp_id, local_addr) \RUDP()->bind(rudp_id, local_addr)//连接远端#define rudp_connect(rudp_id, remote_addr) \RUDP()->connect(rudp_id, remote_addr)//发送数据#define rudp_send(rudp_id, data, data_size) \RUDP()->send(rudp_id, data, data_size)//接受数据#define rudp_recv(rudp_id, data, data_size) \RUDP()->recv(rudp_id, data, data_size)//设置属性#define rudp_setoption(rudp_id, op_type, op_value) \RUDP()->setoption(rudp_id, op_type, op_value)//获取错误码#define rudp_error(rudp_id) \RUDP()->get_error(rudp_id)//获取发送带宽#define rudp_recv_bandwidth(rudp_id) \RUDP()->recv_bandwidth(rudp_id)//获取接受带宽#define rudp_send_bandwidth(rudp_id) \RUDP()->send_bandwidth(rudp_id)//获取RUDP 发送缓冲区的数据大小#define rudp_send_cache_size(rudp_id) \RUDP()->send_cache_size(rudp_id)//获取RUDP 接收缓冲区的数据大小#define rudp_recv_cache_size(rudp_id) \RUDP()->recv_cache_size(rudp_id)

这个是参考了socket API进行封装的,让开发者用起来更加亲切。

rudp socket

rudp socket是个RUDP连接对象,是整个RUDP模块的核心,连接的开始、维持和结束都是由其控制的,rudp socket可以设置各种属性,属性的描述如下:
enum RUDPOptionType{//心跳的时间周期,以毫秒为单位RUDP_KEEPLIVE= 1,//NAGLE算法开关RUDP_NAGLE,//接受缓冲区大小RUDP_RECV_BUFF_SIZE,//发送缓冲区大小RUDP_SEND_BUFF_SIZE,//RUDP连接超时断开的KEEPLIVE周期数RUDP_TIMEOUT_COUNT,};

rudp socket也会产生各种错误,错误码定义如下:
enum RUDPErrorCode{RUDP_SUCCESS= 0,RUDP_BIND_FAIL= 1,RUDP_CONNECT_FAIL= 2,RUDP_SEND_ERROR= 3,RUDP_SEND_EAGIN= 4,};

rudp socket接口定义:

class RUDPSocket : public IRUDPNetChannel,public CEventHandler{.....//外部控制方法public:int32_topen(int32_t rudp_id_); //打开voidclose();//关闭voidforce_close();//强制关闭voidreset();//重置int32_tsetoption(int32_t op_type, int32_t op_value);//设置属性int32_tbind(uint8_t index, uint8_t title);//绑定通信句柄int32_tconnect(const Inet_Addr& remote_addr);//发起连接int32_tsend(const uint8_t* data, int32_t data_size);//发送数据int32_trecv(uint8_t* data, int32_t data_size);//接收数据public://BUFFER状态接口,BUFFER可以进行数据发送通告virtual voidon_write();//buffer可以进行数据读取virtual voidon_read();//错误通告virtual voidon_exception();...};

rudp的协议

RUDP定义了一系列通信协议来作为RUDP通信的手段,主要有握手协议、挥手协议、状态报告协议、数据协议。以下是具体的定义:
//连接保持协议#define RUDP_SYN0x10//主动发起连接#define RUDP_SYN20x11//发起连接返回包#define RUDP_SYN_ACK        0x02//SYN2的ACK#define RUDP_FIN0x13//主动发起关闭#define RUDP_FIN20x14//关闭返回包#define RUDP_KEEPALIVE        0x15//心跳包#define RUDP_KEEPALIVE_ACK        0x16//心跳返回包//数据协议#define RUDP_DATA0x20//可靠数据#define RUDP_DATA_ACK        0x23//可靠数据确认#define RUDP_DATA_NACK        0X24//丢包确认
具体的协议实现可以查看rudp/rudp_packet.h文件。这里就不一一介绍了,我们这里重点介绍协议的流程图

握手流程:


数据传输流程:

挥手断开流程:














1 0
原创粉丝点击