UDP校驗和計算-理解和java實現

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章