SOME/IP-SD 服务发现协议详解

张开发
2026/4/11 21:14:38 15 分钟阅读

分享文章

SOME/IP-SD 服务发现协议详解
# SOME/IP-SD 服务发现协议详解 SOME/IP-SDService Discovery是 SOME/IP 的服务发现机制用于在网络上动态发布和查找服务。---## 一、概述### 1.1 SD 解决什么问题在 SOME/IP 网络中ECU 上线/下线是动态的。SD 回答两个核心问题1. **谁在提供这个服务** — Client 需要找到 Server2. **谁需要这个服务** — Server 需要知道有哪些 Client### 1.2 工作原理SD 使用 **UDP 多播** 广播消息所有设备都能收到┌─────────────────────┐│ 多播组 ││ 224.224.224.245 │ECU-A ──OfferService──► │ :30490 │ ──────► ECU-C (收到)│ │ECU-B ──FindService──► │ │ ──────► ECU-A (收到)└─────────────────────┘### 1.3 默认参数| 参数 | 默认值 | 说明 ||------|--------|------|| **SD 多播地址** | 224.224.224.245 | IPv4 多播地址 || **SD 端口** | 30490 | UDP 端口 || **SD Protocol Version** | 0x01 | SD 协议版本 || **SD Interface Version** | 0x01 | SD 接口版本 || **SD Service ID** | 0xFFFF | SD 消息固定使用此 SID || **SD Method ID** | 0x8100 | SD 消息固定使用此 MID |---## 二、SD 报文格式### 2.1 总体结构SD 消息作为 SOME/IP 的一种特殊消息外层包裹标准 SOME/IP Header┌──────────────────────────────────────────┐│ SOME/IP Header (16 B) ││ SID0xFFFF, MID0x8100 ││ MsgType0x02 (NOTIFICATION) │├──────────────────────────────────────────┤│ SD Header (12 B) ││ Flags Reserved Entries/Options Len │├──────────────────────────────────────────┤│ Entries Array ││ (每个 Entry 16 字节) │├──────────────────────────────────────────┤│ Options Array ││ (可变长度) │└──────────────────────────────────────────┘### 2.2 SD Header┌───────────────────────────────────────────────────────┐│ Flags (8 bit) │ Reserved (24 bit) │├───────────────┴───────────────────────────────────────┤│ Length of Entries Array (32 bit) │├───────────────────────────────────────────────────────┤│ Entries (每个 16 字节) │├───────────────────────────────────────────────────────┤│ Length of Options Array (32 bit) │├───────────────────────────────────────────────────────┤│ Options (变长) │└───────────────────────────────────────────────────────┘**Flags 字段**| Bit | 名称 | 说明 ||-----|------|------|| Bit 7 | **Reboot Flag** | 1 设备刚重启过 || Bit 6 | **Unicast Flag** | 1 支持单播 SD 消息 || Bit 5-0 | Reserved | 保留设为 0 |### 2.3 Entry条目格式每个 Entry 固定 **16 字节**分两大类#### Type 1: Service Entry服务条目┌────────────────────────────────────────────────────┐│ Type (8) │ Index1st (8) │ Index2nd (8) │ Opts (8) │├──────────┴──────────────┴──────────────┴──────────┤│ Service ID (16) │ Instance ID (16) │├──────────────────────────┴────────────────────────┤│ Major Ver (8) │ TTL (24) │├───────────────┴───────────────────────────────────┤│ Minor Version (32) │└───────────────────────────────────────────────────┘| Type 值 | 含义 ||---------|------|| **0x00** | **FindService** — Client 搜索服务 || **0x01** | **OfferService** — Server 发布服务 |TTLTime To Live- TTL 0服务有效单位秒- **TTL 0**服务下线**StopOfferService**#### Type 2: EventGroup Entry事件组条目┌────────────────────────────────────────────────────┐│ Type (8) │ Index1st (8) │ Index2nd (8) │ Opts (8) │├──────────┴──────────────┴──────────────┴──────────┤│ Service ID (16) │ Instance ID (16) │├──────────────────────────┴────────────────────────┤│ Major Ver (8) │ TTL (24) │├───────────────┴───────────────────────────────────┤│ Reserved (12) │ Counter (4) │ EventGroup ID (16) │└───────────────────────────────────────────────────┘| Type 值 | 含义 ||---------|------|| **0x06** | **SubscribeEventgroup** — Client 请求订阅事件组 || **0x07** | **SubscribeEventgroupAck** — Server 确认/拒绝订阅 |TTL 在订阅中的含义- TTL 0订阅有效期秒- **TTL 0**取消订阅**StopSubscribeEventgroup**### 2.4 Option选项格式Options 提供 Entry 的补充信息最重要的是**端点选项**#### IPv4 Endpoint Option┌────────────────────────────────────────────────────┐│ Length (16) │ Type (8) │ Reserved (8) │├─────────────┴──────────┴──────────────────────────┤│ IPv4 Address (32) │├─────────────┬──────────────────────────────────────┤│ Reserved (8)│ Protocol (8) │ Port Number (16) │└─────────────┴──────────┴──────────────────────────┘| Type 值 | 含义 ||---------|------|| **0x04** | IPv4 Endpoint Option || **0x14** | IPv4 Multicast Option || **0x06** | IPv6 Endpoint Option || **0x16** | IPv6 Multicast Option || **0x09** | Configuration Option |Protocol 值| 值 | 含义 ||----|------|| 0x06 | TCP || 0x11 | UDP |---## 三、服务发现流程### 3.1 Server 端状态机┌─────────┐│ 初始 ││ (Down) │└────┬────┘│ 请求发布▼┌─────────┐│ 等待 │ 发送初始 OfferService│ (Initial)│ 等待 Initial Wait 时间└────┬────┘│ 超时▼┌─────────┐│ 重复 │ 发送 OfferService│(Repetition)│ 指数退避重复发送└────┬────┘│ 重复结束▼┌─────────┐│ 主阶段 │ 周期性发送 OfferService│ (Main) │ 间隔 cyclic_offer_delay└────┬────┘│ 请求停止▼┌─────────┐│ 停止 │ 发送 StopOfferService (TTL0)│ (Down) │└─────────┘**时序参数**| 参数 | 默认值 | 说明 ||------|--------|------|| INITIAL_DELAY | 0-100ms (随机) | 上电后首次 Offer 前的随机延迟 || REPETITIONS_BASE_DELAY | 30ms | 重复阶段的基础间隔 || REPETITIONS_MAX | 3 | 重复阶段的最大重复次数 || CYCLIC_OFFER_DELAY | 2000ms | 主阶段周期性 Offer 间隔 |### 3.2 Client 端状态机┌─────────┐│ 初始 ││ (Down) │└────┬────┘│ 请求查找▼┌─────────┐│ 等待 │ 发送 FindService│ (Initial)│ 等待 Initial Wait 时间└────┬────┘│├── 收到 OfferService → 进入 已发现││ 超时▼┌─────────┐│ 重复 │ 重复发送 FindService│(Repetition)│└────┬────┘│├── 收到 OfferService → 进入 已发现││ 重复结束且未找到▼┌─────────┐│ 未发现 │ 等待 OfferService│(Not Found)│└────┬────┘│ 收到 OfferService▼┌─────────┐│ 已发现 │ 服务可用可以通信│ (Found) │└────┬────┘│ 收到 StopOffer▼┌─────────┐│ 未发现 │└─────────┘### 3.3 完整通信流程时间 Server 多播网络 Client││ [启动] [启动]│t0 OfferService ──────────► ════════════ ──────► [发现服务!]│ SID0x1000, IID0x0001│ TTL5s│ Endpoint: 192.168.1.20:30000/UDP│t1 FindService│ ◄════════════ ◄──────── SID0x1000│ [收到FindService]│t2 OfferService ──────────► ════════════ ──────► [确认发现]│t3 SubscribeEG│ ◄────────────────────── EG1, TTL5s│ [收到订阅请求]│t4 SubscribeEG ACK ──────────────────────────────► [订阅确认!]│ TTL5s│t5 NOTIFICATION (Event) ─────────────────────────► [收到事件!]│ SID0x1000, EID0x8001│ Payload: 车速数据││ ... 周期性 OfferService (每2秒) ...│t10 NOTIFICATION (Event) ─────────────────────────► [收到事件!]││ [请求停止]t11 StopOfferService ─────► ════════════ ──────► [服务下线]│ TTL0### 3.4 事件组订阅流程Client Server│ ││── SubscribeEventgroup ────────────►││ SID0x1000, IID0x0001 ││ EG_ID1, TTL5 ││ ││ Server 检查: ││ ✓ 服务存在 ││ ✓ 事件组存在 ││ ✓ 版本匹配 ││ ││◄── SubscribeEventgroupAck ─────────││ TTL5 (确认, TTL0) ││ ││ 或 ││ ││◄── SubscribeEventgroupNack ────────││ TTL0 (拒绝) │---## 四、多播与单播### 4.1 多播通信SD 消息通过**多播**发送所有加入该多播组的设备都能收到发送者 ──── 224.224.224.245:30490 ────► 所有监听此多播组的设备### 4.2 单播优化当 Unicast Flag 1 时某些 SD 交互可以使用**单播**| 场景 | 多播/单播 ||------|-----------|| OfferService初始广播 | 多播 || OfferService回复 FindService | 可单播 || FindService | 多播 || SubscribeEventgroup | 单播点对点 || SubscribeEventgroupAck | 单播 |### 4.3 IGMP 注意事项多播通信依赖网络设备交换机的 **IGMPInternet Group Management Protocol** 支持- 如果交换机支持 IGMP Snooping多播流量只转发到订阅的端口- 如果不支持多播被当作广播处理可能影响性能- 某些廉价交换机可能需要手动配置---## 五、TTL 与生存期管理### 5.1 TTL 的含义| 消息类型 | TTL 0 | TTL 0 ||----------|---------|---------|| OfferService | 服务有效期 X 秒 | **StopOfferService**服务下线 || SubscribeEventgroup | 订阅有效期 X 秒 | **StopSubscribeEventgroup**取消订阅 |### 5.2 TTL 续期服务和订阅都有有效期到期前需要**续期**Server 每 2 秒发送 OfferService (TTL5s)→ 只要 Client 持续收到, 就认为服务在线→ 如果 5 秒内没收到新的 Offer, Client 认为服务离线Client 每 N 秒发送 SubscribeEventgroup (TTL5s)→ 只要 Server 持续收到, 就维持订阅→ 如果 5 秒内没收到续期, Server 自动取消订阅---## 六、配置参数总结| 参数 | 默认值 | 说明 ||------|--------|------|| SD Multicast Address | 224.224.224.245 | SD 多播 IP || SD Port | 30490 | SD 端口 || TTL | 5 秒 | 服务/订阅有效期 || Cyclic Offer Delay | 2000 ms | 周期性 Offer 间隔 || Initial Delay Min | 0 ms | 初始延迟最小值 || Initial Delay Max | 100 ms | 初始延迟最大值 || Repetitions Base Delay | 30 ms | 重复基础延迟 || Repetitions Max | 3 | 最大重复次数 |---## 七、SD 报文示例解析### 7.1 OfferService 消息完整报文SOME/IP Header SDSOME/IP Header:FF FF 81 00 → SID0xFFFF, MID0x8100 (SD固定)00 00 00 30 → Length 4800 00 00 00 → Client ID 0, Session ID 001 01 02 00 → ProtoVer1, IfVer1, MsgTypeNOTIFICATION, RCE_OKSD Header:C0 00 00 00 → Flags: Reboot1, Unicast100 00 00 10 → Entries Length 16 (1 entry)Service Entry (OfferService):01 → Type 0x01 (OfferService)00 00 10 → Index1st0, Index2nd0, NumOpts1,010 00 00 01 → SID0x1000, IID0x000101 00 00 05 → MajorVer1, TTL500 00 00 00 → MinorVer0Options Length Options:00 00 00 0C → Options Length 1200 09 04 00 → Length9, Type0x04 (IPv4 Endpoint)C0 A8 01 14 → IP 192.168.1.2000 11 75 30 → Reserved0, Proto0x11(UDP), Port30000### 7.2 FindService 消息SD Header:C0 00 00 00 → FlagsService Entry:00 → Type 0x00 (FindService)...10 00 FF FF → SID0x1000, IID0xFFFF (任意实例)FF 00 00 01 → MajorVer0xFF(任意), TTL1FF FF FF FF → MinorVer0xFFFFFFFF(任意)使用 0xFF / 0xFFFF / 0xFFFFFFFF 表示任意匹配。### 7.3 SubscribeEventgroup 消息EventGroup Entry:06 → Type 0x06 (SubscribeEventgroup)...10 00 00 01 → SID0x1000, IID0x000101 00 00 05 → MajorVer1, TTL500 00 00 01 → Reserved, Counter0, EG_ID1--- **参考标准**: AUTOSAR PRS SOME/IP Service Discovery Protocol Specification R22-11

更多文章