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)討論