輕量用戶數據報協定
互聯網協定套組 |
---|
應用層 |
傳輸層 |
網絡層 |
連結層 |
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).