維修技師要替一顆高效能控制器更新軟體時,若更新檔有數百 MB,只靠 Classical CAN 慢慢傳送,等待時間可能成為整個維修流程的瓶頸。
如果車輛本來就有 Automotive Ethernet,診斷工具便可以先透過 IP 找到車輛,再建立 TCP 連線,啟用通往目標 ECU 的診斷路徑,最後傳送 Day 08 學過的 UDS 訊息。
這段互動可以先簡化成:
診斷工具
→ 透過 UDP 找到 DoIP Entity
→ 建立 TCP 連線
→ 完成 Routing Activation
→ 傳送承載 UDS 的 DoIP Diagnostic Message
→ DoIP Gateway 將訊息送往目標 ECU
這就是 **DoIP(Diagnostic communication over Internet Protocol,透過網際網路協定進行診斷通訊)**要處理的事情。
今天的核心問題是:UDS 搬到 Ethernet/IP 後,診斷工具如何找到車輛、啟用路由,再把訊息送到正確的 ECU?
讀完這篇文章,你應該能夠:
DoIP 是 ISO 13400 系列定義的 IP-based 車輛診斷通訊。
現行的 ISO 13400-2:2025 規範 Client DoIP Entity 與車內 Server 之間,如何使用 IP、TCP 與 UDP 建立、維持及路由診斷通訊。
它涵蓋的核心能力包括:
因此 DoIP 不是「把 UDS bytes 丟進一條 TCP 連線」這麼簡單。
它還定義了工具如何發現車輛、辨識 DoIP Entity、啟用診斷路徑,以及如何確認診斷訊息已被 DoIP 層接收或拒絕。
DoIP 的 IP 指 Internet Protocol,也就是使用 IP 的定址與傳輸生態系。
它可以運作在維修廠的區域網路、車輛與診斷工具之間的直連網路,或車內 Automotive Ethernet 上。
光看見 DoIP,不能推論車輛一定能從公開 Internet 直接連入。
能否遠端到達 DoIP 服務,仍取決於實際架構:
所以「使用 IP」和「可由全世界連線」是兩件不同的事。
Day 08 的 UDS on CAN 常透過 ISO-TP,把較長的 UDS 訊息拆成多個 CAN Frame。
這種方式很成熟,也能服務大量既有 ECU,但軟體映像與診斷資料持續增大後,頻寬與更新時間會變得更重要。
DoIP 的價值可以從四個方向理解:
| 需求 | DoCAN 常見情境 | DoIP 帶來的能力 |
|---|---|---|
| 傳輸容量 | 長資料要由 ISO-TP 切成多個 CAN/CAN FD Frame | 可使用 Ethernet/IP 與 TCP 傳送較大量資料 |
| 網路整合 | 工具與 ECU 依 CAN addressing 及 Gateway 規則通訊 | 可沿用 IP 位址、Switch、Router 與 Socket 生態系 |
| 目標選擇 | 依 CAN ID、addressing 與診斷路由設定 | 以 IP 找到 DoIP Entity,再用 Logical Address 指向診斷節點 |
| 架構擴充 | 適合既有 CAN ECU 與控制網路 | 適合 Ethernet Backbone、中央運算與高頻寬更新情境 |
這張表不是在說 DoIP 會取代所有 DoCAN。
DoIP Gateway 後方仍可能連著 CAN/CAN FD ECU,於是診斷資料到了 Gateway 後,還要再轉成 UDS on CAN。
這時 Ethernet 只加快工具到 Gateway 的一段路徑,端到端速度仍可能受下游網路、ECU Flash 速度與安全驗證流程限制。
DoIP 提供高頻寬診斷路徑的可能性,不代表每一顆 ECU 的更新都會自動變快。
Day 08 曾把 UDS、ISO-TP 與 CAN 分開。
今天保留 UDS 這個服務語言,把下層換成 DoIP 與 TCP/IP:

