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()。
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()等。
5. SX52 TCP协议的设计与实现
传输控制协议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(),等。
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总线与以太网互连方案,达到了测控通信系统高实时性、可靠性和嵌入式设计的要求。该互连方案很好地保证及治理监控层和生产测控层之间的连接,方便了上下层信息交换,能满足工厂、变电站等工业场合的应用要求。