UDT协议解析及C/C++代码实现
基于 UDP 的協(xié)議 (UDT) 是一種高性能數(shù)據(jù)傳輸協(xié)議。用于廣域高速網(wǎng)絡(luò)上的分布式數(shù)據(jù)密集型應(yīng)用程序。 UDT 使用 UDP 傳輸具有自己的可靠性控制和擁塞控制機(jī)制的批量數(shù)據(jù)。 新協(xié)議可以以比 TCP 高得多的速度傳輸數(shù)據(jù)。 UDT 也是一個(gè)高度可配置的框架,可以適應(yīng)各種擁塞控制算法。
為什么需要使用UDT?
UDT 的最初(和主要)目的是為廣域網(wǎng)上的分布式數(shù)據(jù)密集型應(yīng)用程序提供高性能傳輸接口,因?yàn)樾屎凸皆?#xff0c;TCP 很少能很好地工作。它也可以用于 TCP 不適合的其他情況(例如,多媒體流、防火墻穿孔、部分可靠性等)
沒有明確的標(biāo)準(zhǔn)來(lái)確定何時(shí)使用 UDT 或何時(shí)不使用。一般來(lái)說(shuō),如果對(duì) TCP 的性能或功能不滿意,UDT 可能是你所需要的,尤其是在少量批量源共享豐富帶寬的高速網(wǎng)絡(luò)中。
UDT數(shù)據(jù)包
UDT有兩種包:數(shù)據(jù)包和控制包;數(shù)據(jù)包。 它們通過第 1 位(標(biāo)志位)來(lái)區(qū)分包頭。
數(shù)據(jù)包頭從 0 開始。包序號(hào)使用標(biāo)志位之后的 31 位。 UDT 使用基于數(shù)據(jù)包的排序,即每發(fā)送一次,序列號(hào)加1數(shù)據(jù)包按照包發(fā)送的順序。序號(hào)是將其增加到最大數(shù)量 (2^31 - 1) 后進(jìn)行包裝。
數(shù)據(jù)包頭結(jié)構(gòu)如下:
以上是發(fā)送數(shù)據(jù)包時(shí)的 32 位時(shí)間戳和目標(biāo)套接字 ID。時(shí)間戳是一個(gè)相對(duì)值開始。
UDT控制包和類型信息
UDT中有8種類型的控制包和類型信息被放在標(biāo)題的位域 1 - 15 中。 內(nèi)容以下字段取決于數(shù)據(jù)包類型。 前 128 位必須存在于數(shù)據(jù)包頭中,而可能存在空控件信息字段,取決于數(shù)據(jù)包類型。
特別是,UDT 對(duì) ACK 數(shù)據(jù)包使用子序列。 每個(gè) ACK 包被分配一個(gè)唯一遞增的 16 位序列號(hào),即與數(shù)據(jù)包序號(hào)無(wú)關(guān)。 ACK序列number 使用控制數(shù)據(jù)包中的第 32 - 63 位。 ACK 序列號(hào)范圍從 0 到 (2^31 - 1)。
協(xié)議連接握手
握手包有如下信息(假設(shè)UDT 套接字 A 將此握手發(fā)送給 B):
Version: 32 位,UDT 版本。
Type:32 位,套接字類型(STREAM 或 DGRAM)。
Initial Sequence Number:32位,初始包序號(hào)。
MTU:32 位,最大數(shù)據(jù)包大小(包括 UDP/IP 標(biāo)頭)。
Flow Window:32位,最大流窗口大小。
Requested Type: 32 位,連接類型(常規(guī)或集合) 。
ID:32位,套接字ID。
SYN cookie:32 位,SYN cookie。
Peer IP Address:128位,對(duì)端UDP套接字的IP地址 。
當(dāng)服務(wù)器第一次收到客戶端的連接請(qǐng)求時(shí),它根據(jù)客戶端地址和一個(gè)密鑰并將其發(fā)送回客戶端。然后客戶端必須發(fā)送將相同的 cookie 返回到服務(wù)器。
服務(wù)器在收到握手包和正確的cookie時(shí),將數(shù)據(jù)包大小和最大窗口大小與其自己的值進(jìn)行比較并將其自己的值設(shè)置為較小的值。
來(lái)自客戶端的連接類型應(yīng)設(shè)置為 1。
來(lái)自服務(wù)器的響應(yīng)應(yīng)設(shè)置為 -1
客戶端還應(yīng)該檢查響應(yīng)是否來(lái)自服務(wù)器原始請(qǐng)求已發(fā)送至。
保持活動(dòng)狀態(tài)
確認(rèn)(ACK)
在收到 ACK 數(shù)據(jù)包時(shí):更新最大的確認(rèn)序列號(hào)。 在這個(gè)ACK中發(fā)回一個(gè)ACK序列號(hào)相同的ACK2。更新 RTT 和 RTTVar。將 ACK 和 NAK 周期都更新為 4 * RTT + RTTVar + SYN。 更新流窗口大小、更新估計(jì)的鏈路容量、更新發(fā)送者的緩沖區(qū)、更新發(fā)件人的丟失列表。
Ack Squence Number:32 bits,所有數(shù)據(jù)包的序號(hào)以前的數(shù)據(jù)包已經(jīng)收到。
RTT (microseconds):32 位,RTT(以微秒為單位)。
RTT Variance (microseconds):32位,RTT方差。
Buffer Available (packets):32位,可用緩沖區(qū)大小(以字節(jié)為單位)。
Rate (packets/second):32 位:數(shù)據(jù)包接收率(以數(shù)據(jù)包數(shù)量計(jì)/ 每秒)。
Link Capacity (packets/second):32 位,估計(jì)的鏈路容量(以數(shù)據(jù)包數(shù)計(jì)/每秒) 。
否定確認(rèn) (NAK)
在收到 NAK 數(shù)據(jù)包時(shí):將 NAK 中攜帶的所有序列號(hào)添加到發(fā)送者的損失中列表。
Missing Sequence Number:32位壓縮丟失信息的整數(shù)數(shù)組。
關(guān)機(jī)
如果其中一個(gè)連接的 UDT 實(shí)體正在關(guān)閉,它將發(fā)送一個(gè)關(guān)閉消息給對(duì)端。對(duì)端,收到此信息后
消息,也將被關(guān)閉。
此關(guān)閉消息,使用 UDP,只發(fā)送一次,不保證能收到。
確認(rèn)(ACK2)
在收到 ACK2 數(shù)據(jù)包時(shí): 在 ACK History Window 中根據(jù) 此 ACK2 中的 ACK 序列號(hào)。更新已確認(rèn)的最大 ACK 號(hào)。根據(jù)ACK2到達(dá)時(shí)間和ACK計(jì)算新的rtt出發(fā)時(shí)間。
UDT協(xié)議解析C/C++代碼實(shí)現(xiàn)
static void dissect_udt(u_char *udt_data, int offset, int Payload_len) {udt_conv = (udt_conversation *)malloc(sizeof(udt_conversation));if (udt_conv == NULL) {return ;}if (dissect_udt_heur(udt_data, offset, Payload_len))return ;if (is_control) {const char *typestr = val_to_str(type, udt_packet_types);switch (type) {case UDT_PACKET_TYPE_ACK:...break;case UDT_PACKET_TYPE_ACK2:...break;case UDT_PACKET_TYPE_NAK: {unsigned int max = Payload_len;if (max > UDT_MAX_NAK_LENGTH)max = UDT_MAX_NAK_LENGTH;for (i = UDT_CONTROL_OFFSET; i <= (max-4) ; i = i + 4) {uint32_t start, finish;int is_range;is_range = ntohl(*(uint32_t*)(udt_data + offset + i)) & 0x80000000;start = get_sqn(udt_conv, ntohl(*(uint32_t*)(udt_data + offset + i)) & 0x7fffffff);if (is_range) {if (i > (max-8)) {...break;}finish = get_sqn(udt_conv, ntohl(*(uint32_t*)(udt_data + offset + i + 4)) & 0x7fffffff);...i = i + 4;} else {...}}...break;}default:...break;}}else {...}運(yùn)行結(jié)果:
總結(jié)
UDT是一種高性能數(shù)據(jù)傳輸協(xié)議。它專為通過高速?gòu)V域網(wǎng) (WAN) 大量傳輸大型數(shù)據(jù)集而設(shè)計(jì)。基于 UDP 的協(xié)議是 TCP 協(xié)議的一種更有效的替代方案,并且可以以更高的速度傳輸數(shù)據(jù)。
歡迎關(guān)注微信公眾號(hào)【程序猿編碼】,需要UDT協(xié)議解析完整源碼的添加本人微信號(hào)(c17865354792)
參考:http://tools.ietf.org/search/draft-gg-udt-03
總結(jié)
以上是生活随笔為你收集整理的UDT协议解析及C/C++代码实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 真格投资汇总
- 下一篇: s3c2440移植MQTT