前言
SOME/IP协议越来越多的用于汽车电子行业中,关于协议详细完全的中文资料却没有,所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块:
1. SOME/IP协议讲解
2. SOME/IP-SD协议讲解
3. python/C++举例调试讲解
4.2.1.4 Transporting large SOME/IP messages of UDP (SOME/IP-TP)
The UDP binding of SOME/IP can only transport SOME/IP messages that fit directly
into an IP packet. If larger SOME/IP messages need to be transported over UDP
(e.g. of 32 KB) the SOME/IP Transport Protocol (SOME/IP-TP) shall be used. The
SOME/IP message too big to be transported directly with the UDP binding shall be
called "original" SOME/IP message. The "pieces" of the original SOME/IP message
payload transported in SOME/IP-TP messages shall be called "segments".
Use TCP only if very large chunks of data need to be transported (> 1400 Bytes) and
no hard latency requirements in the case of errors exists
如何使用 **SOME/IP 传输协议(SOME/IP-TP)** 通过 UDP 传输较大的 SOME/IP 消息。
1. **UDP 绑定的限制**:
- SOME/IP 的标准 UDP 绑定只能传输适合单个 IP 数据包的消息。这通常受限于网络的 **最大传输单元(MTU)**,默认情况下约为 1500 字节(包括 IP 和 UDP 头部)。
2. **SOME/IP-TP 的作用**:
- 如果需要通过 UDP 传输更大的 SOME/IP 消息(例如 32 KB),则需要使用 **SOME/IP-TP**。
- SOME/IP-TP 将原始 SOME/IP 消息(称为“原始消息”)分割成多个较小的片段(称为“段”),然后通过多个 UDP 数据包传输。
3. **原始消息与段**:
- **原始消息**:无法直接通过 UDP 绑定的 SOME/IP 消息。
- **段**:原始消息的有效载荷被分割后,通过 SOME/IP-TP 消息传输的片段。
4. **TCP 的使用场景**:
- 如果需要传输非常大的数据块(超过 1400 字节),并且对错误情况下的延迟没有严格要求,则建议使用 TCP 而不是 UDP。
5. **UDP 直接传输会怎么样**:
如果是大包的SOME/IP数据 通过UDP直接传输 而不在SOME/IP层分包的话,数据则会直接转到IP层,IP层有MTU的限制 会进行分包发送,到接收端后IP层会重新组包。如果其中一个分包有问题,则整包直接丢弃,没有重传。
所以UDP传输大的SOME/IP报文 需要在SOME/IP层进行 分包。
总结来说,SOME/IP-TP 是为了解决 UDP 传输大消息的限制而设计的,通过分段传输实现。而 TCP 更适合传输非常大的数据块,尤其是在对延迟要求不严格的情况下。
[PRS_SOMEIP_00720]
Upstream requirements: RS_SOMEIP_00010, RS_SOMEIP_00012
SOME/IP messages using SOME/IP-TP shall activate Session Handling (Session ID
must be unique for the original message).
SOME/IP-TP应该激活会话处理功能,即SessionID对于所有被分包的SOME/IP报文而言要连续唯一且大于0。分包之后的子包中的SessionID要和原始包一致
[PRS_SOMEIP_00721]
Upstream requirements: RS_SOMEIP_00010, RS_SOMEIP_00012
All SOME/IP-TP segments shall carry the Session ID of the original message; thus,
they have all the same Session-ID.
所有切片包中的sessionID必须和 原始包一样
[PRS_SOMEIP_00722]
Upstream requirements: RS_SOMEIP_00010, RS_SOMEIP_00011
SOME/IP-TP segments shall have the TP-Flag of the Message Type set to 1.
SOME/IP-TP子包中MessageType的 TP-Flag要设置为1
在SOME/IP header之后 payload之前 有TP-header 格式如下:
[PRS_SOMEIP_00931]
Upstream requirements: RS_SOMEIP_00027
SOME/IP-TP Header shall be encoded in network byte order (big endian). 大端字节序 和SOME/IP保持同步。