概述
在revolver框架中实现了一个高效可靠的RUDP通信方式,这个通信方式是基于UDP实现一种模拟TCP传输数据的行为。在很多实际应用中,udp/TCP都不是最好的通信方式,例如:点对点文件传输、视频数据高速传输、服务器之间大数据备份同步、高实时rts操作类网游等。TCP和UDP在一定程度上是无法满足此类要求。故revolver实现了一套可靠UDP的传输方式。我们先来看看它的传输效率,以下是WINDOWS和LINUX下它的单连接传输速度。
左边的是WIN7下的速度,我测试的极限大概是30M/S,右边是linux下的速度,极限速度在50M/S.
revolver rudp不仅在网络好的情况下可以有很好的速度,在比较差的网络情况下一样可以获得高吞吐量低延迟的通信效果。具体的可以到git上下载revolver做测试,下载:点击打开链接https://github.com/yuanrongxi/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_t open(int32_t rudp_id_); //打开
void close(); //关闭
void force_close(); //强制关闭
void reset(); //重置
int32_t setoption(int32_t op_type, int32_t op_value); //设置属性
int32_t bind(uint8_t index, uint8_t title); //绑定通信句柄
int32_t connect(const Inet_Addr& remote_addr); //发起连接
int32_t send(const uint8_t* data, int32_t data_size); //发送数据
int32_t recv(uint8_t* data, int32_t data_size); //接收数据
public:
//BUFFER状态接口,BUFFER可以进行数据发送通告
virtual void on_write();
//buffer可以进行数据读取
virtual void on_read();
//错误通告
virtual void on_exception();
...
};
rudp的协议
RUDP定义了一系列通信协议来作为RUDP通信的手段,主要有握手协议、挥手协议、状态报告协议、数据协议。以下是具体的定义:
//连接保持协议
#define RUDP_SYN 0x10 //主动发起连接
#define RUDP_SYN2 0x11 //发起连接返回包
#define RUDP_SYN_ACK 0x02 //SYN2的ACK
#define RUDP_FIN 0x13 //主动发起关闭
#define RUDP_FIN2 0x14 //关闭返回包
#define RUDP_KEEPALIVE 0x15 //心跳包
#define RUDP_KEEPALIVE_ACK 0x16 //心跳返回包
//数据协议
#define RUDP_DATA 0x20 //可靠数据
#define RUDP_DATA_ACK 0x23 //可靠数据确认
#define RUDP_DATA_NACK 0X24 //丢包确认
具体的协议实现可以查看rudp/rudp_packet.h文件。这里就不一一介绍了,我们这里重点介绍协议的流程图
握手流程:
数据传输流程:
挥手断开流程:
如有问题,请进入revolver rudp QQ群(717185367)讨论
最后
以上就是碧蓝哑铃为你收集整理的C++高性能服务框架revover:rudp总体介绍(可靠UDP传输)rudp总体框架与模块rudp的协议的全部内容,希望文章能够帮你解决C++高性能服务框架revover:rudp总体介绍(可靠UDP传输)rudp总体框架与模块rudp的协议所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复