在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 interface
#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)
rudp socket
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();
...
};
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文件。這裏就不一一介紹了,我們這裏重點介紹協議的流程圖