UDP
概念
用戶數據報協議UDP(User Datagram Protocol):是無連接的、盡最大可能交付,沒有擁塞控制,面向報文(對于應用程序傳下來的報文不合并也不拆分,只是添加UDP首部),支持一對一、一對多、多對一和多對多的交互通信。例如:視頻傳輸、實時通信
首部格式
首部字段只有8個字節,包括源端口、目的端口、長度、檢驗和
源端口:在需要對方回信時使用,不需要時可用全0
目的端口:表示接收端端口
長度:該字段保存了UDP首部的長度跟數據長度之和。實際最大長度不可能超過65507字節,2^16 - 1(65535)- 8字節UDP報頭 - 20字節IP頭部
校驗和:為了提供可靠的UDP首部和數據。檢測UDP用戶數據報在傳輸中是否有錯,有錯就丟棄
校驗和作用
UDP校驗和只負責檢驗此數據是否有錯,并不糾錯,如果錯了,就丟棄。
UDP傳輸協議的不可靠含義是:即使該數據報丟失,發送方也不知道。但是,對于每個數據報,還是要求盡可能提高傳輸可靠性。檢驗和就是為了盡可能提高本數據的可靠性手段
偽首部
在計算檢驗和時,要在 UDP 用戶數據報之前增加 12 個字節的偽首部。
偽首部共12個字節,包括:源IP地址、目的IP地址、UDP數據長度、協議類型和填補一個字節的0x0
所謂“偽首部”是因為這種偽首部并不是 UDP 用戶數據報真正的首部。只是在計算檢驗和時,臨時添加在 UDP 用戶數據報前面,得到一個臨時的 UDP 用戶數據報。檢驗和就是按照這個臨時用戶數據報來計算的。偽首部既不向下傳也不向上遞交,而僅僅是為了計算檢驗和
校驗和的計算
如果不使用校驗和,該字段應被填充為0。這種情況下,由于不進行校驗和計算,協議處理的開銷就會降低,從而可以提高數據轉發的速度(但數據受到攻擊或出錯時,無法檢測出來)
在計算校驗和時,為了能夠計算校驗和,需要在UDP數據包前添加一個“偽首部”( 如上圖)。偽首部包括了IPv4頭部中的一些信息,但它并不是發送IP數據包時使用的IP數據包的頭部,而只是一個用來計算校驗和而已。接收主機在收到UDP報文以后,從IP首部獲悉IP地址信息構造UDP偽首部,再進行校驗和計算
簡單來說,計算校驗和時需要用到:偽首部、UDP首部、UDP數據
UDP校驗和的計算過程:
把偽首部添加到UDP中
將校驗和字段置0
把所有比特位按16-bit(2字節)一組進行劃分
將劃分后的組進行相加,當求和遇到溢出的時候,進行回卷(16位數加法運算時,如果進位到17位,則將17位和后16位進行加法運算)
最后得到一個16位的數,該數取反即位校驗和
注意
UDP首部中校驗和的計算方法有些特殊。在計算校驗和時,要在UDP用戶數據報之前增加12個字節的偽首部
偽首部既不向下傳送也不向上遞交,而僅僅是為了計算校驗和
與IP數據報的校驗和只校驗IP數據報的首部不同,UDP的校驗和是把首部和數據部分一起都校驗
遺留問題
偽首部為什么包含這幾個部分,特別是UDP長度
偽首部中為什么需要填補一位的0x0