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

在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_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文件。这里就不一一介绍了,我们这里重点介绍协议的流程图

握手流程:


数据传输流程:

挥手断开流程:














  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值