Loading...
墨滴

jasonj333

2021/06/30  阅读:100  主题:红绯

ISO 13400-1

通过浏览别人的文章,虽然能快速了解自己完全不懂的协议,但是很多细节和知识点,还是应该通过学习ISO协议规范文档,对它们有更深入更全面的理解,下面我们就通过ISO 13400,全面深入地学习DoIP协议

网络层需求

整车网络架构

车载网络架构示意图
车载网络架构示意图

从图中可以看出,汽车内部不同的ECU具有不同的网络协议,比如LIN、CAN、Ethernet等,那么想要实现各个ECU诊断功能,就需要不同的网络通信,如果外部测试设备采用DoIP的形式,而内部的ECU网络协议各不相同,如何能让外部测试设备和汽车内部所有节点通信呢?答案是网关,网关可以实现收发两端不同协议之间的通信,所以整车必须有一个DoIP网关,它是和外部进行DoIP诊断通信的唯一接口

数据链路层

由于以太网物理通信限制,数据链路层最大传输单元限制在1500字节,即MTU

网络层

DoIP在网络层支持IPv4和IPv6协议

由于MTU的限制,所以报文在网络层需要先分片,再下发到数据链路层

使用IPv4的DoIP实体,支持ARP协议;使用IPv6的DoIP实体,也支持NDP协议

同样地

使用IPv4的DoIP实体,支持ICMPv4协议;使用IPv6的DoIP实体,也支持ICMPv6协议

传输层

DoIP在传输层支持TCP和UDP协议

DoIP实体使用tcp协议,通过绑定监听在13400端口,接收诊断请求,发送诊断响应

每个DoIP实体的tcp套接字,支持多个并发的tcp连接,也就是说,每个DoIP实体,通过创建一个tcp套接字,可以和多个Tester进行诊断通信

DoIP的tcp协议用作诊断通信,而udp协议的用途是车辆信息服务

  • DoIP实体在启动时会发送udp广播报文(IPv4)或组播报文(IPv6),告知外部测试设备车辆信息,这就是车辆公告消息,这个udp广播报文的目的端口是13400,源端口可以是13400,也可以随机,外部测试设备需要提前监听在13400,以便接收DoIP实体的车辆信息

可以看出

外部测试设备里的多个应用程序接收DoIP实体的车辆公告消息,有两种方式

  1. 由于车辆公告消息发给13400端口,所以这些程序都要监听在13400端口,多个程序的socket绑定在相同的(ip,port)时,需要重用端口

  2. 或者可以借助一个中间件,这个中间件监听在端口13400,接收到车辆公告消息后,分发给所有感兴趣的应用程序

而对于DoIP实体来说,它发送的车辆公告消息是相同的

  • 源端口号:13400或随机
  • 目的端口号:13400
  • 目的IP地址:IPv4是广播地址或外部测试设备的地址,IPv6是组播地址
  • 如果DoIP实体没有发送车辆公告消息,外部测试设备也可以通过向DoIP实体发送车辆信息请求,获取DoIP实体的车辆信息响应,请求消息的目的端口是13400,源端口是13400或随机,DoIP实体需要提前监听在13400,以便接收请求后响应

外部测试设备发出请求后,需要在A_DoIP_Ctrl的时间内接收到响应

外部测试设备发送的请求报文,目的端口是13400,源端口随机

至于是不是广播报文(IPv4)或组播报文(IPv6),文档里没有明确,不过我觉得对于外部测试设备来说,不论是单播还是多播,应该都是可以实现的

这里有个争议点,就是DoIP的响应报文的源端口号,图里标注13400或随机,既然DoIP实体是在13400监听的请求,按道理也是在13400发出响应,没必要再创建一个socket,通过其他端口发出响应,所以,这里只能说是多此一举,当然,这不是错误

外部测试设备还必须能处理异步到达的响应,策略就是当DoIP实体的响应报文未到达或延迟到达,外部测试设备重复发送请求,直到收到第一个响应报文,忽略后续的其他响应报文

