在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的总体接口和通信协议流程
#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)
enum RUDPOptionType { //心跳的时间周期,以毫秒为单位 RUDP_KEEPLIVE = 1, //NAGLE算法开关 RUDP_NAGLE, //接受缓冲区大小 RUDP_RECV_BUFF_SIZE, //发送缓冲区大小 RUDP_SEND_BUFF_SIZE, //RUDP连接超时断开的KEEPLIVE周期数 RUDP_TIMEOUT_COUNT, };
enum RUDPErrorCode { RUDP_SUCCESS = 0, RUDP_BIND_FAIL = 1, RUDP_CONNECT_FAIL = 2, RUDP_SEND_ERROR = 3, RUDP_SEND_EAGIN = 4, };
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(); ... };
//连接保持协议 #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文件。这里就不一一介绍了,我们这里重点介绍协议的流程图