Loading...
墨滴

jasonj333

2021/11/16  阅读:31  主题:红绯

ISO 13400-4

微信文章推送排列规则已改变,需右下点赞和在看建立深度阅读关系

Diagnostic power mode information request and response

这个DoIP消息类型用于检索车辆的诊断电源模式,例如,外部测试设备可以使用此信息来验证车辆是否处于诊断电源模式,从而可以对车辆的组件进行可靠的诊断

可以看出,这个DoIP消息类型是外部测试设备发送请求报文,DoIP实体把自己的诊断电源模式信息通过响应报文告知外部测试设备

什么是diagnostic power mode

车辆内部电源状态影响车内网络上所有ECU的诊断能力,并标识了所有网关子网络中允许诊断通信的所有ECU的状态,它的目的是向外部测试设备提供是否可以在连接的车辆上执行诊断或车辆是否需要进入不同的诊断电源模式(即需要技术人员交互)的信息。在ISO 13400中,定义以下几个状态:not ready-未就绪(可通过DoIP访问的ECU不可以通信)、ready-就绪(可通过DoIP访问的ECU可以通信)、not supported-不支持(不支持diagnostic power mode information request消息)

这里的通信我理解的应该是诊断通信,也就是说虽然可以通过DoIP访问ECU,但是由于ECU的诊断电源状态未准备好,所以无法进行诊断层通信

每个DoIP实体应该支持能够接收并处理diagnostic power mode information request消息的能力

先看一下diagnostic power mode information request报文的payload组成

发现这个请求消息并没有携带payload数据

每个DoIP实体在接收diagnostic power mode information request消息后应支持用diagnostic power mode information response消息作为响应

DoIP实体收到这个DoIP消息类型的请求后,回复一条响应报文,其中payload只有一个字节,这个字节标识车辆是否处于诊断电源模式并准备好执行可靠的诊断

其中

  • 0x00:未准备好
  • 0x01:准备好
  • 0x02:不支持
  • 0x03-0xFF:预留

DoIP entity status information request and response

这个DoIP消息类型用于识别DoIP实体的某些能力和信息

可以看出,这个DoIP消息类型是外部测试设备发送请求报文,DoIP实体把自己的能力和信息通过响应报文告知外部测试设备

这样说可能比较抽象,下面的DoIP实体发送的status information response消息的payload里,就包含了DoIP实体的能力和信息

DoIP entity status information消息对于DoIP实体来说,不是必须的

先看一下DoIP entity status information request报文的payload组成

这个请求消息并没有携带payload数据

接着再看一下DoIP实体收到请求后,回复的响应报文,携带的payload结构

其中,按字节的高低顺序

  • Node type

1个字节,标识这个DoIP实体是DoIP节点还是DoIP网关

其中

  • 0x00:DoIP网关
  • 0x01:DoIP节点
  • 0x02-0xFF:预留
  • Max. concurrent TCP_DATA sockets

1个字节,简称MCTS,表示此DoIP实体允许的最大并发TCP_DATA套接字数量,不包括套接字处理所需的保留套接字

  • Currently open TCP_DATA sockets

1个字节,简称NCTS,当前建立的套接字数量

  • Max. data size

4个字节,简称MDS,此DoIP实体可以处理的一个逻辑请求的最大大小,这是一个可选字段

Socket Handling

连接表

我们该怎样理解下面这段话

外部设备(例如外部测试设备)和DoIP实体之间的逻辑连接由逻辑设备地址(SA)和套接字句柄唯一标识。套接字句柄由源和目标IP地址和端口以及传输层协议类型(即UDP或TCP)表示

我们知道,主机创建socket时,会根据使用TCP协议还是UDP协议,创建TCP套接字或者UDP套接字,然后还必须绑定IP和端口号,所以这个socket的标识就是IP地址、端口和传输层协议类型(UDP或TCP)

对于UDP协议,通信时无需连接,但是对于TCP协议,需要连接才可以通信,那么如何标识这个连接,就需要通信双方在建立连接后把<clientIP, clientPort, serverIP, serverPort>这样的一个四元组保存下来,用它来标识这个连接

上面说的是TCP连接,在TCP连接后,外部测试设备和DoIP节点间就会进行路由激活请求和响应,成功后,完成了DoIP层的逻辑连接,为了标识这个连接,就在TCP连接标识的基础上,把外部测试设备的逻辑地址关联到TCP连接标识上(这也就是我们在路由激活章节里说的注册),保存到连接表中,也就是说,DoIP层的逻辑连接,是由源逻辑地址、四元组<clientIP, clientPort, serverIP, serverPort>和TCP协议类型来表示

DoIP连接表
DoIP连接表