圖 1:UDS 定義診斷服務語意,DoIP 負責 IP-based 診斷承載、發現與路由,TCP/UDP、IP 及 Ethernet 則處理各自的傳輸層次。實際下游網路依車款而異
| 層次 | 代表規格或概念 | 負責的問題 |
|---|---|---|
| 診斷應用 | UDS/ISO 14229-1 | 要求 ECU 執行哪一項診斷服務? |
| 診斷承載與路由 | DoIP/ISO 13400-2 | 如何發現車輛、啟用路由並標示診斷來源與目標? |
| 傳輸 | TCP 或 UDP | 這類 DoIP 訊息需要連線式可靠傳輸,還是無連線發現? |
| 網路 | IPv4/IPv6 | IP packet 要送到哪一個 DoIP Entity? |
| Data Link/Physical | Ethernet/Automotive Ethernet | Frame 如何經由實體連線與 Switch 傳送? |
ISO 14229-2 讓 UDS Session Layer 和特定 Transport Protocol 解耦,因此同一個 0x22 ReadDataByIdentifier 可以走 DoCAN,也可以走 DoIP。
真正改變的是外層包裝與傳送路徑,不是 0x22 的服務語意。
一條 DoIP 診斷路徑至少會看見三種角色。
Tester 是外部診斷工具,也就是 DoIP Client。
它可能是維修電腦、產線測試設備或已取得授權的工程工具,負責:
DoIP Entity 是支援 DoIP Protocol 的車內節點。
它可能是:
實際車輛常讓中央 Gateway 或高效能控制器扮演 DoIP Entity,但不能只靠產品名稱判斷它是 Gateway 還是 Node。
目標 ECU 是實際處理 UDS Request 的 Server。
它可能直接支援 DoIP,也可能位於 DoIP Gateway 後方的 CAN/CAN FD 網路。
所以 Tester 建立連線的 IP 對象,不一定就是最後處理 0x22 或 0x34 的那顆 ECU。
DoIP 同時出現兩種容易混淆的位址。
| 位址 | 所在層次 | 主要用途 |
|---|---|---|
| IP Address | IP 網路層 | 讓封包到達 Tester 或 DoIP Entity 的網路介面 |
| Logical Address | DoIP 診斷層 | 標示診斷訊息的來源與目標診斷節點 |
假設 Tester 連到一個 DoIP Gateway,接著想讀取 Gateway 後方的 ADAS ECU:
目的 IP Address
→ 把 packet 送到 DoIP Gateway
DoIP Target Address
→ 告訴 Gateway 這筆診斷訊息要交給哪個 Logical ECU
IP Address 不能取代 DoIP Logical Address,Logical Address 也不是 Ethernet MAC Address。
這種分工讓一個 DoIP Gateway 可以代表多個車內診斷節點對外提供路由,也讓 Gateway 有機會依來源、目標與服務建立存取規則。
DoIP 沒有只選一種 Transport Protocol。
IANA 將 UDP port 13400 登記為 doip-disc,也就是 DoIP Discovery。
TCP port 13400 則登記為 doip-data。
可以先用下面的表格建立分工:
| 傳輸 | 典型 DoIP 工作 | 為什麼適合 |
|---|---|---|
| UDP | Vehicle Identification、Vehicle Announcement、Entity Status 與 Diagnostic Power Mode | 不必先建立連線,適合發現與簡短狀態交換 |
| TCP | Routing Activation、Alive Check 與 Diagnostic Message | 提供有序、可靠的 byte stream,適合持續診斷互動 |
UDP 沒有先建立 Session 的握手,因此適合讓工具在本地診斷網路尋找車輛。
但 UDP 本身不保證抵達、順序或不重複,應用層仍要處理 timeout、重試與重複訊息。
TCP 會先建立連線,並提供有序及可靠傳輸。
但 TCP 的「可靠」指 byte stream 傳送,不代表對端身分可信,也不代表資料已加密或獲得診斷授權。
從工具接上診斷網路到讀取 ECU 資料,可以拆成六個階段:

