首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

UDP 協議深度解析:從封包格式到 Socket 程式設計要點

     編輯:VC 教學

協議定位

UDP(User Datagram Protocol,RFC 768)位於傳輸層,提供**無連線、不可靠、無序**的資料報傳遞服務。適用於「快、少、可容忍丟包」場景:DNS、NTP、VoIP、遊戲狀態同步、廣播發現等。

UDP 資料報頭部結構(8 位元組)

 0      7 8     15 16    23 24    31
+--------+--------+--------+--------+
|     Source Port      | Destination Port |
+--------+--------+--------+--------+
|     Length           |   Checksum       |
+--------+--------+--------+--------+
  • Source Port (16bit):可選,0 表示無回覆埠。
  • Destination Port (16bit):必填,目標應用埠。
  • Length (16bit):整個 UDP 資料報長度(含頭部),最小 8。
  • Checksum (16bit):覆蓋偽頭部(源/目 IP、協議號 17、UDP 長度)+ UDP 頭部 + 數據。全 0 表示不計算校驗和。

偽頭部與校驗和計算

為防止錯誤遞送,校驗和包含 IP 層資訊:

struct PseudoHeader {
    uint32_t src_ip;
    uint32_t dst_ip;
    uint8_t  zero;
    uint8_t  protocol; // 17
    uint16_t udp_len;
};
// 計算:將偽頭部 + UDP頭部 + 數據 視為 16bit 字序列求和,溢位回卷,最後取反。

Socket 程式設計關鍵點

1. 建立 Socket

int sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

2. 綁定本地埠(Server 必須,Client 可選)

sockaddr_in addr{};
addr.sin_family = AF_INET;
addr.sin_port = htons(LOCAL_PORT);
addr.sin_addr.s_addr = INADDR_ANY;
bind(sock, (sockaddr*)&addr, sizeof(addr));

3. 發送/接收

// 發送
sendto(sock, buf, len, 0, (sockaddr*)&dst, sizeof(dst));

// 接收(阻塞)
sockaddr_in from; socklen_t flen = sizeof(from);
int n = recvfrom(sock, buf, MAX, 0, (sockaddr*)&from, &flen);

4. 進階選項

  • 廣播:setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on)),目標 IP 設為 255.255.255.255 或子網廣播位址。
  • 多播:IP_ADD_MEMBERSHIP 加入組播群組,IP_MULTICAST_TTL 設定跳數。
  • 非阻塞/異步:fcntl(sock, F_SETFL, O_NONBLOCK) 或 WSAAsyncSelect/IOCP。
  • 封包資訊:IP_PKTINFO (Linux) / IP_RECVDSTADDR (BSD) 獲取目的 IP/介面,實現多介面 Server 回覆正確源 IP。

常見誤區與最佳實踐

誤區正確做法
假設 UDP 不會丟包/亂序應用層實現 ACK/重傳/序號/去重(如 QUIC、RUDP、ENet)
單次 sendto 必對應單次 recvfrom網路可能合併/分片,應用層自行定義幂邊界(長度前綴/分隔符)
忽略 MTU 導致 IP 分片載荷控制在 1400 字節內(乙太網 MTU 1500 - IP 20 - UDP 8)
不驗證來源 IP/埠recvfrom 返回的 sockaddr_in 必須校驗,防偽造/放大攻擊

UDP vs TCP 選型速查

  • **選 TCP**:檔案傳輸、HTTP、資料庫、聊天訊息(需可靠有序)。
  • **選 UDP**:即時語音/視訊、遊戲移動同步、DNS 查詢、IoT 心跳、廣播服務發現。
  • **混合**:關鍵控制面用 TCP,高頻數據面用 UDP(如 WebRTC、HTTP/3)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved