UDP概述
UDP是User Datagram Protocol的簡稱,中文名是用戶數據報協議,是OSI(Open System Interconnection,開放式系統互聯)參考模型中一種無連接的傳輸層協議,提供面向事務的簡單不可靠信息傳送服務,UDP在IP報文的協議號是17。
UDP首部
用戶數據報UDP有兩個字段:數據字段和首部字段。首部字段很簡單,只有8個字節,有四個字段組成,每個字段的長度都是兩字節。各段意義如下:
源端口:源端口號。在需要對方回信時選用。不需要時可用全0。
目的端口:目的端口號。這在終點交付報文時必須要使用到。
長度:UDP用戶數據報的長度,其最小值是8(僅首部)。
校驗和:檢測UDP用戶數據報在傳輸中是否有錯。有錯就丟棄。
UDP計算校驗和
UDP計算校驗和的方法和IP數據報首部校驗和的方法相似。不同的是:IP數據報校驗和只校驗IP數據報的首部,但UDP的校驗和是把首部和數據部分一起都檢驗。
UDP的校驗和需要計算UDP首部加數據荷載部分,但也需要加上UDP僞首部。這個僞首部指,源地址、目的地址、UDP數據長度、協議類型(0x11),協議類型就一個字節,但需要補一個字節的0x0,構成12個字節。僞首部+UDP首部+數據一起計算校驗和。
UDP檢驗和的計算方法是:
1.按每16位求和得出一個32位的數;
2.如果這個32位的數,高16位不爲0,則高16位加低16位再得到一個32位的數;
3.重複第2步直到高16位爲0,將低16位取反,得到校驗和。
UDP實際例子
校驗和的計算公式如下:(udp僞首部+udp報文(除了校驗和))
所有都按照16位相加=源ip+目的ip+協議號(17)+包長度
+源端口號+目的端口號+包長度
+數據
java 代碼參考
package mian;
/**
*
* UDP校驗和計算
* @author xuminggang
*
* @Version 2020年5月20日
*/
public class UDPCheck {
public static void main(String[] args) {
int[] arr = {0xc0a8,0x016a,0x0b6f,0x6f6f,0x0011,0x0011,0xf83d,0x3039,0x0011,0x6865
,0x6c6c,0x6f20,0x5544,0x5000};
udpCheck(arr);
}
public static void udpCheck(int[] arr) {
int sum = 0;
for(int num:arr) {
sum += num;
if(sum>>>16>0) {
sum = (sum >>> 16) + (sum & 0xffff);
}
}
//System.out.println(sum);
System.out.println(Integer.toBinaryString(sum));
//取低16位
System.out.println(Integer.toHexString(~sum).substring(4));
}
}
輸出結果
100111011010010
b12d