当前位置: 首页 > article >正文

入门车载以太网(4) -- 传输层(TCP\UDP)

目录

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主要有以下特点:

  1. 无连接服务:UDP不建立连接,发送数据之前不需要建立连接,发送端和接收端之间可以直接发送和接收数据。

  2. 不可靠性:UDP不保证数据包的顺序、完整性或可靠性。如果数据包在传输过程中丢失或损坏,UDP不会进行重传或重新排序。

  3. 速度快:由于UDP不提供可靠性保证,因此它的速度比TCP快,适合那些对实时性要求高的应用。

  4. 支持多播和广播: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总线的网络层协议,虽然很类似,但在寻址方式、通信机制还是有一定的区别。


http://www.kler.cn/a/396337.html

相关文章:

  • Apache Paimon、Apache Hudi、Apache Iceberg对比分析
  • 机器学习day5-随机森林和线性代数1
  • HarmonyOS Next星河版笔记--界面开发(5)
  • Qt 日志文件的滚动写入
  • 【Three.js基础学习】22.New project structure
  • 群控系统服务端开发模式-应用开发-前端登录接口开发
  • django入门【05】模型介绍(二)——字段选项
  • Java-Redisson分布式锁+自定义注解+AOP的方式来实现后台防止重复请求扩展
  • 用户态协议栈与内核模块通信机制
  • mac终端使用pytest执行iOS UI自动化测试方法
  • 引领豪华MPV新趋势,比亚迪夏内饰科技广州车展全球首发
  • 【C#设计模式(6)——适配器模式(Adapter Pattern)】
  • HelloMeme 上手即用教程
  • MySQL 如何用C语言连接
  • 角谷猜想的步数
  • JMX Exporter源码解读+生产环境最佳实践+解决其抓取指标超时问题
  • 关于adb shell登录开发板后terminal显示不完整
  • Python学习从0到1 day29 Python 高阶技巧 ⑦ 正则表达式
  • 直接映射缓存配置
  • 罗马数字转整数---每日小题
  • ctfshow-web入门-SSTI(web369-web372)下
  • 数据结构-二叉树及其遍历
  • 第二十九篇——线性代数:“矩阵”到底怎么用?
  • 【数据结构】双向链表定义与实现
  • linux 工具curl详解
  • 效益登记册效益管理计划