详解ISO 13400文档(DoIP协议) |
您所在的位置:网站首页 › UDP报文头详解 › 详解ISO 13400文档(DoIP协议) |
通过浏览别人的文章,虽然能快速了解自己完全不懂的协议,但是很多细节和知识点,还是应该通过学习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实体的车辆公告消息,有两种方式 由于车辆公告消息发给13400端口,所以这些程序都要监听在13400端口,多个程序的socket绑定在相同的(ip,port)时,需要重用端口 或者可以借助一个中间件,这个中间件监听在端口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实体的响应报文未到达或延迟到达,外部测试设备重复发送请求,直到收到第一个响应报文,忽略后续的其他响应报文 应用层需求 DHCPDynamic Host Configuration Protocol,动态主机配置协议,由DHCP服务器使用UDP报文为联网的客户端分配动态IP地址 生活中常见的路由器,由于具有DHCP服务器的功能,就能为相连的设备分配IP地址 我们的手机,也具有无线DHCP服务器的功能,也就是热点功能 目前DoIP实体的IP地址都是静态写入的,所以这部分的内容暂时不表 数据传输顺序DoIP消息也是使用网络传输顺序-大端 DoIP协议ISO 13400明确了两个注意点 任何以组播地址或广播地址为源IP地址的报文,都应忽略每个udp数据报只能传输一个DoIP消息 DoIP消息通用结构DoIP消息都是使用的通用结构,这点要明确 Protocol VersionDoIP协议版本号,1个字节 目前主流使用的是02的版本,03版本预留以后使用,ff是默认的版本 当通信一方支持的DoIP版本,另一方不支持时,就可以使用默认版本 Inverse Protocol Version反向协议版本,1个字节 它的值是协议版本号与0xff的异或运算 它与DoIP协议版本一起用于协议验证,以确保接收到DoIP消息格式正确 Payload TypeDoIP数据类型,2个字节 所有类型如下 Generic DoIP header negative acknowledge,通用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消息要如何处理 0x00DoIP实体不支持DoIP协议版本或反向协议版本错误 这种情况下,DoIP实体需要关闭socket,这里的socket应该是tcp socket 0x01DoIP实体不支持DoIP消息里的payload type 这种情况下,DoIP实体忽略这条错误的DoIP消息即可 0x02DoIP消息payload长度超过了DoIP实体支持的最大DoIP消息的长度 这种情况下,DoIP实体忽略这条错误的DoIP消息即可 0x03DoIP消息payload长度超过了DoIP实体的DoIP程序的处理内存 这种情况下,DoIP实体忽略这条错误的DoIP消息即可 0x04DoIP消息的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文档的部分内容,后续文章请关注、点赞、转发不迷路 |
今日新闻 |
点击排行 |
|
推荐新闻 |
图片新闻 |
|
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭 |