目录
1.ECU通信方式的变化
2.传输层概述
2.1 UDP
2.2 TCP
3. TCP和ISO 15765-2
1.ECU通信方式的变化
我们先回顾下两种通信方式:Signal-Based Messaging、Service-Based Messaging。
- Signal-Based Messaging
基于信号的通信方式,例如CAN通信,这是目前车内ECU应用最广泛的通信方式。这种方式关键的就是通信矩阵(DBC、LDF),需要定义好信号的发送、接收节点,封装到哪条报文,报文的发送周期,这样我们就可以完成车内所有节点的通信开发。
面向信号的通信架构(图片来源:联合电子)
仔细看通信矩阵,我们会发现很多信号都是传递传感器数据,但在如今智能网联汽车中,大量的功能需要ECU间的协调工作来实现,任何微小的功能改动都会引起整车通讯矩阵的改动,这是噩梦,以前做敏捷开发的时候,我晚上睡觉都梦到在更新DBC。所以,传统IT中基于服务的通信方式被引入进来。
- Service-Based Messaging
基于服务的通信,听起来很抽象,但回想下汽车诊断领域14229的通信方式,Client只需要发送SID来调取各种功能服务,获取结果即可,根本不关心服务内部是如何实现。这种情况下,服务都有一个唯一且互不影响的ID号,通过服务中间件完成自身发布、订阅其他服务和通讯工作。
面向服务的架构(图片来源:联合电子)
很明显,在传统电子电气面向信号架构(以CAN通信为主)是越来越难满足未来网联汽车的需求;因此在这种背景下,车载以太网被引入,它提供了许多不同级别控制和可靠性的协议。这些协议可以在同一网络上使用不同的软件逻辑连接共存;也有协议如AVB,为音频/视频流等应用程序的数据提供极端延迟保证。
2.传输层概述
车载以太网前3层(物理层、数据链路层、网络层)实现了主机间的通信,物理层通过cables传输比特流,数据链路层传输以太网帧,网络层传输数据报给到目的主机,但是由于ECU可能存在多个进程,具体应该给到哪个进程?这就由传输层来完成。
传输层位于OSI的第4层,主要作用是提供端到端的数据传输,负责两个通信端的会话建立、维护和终止,由于主机IP地址固定,因此在主机进程上新增了本地唯一的端口号,利用Port号在软件层级进行寻址,以保证数据能够正确送到目的进程。
网络层和传输层作用域如下所示:
这一层有两个非常重要的协议:TCP、UDP。
- UDP:简单、快速,无连接,想象一下广播,及时丢一两帧数据也还是可以接受;
- TCP:复杂,较慢,包括可靠性,流量控制和其他服务保证。
在前面我们聊到,车载以太网中,IP地址可以表示一个ECU,而端口(Port)则用于表示一个软件进程,如vECU等,TCP、UDP有两个16bit端口地址(source、destination);IP地址+Port = socket(套接字),源、目的地socket可用于表征一个网络连接,那么接下来我们继续研究TCP和UDP。
2.1 UDP
UDP,全称User Datagram Protocol,它提供无连接数据报传输,增进了进程通信能力。其数据报格式如下图:
可以看到,UDP Header定长为8字节,其中,Length指UDP长度,最长64K bytes,但是考虑到IP数据报总长度最大为65535,因此实际一帧UDP最大长度为65535 - 20(IP Header)- 8(UDP Header) = 65507字节。此外,Checksum在UDP/IP协议栈中保证数据完整性的唯一手段。
因此,我们可以总结,UDP主要有以下特点:
无连接服务:UDP不建立连接,发送数据之前不需要建立连接,发送端和接收端之间可以直接发送和接收数据。
不可靠性:UDP不保证数据包的顺序、完整性或可靠性。如果数据包在传输过程中丢失或损坏,UDP不会进行重传或重新排序。
速度快:由于UDP不提供可靠性保证,因此它的速度比TCP快,适合那些对实时性要求高的应用。
支持多播和广播:UDP支持多播和广播,这使得它适用于需要向多个接收者发送相同数据的应用。
2.2 TCP
TCP,全称Transmission Control Protocol,提供了面向连接、可靠的数据传输服务,保证了端到端的数据传输可靠性,在我看来,它和ISO 15765-2(UDS网络层/TP层)很类似,且听慢慢道来。
TCP不同于其他协议,它天生就带有连接的概念,意味着两个节点要通信,一方必须发起连接请求给到另一方,且该请求还要被接收方接收,从这个角度出发,就可以用client/server 模型来描述。服务请求方叫Client(客户端),服务提供方叫Server(服务器),客户端负责发起请求和接收服务,而服务器负责处理请求和提供服务。
TCP在IP层协议号为0x06,下图是TCP段格式:
- Sequence Number:Segment的序列号,用于保证数据的按序传输;
- Acknowledgment Number:指明下一个希望得到的、来自发送方的序列号,所有先前的序列号被确认为收到;
- Data Offset:TCP Header长度;
- URG:Signals important information,置1表示有高优先级信息需要传输;
- ACK:置1表示确认号(Acknowledgment Number)合法;
- PSH:置1表示当前信息需要紧急处理,接收方不需要缓存,直接传给应用协议;
- RST:置1表示重置连接;
- SYN:置1表示建立新的连接,连接请求时SYN置1,ACK置0;连接响应时,SYN=1,ACK=1;
- FIN:Finish,置1表示释放连接,发送方没有数据发送了。
- Window Size:该字段16bits,指明TCP接收方缓冲区的长度(以字节为单位);
- Urgent Pointer:仅URG置1,该字段才有效,用于表示偏移量,索引报文数据部分中最后一个紧急字节。
- NS、CWR、ECE是最新的TCP标志,分别来源RFC 3540\3168。
由于TCP是面向连接的协议,但这个连接是软件层面虚拟连接,那就意味着TCP需要来控制这个连接的动作,让源节点和目标节点之间的这条虚拟通道畅通无阻,同时还要确保丢失、损坏的报文可以容易重发。因此,面试八股文:“三次握手建立连接,四次握手关闭连接”就来了。
三次握手建立连接如下图所示:
建立完成后,双方都将ACK置位,交换并确认了对方的初始序列号,就可以通过连接互相传输数据。
那为什么要三次握手才能建立连接?本来只需要一问一答即可建立,但实际网络通信可能出现丢帧或者响应丢失,这时候Client再次发起连接请求,通过重传连接,但这又导致了重复连接,三次握手要求对所有报文进行编号,每次建立连接时都产生一个新的序列号,这样可以避免上述问题。
四次握手关闭连接与握手类似,只是标志位不一样;
(1)客户端发送ACK+FIN给服务器;(2)服务器回复ACK;(3)服务器回复ACK+FIN给客户端;(4)客户端回复ACK
3. TCP和ISO 15765-2
既然前面讲过了TCP和ISO 15765-2类似,我们来看看它们之间的差异。
建立连接阶段:ISO 15762-2 是一次握手建立连接,客户端发送带有长消息标志、总字节数和前几个字节的初始帧,服务器发送流控帧用于控制数据传输速率、告诉在发送方必须等待接收方的另一个流量控制帧之前发送多少帧;TCP则需要三次握手,通过SYN\ACK来建立连接;
流控制:TCP内置了流控制机制(如滑动窗口协议),而ISO15765-2通过N_PCI中的流控制帧(FC)来实现流控制
断开连接阶段:ISO15765-2是在所有数据传完后断开,TCP则需要四次握手,需要FIN\ACK来确认断开连接。
此外,TCO还提供了多种标志位,用于处理各种突发情况,总体来说比较完善。总结来说,TCP是一种通用的、面向连接的传输层协议,而ISO15765-2是一种专门针对CAN总线的网络层协议,虽然很类似,但在寻址方式、通信机制还是有一定的区别。