应用层需求

DHCP

Dynamic Host Configuration Protocol,动态主机配置协议,由DHCP服务器使用UDP报文为联网的客户端分配动态IP地址

生活中常见的路由器,由于具有DHCP服务器的功能,就能为相连的设备分配IP地址

我们的手机,也具有无线DHCP服务器的功能,也就是热点功能

目前DoIP实体的IP地址都是静态写入的,所以这部分的内容暂时不表

数据传输顺序

DoIP消息也是使用网络传输顺序-大端

DoIP协议

ISO 13400明确了两个注意点

  • 任何以组播地址或广播地址为源IP地址的报文,都应忽略
  • 每个udp数据报只能传输一个DoIP消息

DoIP消息通用结构

DoIP消息都是使用的通用结构,这点要明确

  • Protocol Version

DoIP协议版本号,1个字节

目前主流使用的是02的版本,03版本预留以后使用,ff是默认的版本

当通信一方支持的DoIP版本,另一方不支持时,就可以使用默认版本

  • Inverse Protocol Version

反向协议版本,1个字节

它的值是协议版本号与0xff的异或运算

它与DoIP协议版本一起用于协议验证,以确保接收到DoIP消息格式正确

  • Payload Type

DoIP数据类型,2个字节

所有类型如下

  • 0x0000

Generic DoIP header negative acknowledge,通用DoIP报头否定确认

当DoIP实体接收到外部测试设备发来的DoIP消息时,首先会确认自己是否支持这条报文里的DoIP协议版本号、反向版本号、数据类型等

如果不支持,DoIP实体就会回复一条通用DoIP报头否定确认报文

通用DoIP头部否定确认报文结构
通用DoIP头部否定确认报文结构

这个NACK code占用一个字节,它不同的值表示不同的DoIP消息的错误类型,以及DoIP实体要如何处理接收到的DoIP消息

由于通用DoIP报头否定报文也是DoIP消息,所以它也使用DoIP消息通用结构,只是payload type是0x0000

当type为0x0000时,还会把NACK code的值放在payload里的第一个位置

下面看一下NACK code值对应的是哪种错误类型,以及这种错误类型的DoIP消息要如何处理

  • 0x00

DoIP实体不支持DoIP协议版本或反向协议版本错误

这种情况下,DoIP实体需要关闭socket,这里的socket应该是tcp socket

  • 0x01

DoIP实体不支持DoIP消息里的payload type

这种情况下,DoIP实体忽略这条错误的DoIP消息即可

  • 0x02

DoIP消息payload长度超过了DoIP实体支持的最大DoIP消息的长度
这种情况下,DoIP实体忽略这条错误的DoIP消息即可

  • 0x03

DoIP消息payload长度超过了DoIP实体的DoIP程序的处理内存

这种情况下,DoIP实体忽略这条错误的DoIP消息即可

  • 0x04

DoIP消息的Payload Length字段不正确

这种情况下,DoIP实体需要关闭socket,这里的socket应该是tcp socket

其他的一些注意点

通用DoIP报头否定报文是由DoIP实体发给外部测试设备的,外部测试设备收到这个报文后,不需要响应这个报文

外部测试设备不应该发送通用DoIP报头否定报文,但是如果硬要发给DoIP实体,DoIP实体会忽略它,不作处理

如果DoIP实体发送了错误的DoIP消息给外部测试设备,外部测试设备不需要对其进行处理,也就是没必要回复通用DoIP报头否定报文

DoIP报头处理流程如下,建议详细分析

这里有个有趣的点,之前一直不明白Alive check request和Alive check response是DoIP实体发、外部测试设备响应,还是外部测试设备发、DoIP响应,通过上图应该就很明显了,DoIP实体发确认DoIP是否存活请求给外部测试设备,外部测试设备作出响应

以上,就是ISO 13400文档的部分内容,后续文章请关注、点赞、转发不迷路


jasonj333

2021/06/30  阅读:100  主题:红绯

作者介绍

jasonj333