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文件。這裏就不一一介紹了,我們這裏重點介紹協議的流程圖

握手流程:


數據傳輸流程:

揮手斷開流程:

如有問題,請進入revolver rudp QQ羣(717185367)討論












發佈了39 篇原創文章 · 獲贊 76 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章