輕量用戶數據報協議
UDP-Lite(Lightweight User Datagram Protocol[1](輕量用戶數據報協議),或者簡稱:UDP Lite),是一種無連接通信的傳輸層協議,允許將有潛在損壞的數據負載發送給接收方,而不會被接收方直接丟棄,因為它允許一些應用層協議(例如一些視頻編碼傳輸的協議)在了解自己應用數據的損壞影響的情況,對數據完整度的控制決定。它定義於RFC 3828。[1]
協議介紹
UDP-Lite是基於用戶數據報協議(UDP),但又不同於UDP,它允許對數據報的任意長度計算相應的校驗和進行驗證保護,通過UDP數據包頭的「報文長度」字段來控制需要計算校驗和的數據包長度,從而容許沒被校驗和覆蓋的數據部分可能有損地傳輸。它被用於設計多媒體數據傳輸協議,例如VoIP或流視頻協議,這些協議會認為接收有一定程度損壞的數據比沒接收到數據要好,對於其他傳輸層協議,例如傳輸控制協議(TCP)、用戶數據報協議,校驗和會覆蓋整個數據包的負載,一旦數據包即使有一個字節的損壞,接收方都會因為校驗和驗證失敗而丟棄整個數據包,單個字節的錯誤會影響整個數據包的接收,但對於這些應用層協議來說,這些損壞是微不足道的。
對於大部分現在多媒體編解碼處理程序,其處理的應用數據本身就內建了對數據錯誤的檢測和回放時的錯誤糾正的機制。UDP-Lite很適合配合這些應用程序使用,因為這些應用本身能接受有損壞的應用數據,能容許少量的數據損壞被接收而非因為校驗和錯誤導致整個數據被丟棄。應用層了解自己應用數據各部分的重要性,從而允許負載數據前部分受校驗和保護,而非整個數據包強制受校驗和保護。在Hammer等人的研究中,UDP-Lite與AMR編解碼器結合使用,可在有損網絡條件下提高語音質量。[2]
由於數據鏈路層也存在校驗和機制用於丟棄數據有損壞的數據幀,所以UDP-Lite也需要了解其數據鏈路層,從而需要相應的驅動程序調整。
UDP-Lite的IP協議號為136,可以使用互聯網號碼分配局(IANA)分配給UDP的相同功能端口。為了和UDP保持兼容,UDP-Lite使用和UDP、TCP相同的校驗和算法。[3]
實現支持
以下操作系統有相應的實現支持:
使用
在Berkeley套接字中,使用UDP-Lite的話,需要在調用socket創建方法socket時增加第三個參數值IPPROTO_UDPLITE[8]:
int fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDPLITE);
然後在設置socket參數方法setsockopt添加控制校驗和需要覆蓋長度的控制參數(計算長度值是從數據包頭開始):
int val = 20; /* 8字节长的包头 + 12字节的负载长度 */
(void)setsockopt(fd, SOL_UDPLITE, UDPLITE_SEND_CSCOV, &val, sizeof val);
/* 如果实际负载长度小于12字节,则等同整个数据包都被校验和覆盖 */
默認情況下,接收方將丟棄所有校驗和未完全覆蓋的數據包,如同UDP那樣,所以接收方也需要類似的接收設置:
int val = 20; /* 8字节长的包头 + 12字节的负载长度 */
(void)setsockopt(fd, SOL_UDPLITE, UDPLITE_RECV_CSCOV, &val, sizeof val);
這樣至少保證負載長度為12字節長的部分數據被校驗和保護,任何少於12字節長負載的數據包會被協議視為壞包而丟棄,而如果數據包的覆蓋長度值至少為20字節長(包括數據包頭),並且其校驗和正確,則將其交付給應用層的應用程序。如果校驗和不正確,數據包同樣被丟棄。校驗和覆蓋值可以等於0或大於等於8字節時,也就是校驗和的校驗部分至少包括數據包頭,以防止一些對所有流量都感興趣的嗅探器。
參考文獻
- ^ 1.0 1.1 Fairhurst, Godred. The Lightweight User Datagram Protocol (UDP-Lite). tools.ietf.org. [2020-03-08]. (原始內容存檔於2021-04-23) (英語).
- ^ Corrupted Speech Data Considered Useful, 2003. [2012-01-12]. (原始內容存檔於2015-12-22).
- ^ Computing the Internet Checksum, RFC 1071. [2012-01-12]. (原始內容存檔於2021-05-02).
- ^ 存档副本. [2020-03-08]. (原始內容存檔於2020-12-22).
- ^ Commit message for introduction into CURRENT. [2014-07-26]. (原始內容存檔於2017-07-06).
- ^ udplite(7) - Linux manual page. man7.org. [2020-03-08]. (原始內容存檔於2021-01-22).
- ^ Laurent Guillo, Cécile Marc. WULL: A Windows UDP-Lite library (PDF). IRISA. 10 January 2005 [2015-12-15]. (原始內容存檔 (PDF)於2014-08-10).
- ^ UDP-Lite Howto (kernel and userland applications). [2015-10-11]. (原始內容存檔於2021-03-23).