VxWorks美Wind River公司推出的一款专门为实时系统设计开发的操作系统内核,为程序员提供了高效的实时多任务调度、中断管理,实时的系统资源以及实时的任务间通信。它是一种功能强大而且比较复杂的操作系统,包括进程管理、存储管理、设备管理、文件系统管理、网络协议及系统应用等部分。目前VxWorks应用已经十分广泛,从数码相机、路由器到B-2隐形轰炸机、火星探路者www.cechina.cn,都有它的身影。在863某交通重大专项计划控制系统国产化研究项目中www.cechina.cn,分区控制汁算机(DCC)和电机控制单元(MCU)也都采用了VxWorks操作系统。在现场测试过程中,我们发现基于TCP/IP网络协议传输的数据有时会出现粘包现象(即发送方发送的若干包数据传输到接收方时粘成一包)。针对种情况,我们进行了专题研究与实验。本文重点分析了TCP/IP协议的粘包问题,并结合实验结果提出了解决该问题的对策和方法。
1 报文粘连问题的现象及分析
1.1 报文粘连问题的现象
TCP/IP报文粘连是指发送方发送的若干包数据CONTROL ENGINEERING China版权所有,在接收方接收到时牯成一包,即后一包数据的头紧接着前一包数据的尾。由于报文度与接收缓冲区长度有可
1.2 报文粘连问题的分析
报文粘连既可能由发送方产生,也可能由接收方产生,还可能由进行数据传输的交换机产生。
(1)由发送方引起的报文粘连
由发送方引起的报文粘连是源于TCP协议本身。因为TCP协议为提高传输效率采用了Nagle算法(详见RFC896),发送方要等收集到1460字节的数据才会发送一包数据,或是等到发送缓冲区满后才会发送一包数据,这就造成了报文的粘连。
(2)由接收方引起的报文粘连
由接收方引起的报文粘连,往往是因为接收方进程没有及时处理数据造成的。接收方要先把收到的数据放入接收数据缓冲区,用户进程再从浚缓冲区中读取数据。如果在下一包数据到达时前一包数据还未被用户进程取走,则新一包数据就接到前一包数据之后,而用户要根据事先设定好的缓冲区大小从系统接收缓冲区中读取数据,这就造成了一次取到了多包数据。
(3)由交换机引起的报文粘连
由交换机引起的报文粘连,往往是因为由交换机相连的各个部件在一段时间内发送的报文数据太多,以至于超出了交换机的处理能力。这样,本来发送端分开发送的数据报文在交换机内部的缓冲区中粘连在一起。现在,在实验现场DCC等使用VxWorks操作系统的部件需要使用一个独立的端口进行程序下载,还要有一个独立的端口提供给SecureCRT软件以进行实时监控;同时DCC与MCU和中央控制系统的数据传输也要在同一台交换机中进行。这就有可能导致在某一段时间内数据量超过了交换机的处理能力。
1.3 报文粘连对系统的影响
如果系统发生了报文粘连现象而不进行相应处理,则将导致整个系统无法正常运行。
如果用于传输数据的报文被粘连导致无法正常处理,则将使接收方无法进行运算,现场实时的数据无法获得,从而使标志位无法置位,程序无法继续进行。如果作为生命信号的报文被粘连导致无法正常处理,则将使接收方认为发送方出现故障;若此情况连续发生,则接收方将认为发送方死机控制工程网版权所有,从而停机,以保证整个系统的安全。
2 报文粘连问题的解决方法
2.1 发送方的解决方法
对于由发送方引起的报文粘连,可以采用以下两种方法解决。
(1)关闭Nagle算法
由于VxWorks系统支持Windows Socketsl.1标准,可以将setsockopt函数中的1evel项设置为LPPROTO_TCPl,这样就可以关闭Nagle优化算法。
(2)将Winsock kernel buffer设置为0
此方法只有在支持Windows Sockets 2.0标准的系统上才能使用(VxWorks不能支持),可在发送方为工控机、接收方为使用VxWorks操作系统的处理器的情况下使用。只需将setsockopt项巾的level设为SOL_SOCKET,将SO_SNDBUF值设为0。
2.2 接收方的解决方法
对于南接收方引起的报文粘连,也有两种方法解决。
(1)提高报文处理