UDP只在IP數據報服務之上增加了很少功能,即複用分用和差錯檢測功能。
應用層給UDP多長的報文,UDP就照樣發送,即一次發送一個完整報文
一、UDP首部格式
這裏的長度是指(首部+數據)
UDP校驗:
在發送端:
- 填上僞首部
- 全0填充檢驗和字段
- 全0填充數據部分
- 僞首部+首部+數據部分採用二進制反碼求和
- 把求和反碼填入檢驗和字段
- 去掉僞首部,發送
在接收端:
- 填上僞首部
- 僞首部+首部+數據部分採用二進制反碼求和(此時校驗和不爲0了)
- 結果全爲1則無差錯,否則發生差錯
二、用python實現UDP校驗和
實驗步驟:
①傳入一個16位整數數組
②每個數加起來,當和溢出時,回捲
③將所有數的和求反,這個值就是校驗和
④驗證校驗和的正確性:校驗和+所有16位整數 = -1
"""
@author: xsy
@date: 2020/3/28
@desc: UDP校驗和
"""
# 計算·udp校驗和(_data是一個16位整數的數組)
def calculate_udp_sum(_data):
_sum = 0x0
for d in _data:
_sum = _sum + (d & 0xffff)
# 溢出回捲
if _sum < 0xffff:
_sum = (_sum >> 16) + (_sum & 0xffff)
# 取反
return ~_sum
def check_ans(_ans, _data):
if ans + data[0] + data[1] + data[2] == -1:
print('校驗結果正確')
else:
print('校驗結果失敗')
# 測試數據
data = [0b0110011001100000, 0b0101010101010101, 0b1000111100001100]
# 校驗和
ans = calculate_udp_sum(data)
# 檢測UDP校驗和是否正確
check_ans(ans, data)