Wiki
UDP通訊
約 4 分鐘閱讀
本文由簡體中文內容確定性轉換,並受版本化術語表保護。
1.Linux UDP 通訊
UDP 通訊是 Linux 網路程式設計中非常常見的一種通訊方式。
相比 TCP,UDP 不需要提前建立連線,傳送方可以直接向指定 IP 和埠傳送資料。它的特點是簡單、延遲低、開銷小,但不保證資料一定送達,也不保證順序。
在機器人專案中,UDP 常用於高頻、即時、允許少量丟包的資料傳輸場景。
在實際專案中,UDP 通訊常見於:
- 雷射雷達資料傳輸
- 網路相機或感測器資料流
- 機器人狀態廣播
- 區域網裝置發現
- 遙控器或手柄資料傳輸
- 多機器人之間的簡單通訊
- 高頻狀態上報
- 對即時性要求高、但允許少量丟包的場景
UDP 的核心特點是快,但不可靠。因此它更適合“持續傳送的資料流”,而不是“必須保證每條訊息都送達”的場景。
1.1.UDP 通訊是什麼
UDP,全稱 User Datagram Protocol,是一種無連線的傳輸協議。
和 TCP 不同,UDP 通訊不需要建立連線。只要知道目標 IP 和埠,就可以直接傳送資料。
典型結構如下:
UDP Sender
↓
UDP Receiver
也可以是雙向通訊:
程序 A ←UDP→ 程序 B
常見概念包括:
| 概念 | 說明 |
|---|---|
| IP 地址 | 用來定位網路中的裝置 |
| 埠號 | 用來區分不同程式 |
| Datagram | UDP 資料包,一次傳送對應一個數據報 |
| 廣播 | 向區域網內多個裝置傳送資料 |
| 組播 | 向加入同一組播組的裝置傳送資料 |
| 丟包 | UDP 不保證資料一定送達 |
| 亂序 | UDP 不保證資料按順序到達 |
UDP 和 TCP 最大的區別是:TCP 是可靠位元組流,UDP 是不可靠資料包。
1.2.Linux 下常見 UDP 庫
Linux 下進行 UDP 通訊有多種方案,常見的包括:
| 方案 | 型別 | 特點 | 適合場景 |
|---|---|---|---|
| Linux socket API | Linux 原生介面 | 最底層、依賴少、通用性強 | 想深入理解網路通訊機制 |
| boost::asio | 通用 C++ 網路庫 | 支援同步/非同步 UDP,適合工程封裝 | 推薦用於 C++ 專案 |
| Qt Network | Qt 網路模組 | 和 Qt 介面程式結合方便 | Qt 上位機 |
| Python socket | Python 標準庫 | 簡單方便,適合測試 | Python 除錯指令碼 |
| ROS 2 topic | ROS 2 通訊機制 | ROS 2 內部通訊方便 | ROS 2 系統內部資料傳輸 |
這些方案本質上都是為了完成 UDP 資料包的傳送和接收,只是封裝方式不同。
1.3.各方案對比
| 方案 | 優點 | 缺點 |
|---|---|---|
| Linux socket API | 原生、穩定、依賴少、通用性強 | 程式碼相對繁瑣,非同步處理麻煩 |
| boost::asio | C++ 工程友好,非同步 UDP 方便,適合封裝 driver | 需要理解 io_context、endpoint、socket 等概念 |
| Qt Network | 和 Qt 程式結合自然,適合上位機 | 不適合脫離 Qt 的底層 driver |
| Python socket | 上手快,適合測試 UDP 包 | 不適合作為 C++ 底層主線 |
| ROS 2 topic | ROS 2 內部通訊方便 | 不適合替代通用 UDP 學習 |
1.4.本教程建議選擇
本教程建議優先選擇:
boost::asio
原因是:
- 適合 C++ 工程開發
- 和 TCP、序列埠、定時器可以使用同一套 Boost.Asio 程式設計模型
- 支援同步和非同步 UDP 收發
- 不依賴 ROS 2,方便在普通 C++、OpenCV、Qt、嵌入式 Linux 專案中複用
- 適合封裝網路感測器、遠端遙控、狀態廣播等功能
推薦的工程結構是:
上层项目:ROS 2 / OpenCV / Qt / 普通 C++ 程序
↓
自己封装的 UdpSender / UdpReceiver 类
↓
boost::asio
↓
UDP socket
↓
雷达 / 网络设备 / 远程控制端
1.5.TCP 和 UDP 怎麼選
TCP 和 UDP 都很常用,但適合的場景不同。
| 對比項 | TCP | UDP |
|---|---|---|
| 是否連線 | 需要建立連線 | 不需要建立連線 |
| 可靠性 | 可靠傳輸 | 不保證送達 |
| 順序 | 保證順序 | 不保證順序 |
| 延遲 | 相對更高 | 相對更低 |
| 適合資料 | 命令、配置、檔案、日誌 | 高頻資料、廣播、即時狀態 |
| 典型場景 | 遠端控制、伺服器通訊、引數配置 | 雷達資料、遙控資料、狀態廣播 |
簡單理解:
TCP:我要确保这条消息送到
UDP:我要快速持续发送,偶尔丢一包也能接受
1.6.與 ROS 2 的關係
學習 UDP,並不代表要用 UDP 替代 ROS 2 的 topic。
在 ROS 2 系統內部,節點之間通訊通常優先使用 ROS 2 自己的通訊機制。而 UDP 更適合用來連線 ROS 2 系統之外的網路裝置,或者實現輕量級的遠端通訊。
例如:
激光雷达
↓
UDP 数据包
↓
自己封装的 UdpReceiver
↓
ROS 2 节点发布点云 / LaserScan
也可以用於:
远程遥控端
↓
UDP
↓
机器人主控程序
1.7.本章學習目標
學習完本章後,應該能夠掌握:
- UDP 通訊的基本概念
- UDP 和 TCP 的主要區別
- IP 地址、埠號、endpoint 的含義
- 使用 C++ 傳送和接收 UDP 資料
- 理解 UDP 丟包、亂序、廣播等特性
- 使用 Boost.Asio 封裝 UDP 通訊類
- 為後續雷達資料接收、遠端遙控、狀態廣播打基礎