可以看到,连接表条目包含:套接字句柄,源地址(逻辑地址),连接状态

DoIP实体能够根据套接字句柄和关联的逻辑地址区分逻辑连接

DoIP实体支持每个逻辑连接有特定的initial inactivity timer和general inactivity timer

如果DoIP实体支持认证或确认机制,则每个逻辑连接都应支持认证状态或确认状态

连接状态

先看一下连接状态转换图

[DoIP-127]

当套接字处于“TCP建立”状态时,也就是TCP连接成功时,应将其作为“已初始化”添加到连接处理表中。同时将启动initial inactivity timer计时器并将其分配给连接条目

[DoIP-128]

在收到DoIP routing activation message并成功完成DoIP协议处理程序后,初始化的套接字代表一个逻辑连接,并应更新为连接状态“已注册[等待认证]”。正在初始化的外部测试设备的逻辑地址将与这个连接相关联。应停止initial inactivity timer计时器,并应启动与连接相关联的general inactivity timer计时器

[DoIP-129]

成功完成身份验证机制后或如果不需要身份验证,连接应设置为“已注册[等待确认]”状态

[DoIP-130]

在成功完成确认机制后或如果不需要确认,连接应设置为“已注册[路由活动]”状态

[DoIP-131]

在连接处于“已注册[路由激活]”状态之前,除了DoIP路由激活消息或认证或确认所需的消息外,不得处理或路由传入的DoIP消息,这点一定要注意

[DoIP-132]

如果initial timer或general inactivity timer超时,或者如果验证或确认被拒绝,或者外部测试设备没有响应DoIP alive check message,或者来自任何一方的关闭请求后,则连接应设置为“已结束”状态

[DoIP-133]

如果连接处于“已结束”状态(例如在来自任一方的关闭请求之后),则TCP套接字应关闭并重置为监听状态,并且应释放资源以允许建立新的连接

可以看出,DoIP实体作为Server端,创建TCP socket,并等待TCP连接请求,在TCP连接建立后,把这个socket句柄和外部测试设备的逻辑地址添加到连接表的连接条目中,并把连接状态设置为“已初始化”,同时启动这个连接条目的initial inactivity timer计时器

然后在initial inactivity timer内收到routing activation request message并成功响应后,会把连接状态更改为“已注册[等待认证]”,同时停止initial inactivity timer,启动general inactivity timer计时器。如果initial inactivity timer计时器超时路由激活未完成,或者那么连接状态更改为“已结束”

如果完成身份验证,或者根本不需要身份验证,就把连接状态更改为“已注册[等待确认]”。如果需要身份验证,而general inactivity timer超时未完成身份验证,那么连接状态更改为“已结束”

在连接处于“已注册[等待确认]”时,在成功完成确认机制后或不需要确认时,连接状态更改为“注册[路由活动]”

只有在“已注册[路由活动]”状态下,DoIP实体才可以进行诊断通信,处理或路由DoIP诊断消息

任何一方请求断开TCP连接后,连接状态都会更改为“已结束”

在“已结束”状态下,这个TCP_DATA socket被关闭,相关资源将被释放,但不代表DoIP实体创建的TCP socket被关闭,它会一直监听在13400端口,并接收来自外部的连接请求

Alive check

DoIP实体为了检查已经建立逻辑连接的外部测试设备是否存活,而发送Alive check request message,所以DoIP实体只能在“已注册”状态的连接上发送alive check request

General inactivity timer

这个计时器是针对网络连接中断或外部测试设备不发送任何数据但不关闭TCP_DATA连接的情况的一种措施。在这种情况下,general inactivity timer计时器将关闭未使用的TCP_DATA 套接字,以便在特定的非活动时间后将DoIP实体返回到默认状态

每个DoIP实体应为每个支持的TCP_DATA socket实现一个单独的general inactivity timer计时器

当套接字最初进入“已建立”状态(打开)或通过该套接字接收或发送数据时,TCP_DATA socket的general inactivity timer计时器应重置为其初始值T_TCP_General_Inactivity

此timeout是指TCP_DATA socket(未接收或发送数据)在被DoIP实体关闭之前不活动的最长时间

如果外部测试设备需要保持当前空闲连接处于活动状态,则应使用alive check response message

这句话要怎么理解

而外部测试设备为了防止由于连接长时间空闲而造成定时器超时导致连接关闭,需要周期发送alive check response消息(外部测试设备无需收到DoIP实体的alive check request,就可以发送alive check response,DoIP实体收到后会重置此定时器)

alive check response message是最小的有效消息,除了重置相应连接的general inactivity timer计时器外,不会产生进一步的动作。无效的DoIP消息将导致TCP_DATA socket被DoIP实体关闭