圖 2:DoIP 先用 UDP 發現車輛,再建立 TCP 連線並完成 Routing Activation,之後才交換 Diagnostic Message。Routing Activation 不會取代 UDS Session 與 SecurityAccess
Tester 與車輛先建立 Ethernet Link,再取得可互通的 IP 設定。
IP 位址可能由不同機制配置,實際流程要看車輛、測試設備與使用情境。
若 IP 子網路、VLAN 或實體 Link 都不通,後面的 DoIP Discovery 當然不會成功。
ISO 13400-3:2016 定義一種以 IEEE 802.3 100BASE-TX 為基礎的有線車輛介面,ISO 13400-4:2016 則規範以 ISO 15031-3 診斷接頭為基礎的高速 Ethernet Connector 要求與兩種 pin assignment。
不過,這不表示每一個實際車內 DoIP Link 都只能使用同一種外觀、PHY 或線束配置。
分析車輛時仍要確認實際 Connector、Activation Line、PHY 與網路拓樸。
Tester 可以送出 Vehicle Identification Request,DoIP Entity 再以 Vehicle Identification Response 回覆。
車輛也可以主動送出 Vehicle Announcement。
Identification Response/Announcement 可提供 VIN、DoIP Entity Logical Address 與 EID 等識別資訊,讓工具知道網路上有哪些可選擇的車輛或診斷入口。
Discovery 回覆的意義是「找到一個 DoIP Entity」,不是已經取得診斷權限。
Tester 選定 DoIP Entity 後,建立到 DoIP TCP port 的連線。
TCP 連線成功只能證明兩端已建立 Transport Layer 通道。
DoIP Entity 還沒有因此承諾替這個 Tester 路由所有診斷訊息。
Tester 在 TCP 連線上送出 Routing Activation Request,其中包含 Tester 的 Logical Address 與 Activation Type 等資料。
DoIP Entity 會依規則檢查這次要求,可能還要配合 OEM-specific authentication 或 confirmation。
接受後才回傳成功的 Routing Activation Response,讓該 TCP 連線進入可路由診斷訊息的狀態。
Routing Activation 的用途是啟用 DoIP 診斷路徑,它不等於:
0x27 SecurityAccess
換句話說,DoIP Routing Activation 與 UDS Diagnostic Session 位於不同層次。
路由啟用後,Tester 才在 TCP 連線上傳送 Payload Type 0x8001 的 DoIP Diagnostic Message。
Diagnostic Message Payload 先放入:
例如,下面是概念化的 UDS Request:
DoIP Source Address:0x0E80 教學用 Tester 位址
DoIP Target Address:0x1001 教學用 ECU 位址
UDS User Data :22 F1 90
22 F1 90 仍然是 Day 08 學過的 ReadDataByIdentifier,要求讀取 DID 0xF190。
前面的 Source/Target Address 則讓 DoIP Entity 知道訊息從哪裡來、要送到哪一個診斷節點。
回應方向會反過來:
DoIP Source Address:0x1001
DoIP Target Address:0x0E80
UDS User Data :62 F1 90 ...
以上 Logical Address 只用於教學,不代表任何特定車款的實際配置。
DoIP Entity 可以使用 Alive Check 確認已連線的 Tester 是否仍然存在,也會依連線狀態與資源限制管理 Socket。
診斷結束、TCP 連線關閉或網路中斷後,相關 DoIP 路由狀態也要正確清理。
UDS Session 與 Security Level 是否一併失效,則要再依 ECU 與整體診斷架構確認,不能只靠 TCP Socket 狀態推論。
每一筆 DoIP Message 前面都有 8 bytes 的 Generic Header:
| Byte 位置 | 長度 | 欄位 | 作用 |
|---|---|---|---|
| 0 | 1 byte | Protocol Version | 表示使用的 DoIP Protocol Version |
| 1 | 1 byte | Inverse Protocol Version | 放入 Protocol Version 的 bitwise inverse,協助偵測 Header 錯誤 |
| 2~3 | 2 bytes | Payload Type | 表示後面是哪一類 DoIP Message |
| 4~7 | 4 bytes | Payload Length | 表示後續 Payload 有多少 bytes |
| 8 之後 | 依類型而定 | Payload | Vehicle Identification、Routing Activation 或 Diagnostic Message 等內容 |
Inverse Protocol Version 是格式檢查,不是密碼學完整性保護。
攻擊者若能建立任意 DoIP Message,也能計算正確的反碼。
常見 Payload Type 可以整理成:
| Payload Type | 名稱 | 典型傳輸 |
|---|---|---|
0x0001 |
Vehicle Identification Request | UDP |
0x0004 |
Vehicle Announcement/Identification Response | UDP |
0x0005 |
Routing Activation Request | TCP |
0x0006 |
Routing Activation Response | TCP |
0x0007/0x0008 |
Alive Check Request/Response | TCP |
0x4001/0x4002 |
DoIP Entity Status Request/Response | UDP |
0x4003/0x4004 |
Diagnostic Power Mode Request/Response | UDP |
0x8001 |
Diagnostic Message | TCP |
0x8002 |
Diagnostic Message Positive Acknowledgement | TCP |
0x8003 |
Diagnostic Message Negative Acknowledgement | TCP |
這張表用來建立封包閱讀順序,不是所有版本與實作細節的完整清單。
遇到封包時,仍要先確認採用的 ISO 13400 版本與實際車輛設定。
這是 DoIP 初學最容易混淆的地方。
假設 Tester 送出一筆 0x8001 Diagnostic Message,DoIP Entity 回覆 0x8002 Diagnostic Message Positive Acknowledgement。
這項 ACK 提供的是 DoIP 層的早期回饋,表示診斷訊息已由 DoIP Entity 接收並能交給內部 ECU,或已送往目標網路。
它不代表目標 ECU 已接受 UDS 服務。
真正的 UDS 結果還要等另一筆 0x8001 Diagnostic Message 回來,檢查其中的 UDS User Data:
DoIP 0x8002 Positive ACK
→ DoIP 層接受這筆診斷訊息
DoIP 0x8001,UDS User Data = 62 F1 90 ...
→ ECU 對 0x22 回傳 UDS Positive Response
DoIP 0x8001,UDS User Data = 7F 22 31
→ ECU 對 0x22 回傳 UDS Negative Response
因此,一次完整分析要分開看三件事:
| 看見的現象 | 可以合理判斷 | 不能直接推論 |
|---|---|---|
| TCP 已建立 | Transport Layer 連線成功 | Tester 已獲得診斷授權 |
| Routing Activation 成功 | 這條連線的 DoIP 診斷路由已啟用 | 所有 UDS Service 都可執行 |
DoIP 0x8002 ACK |
DoIP 層接受並處理這筆診斷訊息 | 目標 ECU 已完成 UDS 操作 |
UDS 0x62 Response |
ECU 對這次 0x22 回傳肯定結果 |
回傳資料已經過獨立真實性驗證 |
假設中央 Gateway 支援 DoIP,但目標 Body ECU 只有 CAN 介面,資料路徑可能是:
Tester
→ Ethernet/IP/TCP
→ DoIP Gateway
→ 解析 DoIP Source/Target Address
→ 映射到允許的 CAN addressing
→ ISO-TP/CAN
→ Body ECU 的 UDS Server
Gateway 不只是做格式轉換。
它還應該確認:
如果 Gateway 只把每一筆外部 DoIP Message 無條件轉成 CAN,它就會把 Ethernet 診斷入口擴大成車內控制網路的直接入口。
DoIP 使用成熟的 Ethernet/IP 技術,代表防禦者可以運用 Switch、VLAN、Firewall、TLS 與網路監控,也代表熟悉的 IP 攻擊面會一起進入車載診斷環境。
Vehicle Identification Response 可能包含 VIN、Logical Address 與 EID 等資料。
如果未受信任的裝置能進入診斷網段,它可能先利用 Discovery 盤點可見車輛與 DoIP Entity。
分析時要確認:
Routing Activation 決定一條 TCP 連線能否進入可路由診斷訊息的狀態。
系統應限制允許的 Tester Logical Address、Activation Type、並行連線與目標路徑,必要時加入 authentication/confirmation。
不過,Gateway 接受 Routing Activation 後,目標 ECU 仍要保留自己的 Session、Security Level、車輛條件與服務權限檢查。
TCP 可以重傳遺失資料並維持順序,但基礎 TCP 不會自動加密 UDS Payload,也不會替 Tester 提供密碼學身分證明。
ISO 13400-2:2025 將 TLS 列為可選能力。
是否使用 TLS、如何管理憑證,以及哪些路徑允許 unsecured DoIP,都要由實際架構與威脅模型決定。
即使使用 TLS,也不代表工作已經結束。
系統仍要處理憑證生命週期、私鑰保護、撤銷、時間來源、Cipher 設定與授權映射。
DoIP 可以承載比 Classical CAN 更大量的診斷資料,但 Socket、Buffer、Gateway 路由與下游 CAN 仍有資源上限。
異常連線或大量 Diagnostic Message 可能消耗:
因此需要連線數限制、Payload Length 檢查、timeout、rate limiting、異常流量監控與可復原的錯誤處理。
VLAN 能協助分區與轉送,但 VLAN tag 本身不是可信身分。
DoIP 診斷區域還要搭配:
防護重點不是「因為用了 Ethernet,所以套一台 Firewall 就好」,而是把網路層、DoIP 路由與 ECU 服務權限串成多層控制。
回到文章開頭,一次概念性的 DoIP 更新流程可能是:
1. 維修工具接上已授權的 Ethernet 診斷網路
2. 透過 UDP Vehicle Discovery 找到正確車輛
3. 建立 TCP 連線並完成 Routing Activation
4. 選擇目標 ECU 的 Logical Address
5. 使用 UDS 讀取 ECU 身分與目前軟體版本
6. 進入 Programming Session,完成必要授權
7. 驗證更新檔來源、完整性與車輛前置條件
8. 透過 UDS Download/Transfer Services 傳送資料
9. ECU 驗證、寫入並回報結果
10. 工具再次讀取版本,保存操作紀錄並安全結束診斷
這條流程不是任何特定車款的原廠更新程序,也不能取代 Service Manual。
它要表達的是,DoIP 解決「如何找到入口並把診斷資料送到目標」,UDS 解決「要求 ECU 做什麼」,更新安全則還需要簽章驗證、Anti-rollback、穩定供電與失敗復原等機制。
DoIP 傳得快,不等於更新檔可信,也不等於 ECU 能安全承受中斷。
下面是一段只用於教學的已授權測試台事件紀錄。
Logical Address、VIN 與 ECU 配置都是虛構資料:
1. UDP 0x0001 Vehicle Identification Request
2. UDP 0x0004 Vehicle Identification Response
VIN=TESTVIN1234567890, DoIP Entity=0x0E00
3. TCP Connection established to DoIP Entity
4. TCP 0x0005 Routing Activation Request, Tester=0x0E80
5. TCP 0x0006 Routing Activation Response, code=0x10
6. TCP 0x8001 Source=0x0E80, Target=0x1001, UDS=22 F1 90
7. TCP 0x8002 Diagnostic Message Positive Acknowledgement
8. TCP 0x8001 Source=0x1001, Target=0x0E80, UDS=7F 22 33
請先回答:
0x0E80 與 0x1001 分別扮演什麼角色?0x8002 能否證明 ECU 已成功讀出 DID?7F 22 33 屬於 DoIP 錯誤,還是 UDS Negative Response?先停在這裡,不要急著往下滑!
請先把 UDP/TCP、DoIP Payload Type、Logical Address 與 UDS SID 分層標出,再往下對照作者的示範答案。
第 1 筆是 Vehicle Identification Request,第 2 筆是 Vehicle Identification Response,兩者透過 UDP 完成 Discovery。
第 3 筆只表示 TCP 連線已建立。
直到第 5 筆收到成功的 Routing Activation Response,這條 Socket 才進入可路由診斷訊息的狀態。
| 欄位 | 作者的答案 |
|---|---|
| Tester Logical Address | 0x0E80,教學用外部診斷工具來源位址 |
| Target Logical Address | 0x1001,教學用目標 ECU 位址 |
| UDS Request | 22 F1 90,要求讀取 DID 0xF190 |
DoIP 0x8002 |
DoIP 層接受並處理這筆 Diagnostic Message,不代表 UDS 成功 |
| UDS Response | 7F 22 33,0x22 ReadDataByIdentifier 因 securityAccessDenied 被拒絕 |
最後一筆仍封裝在 Payload Type 0x8001 裡,真正的拒絕原因位於 UDS User Data。
因此它不是 DoIP Generic Header 錯誤,也不是 Routing Activation 失敗。
下一步應依 ECU 診斷規格確認目前 Diagnostic Session、需要的 Security Level、車輛前置條件與 Gateway Policy。
不能因為看見 0x33 就直接反覆嘗試 seed/key,也不能假設通過某一個 Security Level 後,其他 DID 或 ECU 都會開放。
這份紀錄只示範協定分層,不代表任何特定車款採用相同 VIN、Logical Address、Routing Activation 或診斷權限。
安全與法律提醒: DoIP Discovery、Routing Activation 與診斷服務測試只應在模擬環境、隔離測試台或明確取得授權的設備上進行。
不要掃描道路車輛、維修廠網路、他人的設備或公共基礎設施,也不要在車輛行駛時操作診斷工具。
0x8002 Positive ACK 不等於 UDS Positive Response,真正服務結果要看回傳的 UDS User Data走完 OBD-II、UDS 與 DoIP 後,我們已經從實體診斷接口一路走到 Ethernet/IP。
Day 10 將正式從車內走向車外,介紹 V2X 的 V2V、V2I、V2P 與 V2N,看看車輛如何和其他車輛、道路設施、行人裝置及網路服務交換資訊。