任艳蕾
(涿州市技师学院 河北 涿州 072750)
基于数传电台的TCP/IP通信平台的设计与实现
任艳蕾
(涿州市技师学院 河北 涿州 072750)
本文介绍了一种借鉴虚拟网卡技术设计实现基于数传电台的TCP/IP通信平台的方法,该研究成果的应用进一步拓展了数传电台的应用价值与范围。
数传电台;虚拟网络;TCP/IP
通信网络是制约野外物探作业信息化发展的关键与瓶颈。面对公共运营商网络的不稳定及卫星通信的高昂费用,在现有通信手段的基础上,自主研发实现一套通用的、支持公网通信协议(TCP/IP)的网络通信系统显得尤为重要。
鉴于数传电台在石油等行业野外作业中被广泛使用,本文以无序的数传电台间的通信为基础,在充分借鉴网卡虚拟化的思想和成果的基础上,设计实现了一个以虚拟网卡为载体的通信网络平台系统。该系统一方面通过对底层网络协议栈的封装将多个电台组一个稳定的、可靠地通信网络,另一方面为上层应用程序提供统一的网络编程接口,极大地增强系统的通用性,从而减少不必要的重复开发。
虚拟网卡目前多用于网络安全和构建虚拟网络等应用领域,在Linux平台上,虚拟网卡实际上就是一个网卡驱动程序。
2.1 虚拟网卡工作原理。虚拟网卡并不与真实的物理设备进行数据交互,而是提供了一种数据在操作系统内核态和用户态之间交互的机制。通常情况下虚拟网卡驱动并不是单纯的网卡驱动程序,其中还实现了部分字符设备驱动的功能。在此基础上,通过访问用户态字符设备文件,即可实现数据在Linux操作系统两种运行状态下的交互。
图1 虚拟网卡原理
图2 网络驱动体系结构
2.2 虚拟网卡体系结构。通用虚拟网卡程序的体系结构如图2所示,可分为网络协议接口层、网络设备接口层、设备驱动功能层及网络设备与媒介层。
网络协议接口层为虚拟网卡与内核TCP/IP协议栈之间的接口,通过调用该层提供的dev_queue_xmit函数和netif_rx函数,虚拟网卡主逻辑功能可分别实现IP包的接收与发送。网络设备接口层提供了统一的用于描述具体网络设备属性和操作的结构体net_device。设备驱动功能层是网络设备接口层net_device结构中各成员函数的实现,是网络设备属性和操作功能的体现。网络设备与媒介层是完成数据包在物理设备上的发送和接收的物理设备接口。虚拟网卡驱动程序最主要的设计工作集中在设备驱动功能层。
本文设计的虚拟网卡由协议预处理层、数据链路层及物理接口层组成,系统架构设计如图3所示。虚拟网卡的设计核心是数据链路层,该层在定义了数据帧格式的基础上,实现了数传电台组网、通信链路控制等功能。协议预处理层介于内核协议栈与数据链路层之间,实现了网络层数据格式与自定义数据链路层间的转换及数据的双向传输。物理接口层介于数据链路层与物理设备(数传电台)之间,通过串口读写操作,实现了数据帧的收发。
图3 虚拟网卡架构设计
图4 数据帧格式定义
3.1 数据链路层设计
3.1.1 数据帧格式定义。数据帧保障了数据在链路层上传输的完整性和有序性,其格式定义如图4所示。其中,Type字段占一个字节,其中bit0表示该数据帧的类型,“0”代表普通数据帧,“1”代表网络管理数据帧;bit1用于区分原帧与应答帧,“0”代表原帧,“1”代表应答帧;bit2用于标识该数据帧的本次传输是否由主节点发起,“0”代表由从节点发起,“1”代表由主节点发起;bit3-7暂未定义。To字段占一个字节,标识该数据帧的目的地址;From字段占一个字节,标识该数据帧的源地址;Seq.字段占一个字节,用于标识该原帧在发送队列中的序号,接收方正确接收数据后,在应答帧中沿用原帧Seq.值。Data字段占0~64个字节,为实际发送的数据。Resd.字段为保留字段,占一个字节,用于今后协议的扩展。Checksum字段占一个字节,为该数据帧的校验和。
3.1.2 自组网协议设计。自组网协议由组网策略、入网策略、出网策略组成。该协议通过组网策略将多个网络设备(数传电台)以主从模式组成稳定、有序的数据通信网络,对网络成员进行统一管理。具体有以下三个功能:
组网策略:利用最小ID分簇算法(LID),选出中心节点,中心节点负责维护网络成员列表。
图5 入网流程
图6 链路控制流程
图7 数据发送流程
入网策略:中心节点收到子节点入网请求后,中心节点将该节点加入网络成员列表并告知该节点(子节点入网过程如图5所示)。
出网策略:中心节点对网络成员进行超时监控,发现节点处于覆盖范围外(通信超时),则从成员列表中删除该成员。
3.1.3 数据链路控制模块设计。数据链路控制模块负责解析网络管理帧缓存区中的管理命令,并通过改变功能模块标志位来通知对应功能模块进行工作。以信道使用权为例,当数据接收模块将带有信道使用权的管理帧放入网络管理帧缓冲区。数据链路模块开始遍历该缓冲区,解析到获取信道使用权的命令后,将数据发送模块的标志位置1,通知数据发送模块开始工作。图6所示为数据链路控制流程。
3.1.4 数据发送模块设计。数据发送模块负责将虚拟网卡产生的数据帧发送到网络中。有数据要发送时,数据发送模块先判断是否具有信道使用权限,如果当前节点具有信道使用权,数据发送模块将缓存区的数据帧取出,调用串口操作接口将数据发送到网络中。然后向主节点发送释放信道使用权的控制帧。数据发送流程如图7所示。
3.1.5 数据接收模块设计。数据接收模块负责接收网络数据,首先判断数据目的地是否为自己,如果是将接收的数据按数据帧和控制帧分别存到接收数据缓存区和接收控制命令缓冲区。反之不做任何操作。
3.2 IP包预处理模块设计。IP包预处理模块主要有两个功能:一是将协议栈下发的IP数据包按数据传输帧格式进行分割和组帧如图8所示,然后存入发送缓冲区;二是接收缓存区的传输帧按IP包的帧格式解包和组帧,然后传入内核协议栈中。通过IP包预处理模块实现了IP数据与传输帧的转换,完成内核协议栈和数据链路层数据的交换。
3.3 串口读写模块设计。物理接口层兼容网络设备基本操作,为数据链路层的数据收发模块提供操作接口,使数据链路层无需关系底层网络设备,实现数据链路层的数据在物理网络设备上的传输。
图8 数据帧封包流程
4.1 测试环境。本测试利用两台计算机通过数传电台进行网络通信,来验证虚拟网卡的工作情况。
主机A:虚拟网卡IP为192.168.0.1,操作系统是Linux(内核版本 2.6.32);主机B:虚拟网卡 IP为192.168.0.2,操作系统是Linux(内核版本2.6.32)。
4.2 数传电台PING命令测试。①insmod vnic.ko加载驱动程序。②ifconfig vnic 192.168.0.1 up启动A主机虚拟网卡;ifconfig vnic 192.168.0.2 up启动B主机虚拟网卡;③A主机向B主机发送ping命令。
4.3 测试结果。主机B接收到A的ping包后经过差错控制,写入虚拟网卡,并读出虚拟网卡的恢复包。然后发向主机A,B接收到84字节的ping包,并以16进制的形式打印出来,其中“c0 a8 00 02和c0 a8 00 01”分别表示源地址和目的地址。第21个字节“08”表示此ping的请求包。Ping包的回复内容也类似,第21个字节“00”表示数据包时ping的回复包。
[1]韦东山.嵌入式Linux应用开发完全手册 [M].北京:人民邮电出版社,2008.
[2]JONATHANCORBET,ALESSANDRORUBINI& GREG KROAH-HARTMAN.Linux设备驱动程序 (第三版) [M].北京:中国电力出版社,2006.
[3]Douglas E.Comer,David L.Stevens著,张卫、王能译.TCP/IP网络互联技术卷3客户-服务器编程与应用windows套接字版 [M].北京:清华大学出版社,2004.
[4]Klaus Wehrle Frank Pahlke,Hartmut Ritter著,汪青青,卢祖英译.Linux网络体系结构 [M].北京:清华学出版社,2006.