新闻中心

EEPW首页 > 网络与存储 > 设计应用 > VxWorks中以太网通信报文的粘连问题

VxWorks中以太网通信报文的粘连问题

作者:北京交通大学 张明 郑伟 陕西国华锦界能源有限公司 张福仲时间:2008-06-27来源:单片机与嵌入式系统应用收藏

  是美国Wind River公司推出的一款专门为实时系统设计开发的操作系统内核,为程序员提供了高效的实时多任务调度、中断管理,实时的系统资源以及实时的任务间通信。它是一种功能强大而且比较复杂的操作系统,包括进程管理、存储管理、设备管理、文件系统管理、网络协议及系统应用等部分。目前应用已经十分广泛,从数码相机、路由器到B2隐形轰炸机、火星探路者,都有它的身影。在863某交通重大专项计划控制系统国产化研究项目中,分区控制计算机(DCC)和电机控制单元(MCU)也都采用了操作系统。在现场测试过程中,我们发现基于TCP/IP网络协议传输的数据有时会出现现象(即发送方发送的若干包数据传输到接收方时粘成一包)。针对这种情况,我们进行了专题研究与实验。本文重点分析了问题,并结合实验结果提出了解决该问题的对策和方法。

本文引用地址:http://www.eepw.com.cn/article/84902.htm

  1 报文粘连问题的现象及分析

  1.1 报文粘连问题的现象

  TCP/IP报文粘连是指发送方发送的若干包数据,在接收方接收到时粘成一包,即后一包数据的头紧接着前一包数据的尾。由于报文长度与接收缓冲区长度有可能不成整倍数关系,所以粘连在一起的报文中有不完整的包。VxWorks操作系统会先将由网络传输来的数据放入系统接收缓冲区中,以备用户进程从中调用数据。此处假设接收方缓冲区长为L字节,L应有一定的长度,以保证至少可以存储一包数据。由于DCC和MCU之间需要传输不同种类的报文来进行数据交互,所以用户在程序中应为不同的报文分别设置不同的接收缓冲区来存放不同的报文数据。此处假设只有应答报文和状态报文两种,分别以用户缓冲区1和2来存储;长度应与用户层对应报文的长度相等,假设分别为m和n。情况如图1所示。


图1 粘包情况示意图

  1.2 报文粘连问题的分析

  报文粘连既可能由发送方产生,也可能由接收方产生,还可能由进行数据传输的交换机产生。

  (1) 发送方引起的报文粘连

  由发送方引起的报文粘连是源于TCP协议本身。因为TCP协议为提高传输效率采用了Nagle算法(详见RFC896),发送方要等收集到1460字节的数据才会发送一包数据,或是等到发送缓冲区满后才会发送一包数据,这就造成了报文的粘连。

  (2) 接收方引起的报文粘连

  由接收方引起的报文粘连,往往是因为接收方进程没有及时处理数据造成的。接收方要先把收到的数据放入接收数据缓冲区,用户进程再从该缓冲区中读取数据。如果在下一包数据到达时前一包数据还未被用户进程取走,则新一包数据就接到前一包数据之后,而用户要根据事先设定好的缓冲区大小从系统接收缓冲区中读取数据,这就造成了一次取到了多包数据。

  (3) 由交换机引起的报文粘连

  由交换机引起的报文粘连,往往是因为由交换机相连的各个部件在一段时间内发送的报文数据太多,以至于超出了交换机的处理能力。这样,本来发送端分开发送的数据报文在交换机内部的缓冲区中粘连在一起。现在,在实验现场DCC等使用VxWorks操作系统的部件需要使用一个独立的端口进行程序下载,还要有一个独立的端口提供给SecureCRT软件以进行实时监控;同时DCC与MCU和中央控制系统的数据传输也要在同一台交换机中进行。这就有可能导致在某一段时间内数据量超过了交换机的处理能力。

  1.3 文粘连对系统的影响

  如果系统发生了报文粘连现象而不进行相应处理,则将导致整个系统无法正常运行。

  如果用于传输数据的报文被粘连导致无法正常处理,则将使接收方无法进行运算,现场实时的数据无法获得,从而使标志位无法置位,程序无法继续进行。如果作为生命信号的报文被粘连导致无法正常处理,则将使接收方认为发送方出现故障;若此情况连续发生,则接收方将认为发送方死机,从而停机,以保证整个系统的安全。

  2 报文粘连问题的解决方法

  2.1 发送方的解决方法

  对于由发送方引起的报文粘连,可以采用以下两种方法解决。

  (1) 关闭Nagle算法

  由于VxWorks系统支持Windows Sockets 1.1标准,可以将setsockopt函数中的level项设置为IPPROTO_TCP1,这样就可以关闭Nagle优化算法。

  (2) 将Winsock kernel buffer设置为0

  此方法只有在支持Windows Sockets 2.0标准的系统上才能使用(VxWorks不能支持),可在发送方为工控机、接收方为使用VxWorks操作系统的处理器的情况下使用。只需将setsockopt项中的level设为SOL_SOCKET,将SO_SNDBUF值设为0。

tcp/ip相关文章:tcp/ip是什么



上一页 1 2 下一页

评论


相关推荐

技术专区

关闭