每个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(),等 。
推荐阅读
- 网络协议X档案全集
- 协议分析和分析器
- 九 网络沟通的桥梁-协议X档案
- Internet面临协议升级
- SIP协议全方位概要介绍
- HTTP协议的结构
- 十 网络沟通的桥梁-协议X档案
- TCP/IP协议基础之一
- TCP/IP协议介绍 TCP/IP协议基础之二
- TCP/IP远程访问操作 TCP/IP协议基础之三