只要TCP_DATA socket处于已建立状态(打开),TCP_DATA socket的general inactivity timer计时器就应运行

这里比较矛盾,上面在介绍连接状态转换图时,说的是在路由激活后,停止initial inactivity timer,启动general inactivity timer

如果TCP_DATA socket的general inactivity timer计时器超时,则关联的TCP_DATA socket应关闭并重置为listen状态

Initial inactivity timer

这个定时器是针对逻辑连接的,也就是外部测试设备给DoIP实体发送路由激活请求,DoIP实体收到后协议层处理正确后回复响应

每个DoIP实体应为每个支持的TCP_DATA socket实现一个单独的initial inactivity timer计时器

TCP_DATA socket的initial inactivity timer计时器应重置为其初始值T_TCP_Initial_Inactivity,并应在套接字最初置于“已建立”状态(打开)时启动

此timeout是指TCP_DATA socket建立后直接不活动的最长时间。在此时间内没有激活路由,DoIP实体关闭TCP_DATA socket

TCP_DATA socket的initial inactivity timer计时器应在收到此TCP_DATA socket上的有效路由激活请求后立即停止

如果TCP_DATA socket的initial inactivity timer计时器超时,则关联的TCP_DATA socket应关闭并重置为listen状态

Socket handler and alive check

本节规定了DoIP实体如何处理多个TCP_DATA socket的要求,以保证外部测试设备可以连接到DoIP实体,还可以使用未使用的TCP_DATA socket进行通信,同时确保现有连接不受额外连接尝试的干扰

下图描述了外部测试设备在尝试激活新建立的TCP_DATA socket上的路由时,触发TCP_DATA socket处理程序的的示例

具体的逻辑前面有讲过这张图,这里就不再赘述

每个DoIP实体应按照下图中指定的顺序实现TCP_DATA socket处理

TCP_DATA socket handler
TCP_DATA socket handler

[DoIP-089]

如果路由激活请求消息中的SA(外部测试设备的逻辑地址)已经分配给接收请求的TCP_DATA socket,则被请求的DoIP实体将接受路由激活

[DoIP-106]

如果路由激活请求消息中的SA(外部测试设备的逻辑地址)与当前接收路由激活请求的TCP_DATA socket注册的SA不同,则被请求的DoIP实体将拒绝路由激活

[DoIP-090]

如果路由激活请求消息中的SA(外部测试设备的逻辑地址)未分配给任何已建立的TCP_DATA socket,并且尚未超过同时支持的TCP_DATA socket的最大数量,则被请求的DoIP实体应接受路由激活请求,并将SA分配给接收路由激活请求的TCP_DATA socket

[DoIP-091]

被请求的DoIP实体应通过TCP_DATA socket发送一个alive check消息给在路由激活请求消息中收到的SA,也就是当前分配的SA(也就是这个逻辑地址的外部测试设备)

[DoIP-092]

如果DoIP实体在T_TCP_Alive_Check时间内没有收到alive check response,它应关闭相应的TCP_DATA socket并在接收到路由激活请求的TCP_DATA socket上接受路由激活请求

此timeout是指DoIP实体在TCP_DATA socket上写入alive check request后等待alive check response的最长时间,因此,如果底层TCP堆栈无法传输alive check request消息,则计时器也将结束

[DoIP-093]

如果DoIP实体在T_TCP_Alive_Check时间内接收到alive check response,DoIP实体将拒绝在接收到路由激活请求的 TCP_DATA socket上的路由激活

[DoIP-094]

如果SA已知,但尚未分配给任何已建立的TCP_DATA socket,并且如果已经注册了最大并发支持的TCP_DATA socket数量,则被请求的DoIP实体应向所有当前已建立的TCP_DATA socket发送alive check request

[DoIP-095]

如果T_TCP_Alive_Check定时器超时,DoIP实体应关闭那些没有收到alive check response message的TCP_DATA socket,并且它应接受路由激活请求并将SA注册到所在的接收到路由激活请求的TCP_DATA socket上

[DoIP-096]

如果DoIP实体在T_TCP_Alive_Check时间内在所有注册的 TCP_DATA socket上收到alive check response,DoIP实体将拒绝在接收到路由激活请求的TCP_DATA socket上的路由激活

以上就是TCP_DATA socket处理程序的逻辑,一定要仔细梳理一遍完整的流程

下面是单个TCP_DATA socket的存活检查和所有TCP_DATA sockets的存活检查逻辑图

Alive check on single TCP_DATA socket
Alive check on single TCP_DATA socket
Alive check on all TCP_DATA sockets
Alive check on all TCP_DATA sockets

这里就不详细描述了


以上,打完收工

jasonj333

2021/11/16  阅读:31  主题:红绯

作者介绍

jasonj333