新闻中心

EEPW首页 > 手机与无线通信 > 设计应用 > 采用ACR/Tbit路由器的硬件抽象层通用性软件结构设计

采用ACR/Tbit路由器的硬件抽象层通用性软件结构设计

作者:时间:2012-06-08来源:网络收藏

2.2 三次握手过程

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

  每个客户端与服务器端进行真正的数据传输之前,首先要进行一个握手的建立过程,如图3所示。握手过程成功后则表示双方通信通道正常,只有在得知握手成功后双方才可以正常地收发报文,从而克服了UDP协议方式的面向无连接性。为了随时检测和维护双方链路的通连性,每个客户端与服务端在一定的间隔时间内要互发KEEPALIVE报文。如果在规定的时间内收不到对方的KEEPALIVE报文,说明断链,要进行相应的断链处理。

  

  图3 握手建立过程

  2.3 接收端丢失确认及滑动窗口

  发送UDP报文时在自定义的内部数据头中加入所发送数据的序号,接收端收到后发送确认信息,如果发送方在规定时间内没有收到确认信息,则认为该包丢失,会连同原包的序号重新发送。

  滑动窗口的目的主要是为了实现流量控制,防止拥塞。每个发送方维护一个重发队列,保存着一定数量的发送而没被确认的报文,该队列剩余空间的大小可以限制应用部分发包的速率。由于UDP协议是基于消息的传输协议而非基于流的,因此不必考虑发送端可以接收多少数据,只需知道能否接收数据即可。

  总之,UDP传输控制方式主要考虑到其传输简单快速、额外开销较小的特点,但这是以牺牲一定的可靠性为前提的,因此必须在应用程序中增加可靠性保护机制。在实际应用中证明上述方法可靠高效,能够维护内部通信有序、快速的数据传输。

  3 基于多用户的用户接入管理

  在Linux操作系统下,系统把设备映射为一个特殊的设备文件,用户程序可以像对其他文件一样对该设备文件进行读写操作。虚拟驱动模块运行在Linux操作系统下,模拟从处理单元上的接口单元,形成收发协议报文功能和数量与此一致的层虚拟接口单元。因此,每个实际的接口单元都在内核中对应一个注册的虚拟设备,以便于上层控制对数据平面的管理与数据交互。

  3.1 多用户虚拟设备驱动程序的动态加载

  虚拟驱动在内核中的功能通过动态加载方式实现。通常的动态加载方式是将驱动程序作为一个整体模块,在需要时再加入内核;由于多用户接入方式使得在某一时刻内核中注册的接口单元数量不确定,如果实施一次性加载会冗余太多,不利于资源的有效利用。因此,在内核中加载一个基本模块的前提下,实现各虚拟设备的动态加载过程,达到以一个基本的虚拟设备控制多个设备驱动模块的功能。

  如图4所示,对虚拟驱动设备的控制由内部通信模块与设备管理模块共同完成。设备管理模块通过内部通信模块下达加载、卸载虚拟驱动的命令,通过内部通信模块与虚拟驱动的控制通道进行。内部通信模块通过调用ioctl()不同的命令字完成对虚拟驱动模块的控制过程。

  

  图4模块动态加载过程

  基本驱动模块的加载通常的驱动模块加载方式,即调用module_init()函数进行基本模块的初始化及在内核中的注册过程。以该基本驱动模块为基础,当内部通信模块收到加载某个用户设备接口的命令后,通过调用该基本模块的Base_ioctl()在内核中注册一个新的驱动设备,该注册设备才是与实际接口单元相对应的虚拟驱动模块,应用程序对用户设备数据的读写都是通过这些注册的接口设备而非基本设备提供的标准函数进行。这样的动态加载过程使得当没有设备加载时在内核中只存在一个基本的虚拟驱动模块,只有需要注册的用户才将其对应的设备接口的虚拟驱动模块加载到内核中,从而减少系统冗余,便于管理。

  各用户接口单元与虚拟驱动的数据交互通过内部通信模块与虚拟驱动的数据通道进行,所对应的系统调用为该注册设备的dev_ioctl()。在该功能函数中,实现用户空间与内核空间的数据交互。

  3.2 对多用户接口设备虚拟驱动的管理

  为实现内核虚拟驱动模块与实际接口单元的一一对应,必须解决各驱动模块的命名原则问题。将每个实际接口单元在接入段拓扑中的位置设置为不同的参数,在内部通信中这些参数作为传输数据的报头信息出现,根据它们可以生成一个唯一的字符串作为对应该接口单元的虚拟驱动设备名称,而且根据设备名称亦可还原出实际接口单元的拓扑信息,以供内部通信使用。在内核中维护一个由各注册设备名称所组成的动态链表,每个链表节点维护一个收发报文的数据队列,虚拟驱动与其他模块的数据交互都通过该链表进行。

  3.3 对虚拟设备数据读写过程

  对数据的读写过程主要是在虚拟驱动模块、内部通信模块及上层控制之间进行。虚拟驱动模块运行在内核空间,而内部通信模块运行在用户空间,因此,主要解决用户空间与内核空间的数据传递问题。通过memcpy_tofs()及memcpy_fromfs()系统调用用户空间与内核空间的数据交互。

  在内核中维护一个由各注册设备名称所组成的动态链表,每个链表节点维护一个收发报文的数据队列,虚拟驱动与其他模块的数据交互都通过该链表进行。接收报文过程:内部通信模块将从接口单元接收的报文通过ioctl()调用传给虚拟驱动。该函数通过struct net_device *dev结构找到对应的虚拟设备的dev_ioctl()功能函数,调用memcpy_fromfs()将数据拷贝至内核空间,经过处理后通过netif_rx()函数通知上层协议有数据传入。发送报文过程:虚拟驱动将从上层取出的数据放至自身维护的通过虚拟接口设备名称维护的数据队列中,内部通信模块通过ioctl()论询各接口设备数据队列是否有数据可读,如果有数据,虚拟驱动通过memcpy_tofs()调用将数据拷贝至用户空间提供的缓冲区中。

  文中针对大规模用户接入方式的特性,讨论了一种基于层的软件及实现方式,并研究了其关键技术,包括基于UDP传输方式的内部通信的可靠性实现及基于多用户的动态模块加载技术,适用于承载业务量的扩展和多用户接入特性,并且在上层软件实现中,基本上可以不考虑底层细节,增强了的开放性及可扩展性。


上一页 1 2 下一页

评论


相关推荐

技术专区

关闭