一、UDP頭部介紹
UDP(User Datagram Protocol)是一個提供無連接傳輸服務的協議,它被設計用於在IP網絡上發送短消息。
UDP標準的頭部長度為8個字節,由四個字段組成:源端口、目的端口、長度和檢驗和。
二、源端口和目的端口
源端口和目的端口是16位的整數,分別用於標識通信雙方的端口號。
端口號的範圍在0~65535之間,其中0~1023是保留端口號,1024~49151是註冊端口號,49152~65535是短暫端口號。在UDP通信時,使用的端口號一般都是註冊端口號。
struct udp_hdr { uint16_t src_port; // 源端口 uint16_t dst_port; // 目的端口 uint16_t length; // UDP數據長度 uint16_t checksum; // UDP校驗和 } __attribute__((packed));
三、長度
UDP長度表示UDP報文中數據的長度,它包括UDP頭部和應用數據部分的長度。UDP頭部固定為8個字節,所以長度字段的值必須加上8後才能得到UDP報文的總長度。
注意,長度字段是一個16位的無符號整數,所以UDP報文的最大長度為65,535字節。
四、校驗和
UDP校驗和用於檢測UDP報文傳輸中的錯誤,它是一種高效的檢錯手段。
校驗和的計算方法是將UDP報文中8位一組的所有16位數進行二進制反碼求和,然後對結果取反,得到的結果為校驗和。
如果UDP報文傳輸過程中發生了改變,則接收方計算出的校驗和與報文頭部中的校驗和不同,接收方必須將這個報文丟棄。
uint16_t in_cksum(uint16_t *addr, int len) { int nleft = len; uint32_t sum = 0; uint16_t *w = addr; uint16_t answer = 0; while (nleft > 1) { sum += *w++; nleft -= 2; } if (nleft == 1) { *(unsigned char *)(&answer) = *(unsigned char *)w; sum += answer; } sum = (sum >> 16) + (sum & 0xffff); sum += (sum >> 16); answer = ~sum; return answer; }
五、UDP頭部示例
下面是一個UDP頭部的示例:
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Source Port Number | Destination Port Number | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Length | Checksum | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | data | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
六、總結
UDP是一種用於提供無連接傳輸服務的協議,它提供了輕量級的、快速的數據傳輸服務。UDP頭部由源端口、目的端口、長度和校驗和四個字段組成,其中校驗和是用於檢測UDP報文傳輸中的錯誤,必不可少。我們需要了解UDP頭部各個字段的定義和計算方法,才能更好地理解和使用UDP協議。
原創文章,作者:PIVC,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/136111.html