TCP/IP协议栈在嵌入式异构网络互联中的应用,
摘要:随着测控技术与网络技术日益紧密的结合,测控系统接入互联网已经成为大势所趋。本文阐述在一种异构网络互联——CAN总线与以太网互联系统设计方案中嵌入式TCP/IP协议栈的设计与实现。从而实现了将基于TCP/IP协议的计算机网络设备与基于CAN总线协议的底层现场网络连通。 关键词:TCP/IP协议栈 CAN总线 以太网 互联网 异构结构 引言 Internet现已成为社会重要的信息流通渠道。如果嵌入式系统能够连接到Internet上面,则可以方便、低廉地将信息传送到几乎世界上的任何一个地方。可以预言,嵌入式设备与Internet的结合代表着嵌入式系统和网络技术的真正未来。随着IPv6的应用,设备都可能获得一个全球唯一的IP地址,通过IP地址和互联网相连成为一个网络设备。但是传统的TCP/IP协议在实现实时性方面做得不够好,它把大量的精力花在保证数据传送的可靠性以及数据流量的控制上。而在实时性要求比较高的嵌入式领域中,传统的TCP/IP不能满足其实时要求。另外,传统TCP/IP的实现过于复杂,需占用大量系统资源,而嵌入式应用的系统资源往往都很有限。因此,需要把传统TCP/IP在不违背协议标准的前提下加以改进实现,使其实现性得到提高,占用的存储空间尽可能少,以满足嵌入式应用的要求。 在大型企业自动化系统中,上层企业管理层和生产监控层一般采用的都是以太网和PC机,而在下层车间现场都是采用现场总线和单片机测控设备。上下两层的沟通,通常采用工业控制机加以太网卡,再加上PC机插槽上的接口卡和并行打印口EPP接口卡来实现。这种连接方式成本高,开发周期长。针对这些情况,本文提出了一种单独的嵌入式CAN-以太网网关互连系统的设计方案,成功地实现以太网和现有的CAN总线网的直接数据传输。
1 异构网络互联系统结构设计 CAN总线是一个设备互连总线型控制网络。在CAN总线上可以挂接多达110个设备节点,各设备间可以自主相互通信,实现复杂网络控制系统。但设备信息层无法直接到达信息管理层,要想设备信息进入信息管理层就要通过一种数据网关。 这里设计了一个SX52网关,用于CAN总线与以太网的互连。图1所示的系统总体结构分为三部分:现场测控网络(CAN网络)、嵌入式透明SX52网关和以太网信息管理终端(如监控平台和网络数据库等)。以太网信息管理终端与CAN总线上的CAN节点通过Ethernet、SX52网关、CAN总线相互通信,其中SX52网关起核心异构网络的互连作用。 协议转换是异构网络互连的技术关键和难点。协议转换一般遥相呼应采用分层转换的方法,自低向上逐层进行。目前互连大都是在网络层或网络层展开的,因而必须对互连层以下各层协议逐层向上转换。这种转换方法的依据是协议分层的基本原理,即低层支持高层,高层调用低层,低层断开连接后,高层连接也随之断开,但高层断开连接却不会影响低层。从网络的分层结构上来看我们设计的互连系统具有如图2所示的分层结构。以太网上运行TCP/IP协议,它具有应用层、传输层、网络层以太网数据链路层和物理层;CAN总线具有应用层、数据链路层和物理层,其中应用层由用户自己定义,数据链路层和物理层由CAN协议所定义;SX52数据网关具有物理层、数据链路层和应用层,其应用层也就是Ethernet与CAN的信息数据交换层,SX52微控制器在此层相互解释并转发这两种不同协议的数据。 在本设计中,SX52网关被设计成了一个透明数据网关。也就是在以太网应用层构建和解析完整的CAN协议数据包。CAN协议数据包作为TCP/IP网络的应用层的数据进行传输。对通信数据的具体实际意义不做任何解释。 透明式网关由通信处理器、CAN总线控制器和以太网控制器三个部分组成。其中SX52单片机为核心处理器,实现CAN控制网络与以太网之间的协议转换。以太网信息管理 层的控制指令发送到嵌入式透明SX52网关,经过它将TCP/IP协议包数据转换为CAN协议形式发送至CAN控制网络中的指定设备节点,完成信息管理层对现场设备层的控制。同样地,当CAN网络上的设备数据(如定时采样数据或报警信息)要传输到信息管理层时,可将数据发送到嵌入式透明SX52网关,再通过网关协议转换程序将CAN协议数据封装成TCP/IP协议的以太网数据帧发送至以太网上的监控计算机。 2 SX52中TCP/IP协议栈的设计 按照层次结构思想,对计算机网络模块化的研究结果是,形成了一组从上到下单向依赖关系的协议栈(protocol stack),也叫协议族。在标准的TCP/IP协议族中有很多协议。这里SX52中TCP/IP协议栈层次结构如图3所示。 2.1 SX52 ARP协议的设计与实现 地址解析协议ARP(Address Resolution Protocol)可以实现逻辑地址到物理地址的动态映射。它提供了一种使以太网络节点可以传输一个IP数据包到目的地址的映射机制。 在SX52中,ARP协议是通过一个“IP地址对应以太网地址”的单登记实现的。当远程主机需要知道它的物理地址时,远程主机会向它发送ARP请求。这时它就会响应这个远程主机的请求,告诉对方自己的物理地址。当然,当应用层需要传输IP数据包时,SX52 ARP协议也可以请求远程目的物理地址。
要传输的Internet数据包在以太网控制器的发送缓冲区中被构建,它使用最近接收到的数据包的目的以太网地址作为发送数据包的目的地址。当然,这可能不是正确的以太网地址,因此,在实际发送数据包之前,ARP协议将检查发送数据包中的IP地址是否存在于ARP核中。如果发送数据中包中的IP地址在这个核中,在以太网发送缓冲区中的数据包将使用ARP核中的以太网地址更新;如果不在,ARP协议将发送一个ARP请求包,然后等待一个应答。一旦这个ARP 应答接收到,这个ARP核将使用刚接收到的目标以太网地址更新,接着,等待发送的数据包也将使用这个以太网地址更新,然后被发送出去。如果发送的ARP请求包没有应答,导致ARP定时器超时,这时等待发送的数据包将被废弃,正常的协议栈继续运行。使用的变量有:ARP核中的IP地址 {hostlIP3,hostlIP2,hostlIP1,host1IP0};ARP核中的以太网物理地址 {host1Eth0,host1Eth1,host1Eth2,host1Eth3,host1Eth4,host1Eth5};ARP协议的定时器 {arpTimerMSB,arpTimerLSB}等。使用涉及的函数有:ARPInit(),ARPCheckCache(),ARPSendResponse(),ARPUpdateEthAddr(),ARPCheckIfIs(),ARPCompare4(),ARPSendStPacket(),ARPSendCommon(),ARPSendRequest()。 2.2 SX52 IP协议的设计与实现 IP是TCP/IP协议族中最为核心的协议。所有的TCP、UDP、ICMP及IGMP数据都以IP数据报格式传输。IP提供不可靠、无连接的数据报传送服务。本设计中的IP协议是针对特殊的应用环境下的合理简化。CAN总线的控制网络是一种短帧(每个数据帧为8字节)的实时网络,所以,IP数据包无须分片(MF=DF=0),同时,设置IP为服务类型为一般类型,其头长为20字节,寿命TTL设置为64。使用的变量有:目的IP地址 {remoteIP3,remoteIP2,remoteIP1,remoteIP0};源IP地址 {myIP3,myIP2,myIP1,myIP0};IP校验和{ipCheckSumMSB,ipCheckSumLSB};IP数据包长度 {ipLengthMSB,}ipLengthLSB};上层使用的协议ipProtocol,IP标识 {ipIdentMSB,ipIdentLSB}。使用涉及的函数有:TCPIPInit(),CheckIPDatagram(),CheckIPDestAddr(),IPStartPktOut()等。 2.3 SX52 ICMP协议的设计与实现 为了让互联网中的路由器报告或提供有关意外情况的信息,在TCP/IP协议系列中加入了一个专门用于发送差错报文的协议——互联网控制报文协议 ICMP(Internet Control Message Protocol)。ICMP是IP的一部分在每个IP实现中都必须用到它。像其它所有的通信业务一样,ICMP报文是放在一个IP数据报的数据部分中传送的。ICMP报文的最终目的不是应用程序或目的机器上的用户,而是该机上处理它的Internet协议软件模块。也就是说:Internet控制报文协议允许路由器向其它路由器或主机发送差错或控制报文;ICMP在两台主机的Internet协议软件之间提供通信。 每个ICMP报文都以相同的3个字节开始:1个8位整数的报文类型(TYPE)字段用来识别报文,1个8位代码(CODE)字段提供有关报文类型的进一步信息,1个16位校验和字段。此外,ICMP报文还总是包括产生问题的数据报首部及其开头的64位数据。 ICMP使用IP来传送每一个差错报文。当路由器有一个ICMP报文要传递时,它会创建一个IP数据报并将ICMP报文封装其中,也就是说,ICMP报文被置于IP数据报的数据区中,然后这一数据报像通常一样被转发。即整个数据报被封装进帧中进行传递。 每一个ICMP报文的产生总是对应于一个数据报。路由器将一个ICMP报文将回给产生数据报的主机。在这里,只实现了ICMP的回应请求/应答服务,主要用于PING程序测试通信链路的畅通性,即只处理接收的报文类型为0x08的ICMP帧,发送的ICMP报文类型为0x00。它没有自己专有的变量,涉及的函数也只有ICMPGenCheckSum()和ICMPProcPktIn()。 2.4 SX52 UDP协议的设计与实现 UDP是一个简单的面向数据报的运输层协议:进程的每个输出操作都正好产生一个UDP数据报,并组装成一份待发送的IP数据报。UDP不提供可靠性,它把应用程序传给IP层的数据发送出去,但是并不保证它们能到达目的地。由于缺乏可靠性,我们似乎觉得要避免使用UDP,而使用一种可靠的协议,如TCP。但分析发现,UDP在我们的互连设计中有很多的优点:其一,UDP协议传输效率高,无须TCP通信前的连接开销;第二,UDP协议简单,无须复杂的状态机传输机制,可以很好地避免SX52网关死机复位后由于状态不一致而无法正常通信,且上层协议又很难发现的危险。因此,可以使用UDP来实现通信(避免TCP 连接的开销),而让许多需要的特征(如动态超和重传、拥塞避免、查错等)放置在应用层设计和实现。使用的变量有: UDP接收数据报的源端口{udpRxSrcPortMSB,udpRxSrcPortLSB}; UDP接收数据报的目的端口{udpRxDestPortMSB,udpRxDestPortLSB}; UDP接收数据报的长度{udpRxDataLenMSB,udpRxDataLenLSB}; UDP发送数据报的源端口{udpTxSrcPortMSB,udpTxSrcPortLSB}; UDP发送数据报的目的端口{udpTxDestPortMSB,udpTxDestPortLSB}; UDP发送数据报的长度{udpTxDataLenMSB,udpTxDataLenLSB}。 设计的相关函数有:UDPAppInit(),DPGenCheckSum(),UDPStartPktOut(),UDPProcPktIn(),UDPEndPktOut(),UDPAppProcPktIn(),UDPAppProcPktOut() 等。 2.5 SX52 TCP协议的设计与实现[!–empirenews.page–]
传输控制协议TCP(Transmission Control Protocol)是传输层的重要协议。它提供一个完全可靠的(没有数据重复或丢失)、面向连接的、全双工的流传输服务。本设计中,对复杂的TCP协议做了合理的简化:①因为CAN网络传输速度较快,数据量小且10Mbps的以太网传输一般不会发生阻塞,以太网上的主机也会有足够的能力及时处理通信数据,所以可以固定超时与重传的时间为5s。②RTL8019AS上有两个1500字节的接收缓冲区,且CAN网络为控制网,信息量小,所以可以固定接收窗口为 1400字节。③因为我们采用一般的TCP服务就可以满足应用,所以可以忽略紧急指针和选项及填充字段的值。通过上述三点简化,实际上大大简化了TCP协议的实现。因为TCP的超时与重传时间的确定和窗口大小的控制有着较复杂的算法和实现机制。 它的实现变量有:tcpState,{tcpTmpSeq4,tcpTmpSeq3,tcpTmpSeq2,tcpTmpSeq1}, {tcpTmpAck4,tcpTmpAck3,tcpTmpAck2,tcpTmpAck1}, {tcpUnAckMSB,tcpUnAckLSB},tcpRxFlags,{tcpCheckSumMSB,tcpCheckSumLSB}, {tcpLengthMSB,tcpLengthLSB},{tcpTmpMSB,TcpTmpLSB}, {tcbLocalPortMSB,tcbLocalPortLSB},{tcbRemotePortMSB,tcbRemotePortLSB}, {tcbSndUna4,tcbSndUna3,tcbSndUna2,tcbSndUnal}, {tcbRcvNxt4,tcbRcvNxt3,tcbRcvNxt2,tcbRcvNxt1},tcbOffset,tcbFlags, {tcbSendWinMSB,tcbSendWinLSB},{tcpTimerMSB,tcpTimerLSB}等。 相关函数有:TCPIPInit(),TCPRxHeader(),TCPProcPktIn(),TCPTransmit(),TCPReTransmit(),TCPAppPassiveOpen(),TCPAppActiveOpen(),CPAppClose(),TCPAddRcvNxt(),TCPIncRcvNxt(),TCPIncSndUna(),TCPCopySeqToNxt(),TCPAckUpdate(),TCPUpdateSeq(),TCPChkSeq(),TCPRestorePrev(),TCPCmpNxtSeq(),TCPSendEmptyPkt(),TCPSendReset(),TCPSendSyn(),TCPSendISN(),TCPSendSynAck()TCPSendAck(),TCPSendFin(),TCPCheckSuminit(),CPCheckSumAcc(),TCPCheckSumAddHdr(),CPTxByte(),TCPStartPktOut(),TCPAppInit(),TCPAppTxBytes(),TCPAppTxData(),TCPAppTxDone(),TCPAppRxBytes(),TCPAppRxData(), 等。 2.6 TCP和IP传输层协议的选择 把TCP/IP协议应用到控制网络中如何选择传输层协议类型很关键。如果要与现有的应用程序通信,必须使用与其相同的协议类型。在实际应用时,从可靠性来说,TCP提供了可靠的数据连接,UDP和直接访问IP的一些协议是不可靠的,数据报可能会丢失、损坏或重复;从性能上讲,UDP的性能最快,可靠性、流量控制重组包和连接维护等附加开销降低了TCP的性能。对于速度比较慢的系统来说,如温度、湿度传感器,选择TCP或UDP都无所谓,对于不太重要的传感器选用UDP就可以了;对于可靠性要求较高的传感器,应该选用TCP协议;对于实时性要求高的网络设备,如网络会议系统、IP音响、实时播放的电视等设备,数据传输率较高,应该选用UDP协议;有些有严格要求的同步系统应采用UDP;数据监控系统传输的可靠性要求较高,应采用TCP;Web和Email 也应采用了TCP。总之,要根据实际情况来确定选用何种协议。 结语 针对本嵌入式异构网络互连方案,对TCP/IP协议栈简化设计为SX52型CAN总线与以太网互连方案,达到了测控通信系统高实时性、可靠性和嵌入式设计的要求。该互连方案很好地保证及管理监控层和生产测控层之间的连接,方便了上下层信息交换,能满足工厂、变电站等工业场合的应用要求。