基于嵌入式接口的可扩展TCP/IP协议栈的设计和实现
2016-12-23郑爱宇
郑爱宇
(东南大学 软件学院, 江苏 南京 215000)
基于嵌入式接口的可扩展TCP/IP协议栈的设计和实现
郑爱宇
(东南大学 软件学院, 江苏 南京 215000)
为了提高TCP/IP协议栈的实时性, 并保证其可靠性和可扩展性, 满足物联网工程低功耗的需求, 采用LPC2124 ARM微控制器和ENC28J60网络芯片, 实现了嵌入式的TCP/IP精简协议栈. 该协议栈以实时操作系统μC/OS-Ⅱ为内核, 除了基本TCP/IP协议簇外, 还包含了DHCP、 ICMP、 Socket接口以及DNS协议以增强灵活性和可靠性. 使用纯C和汇编语言编写, 利用keil进行编译, proteus模拟仿真. 完成了系统的移植、 硬件驱动和协议栈的实现. 使用wireshark等工具进行了一系列的功能、 性能测试和实验. 实验和测试结果表明, 精简的协议栈在实现基本功能的基础上带来了更短的代码量(7.6 K RAM, 48 K ROM), 其UDP传输速率达到了16.5 K/s. 而且协议栈支持扩展, 用户可以根据需求自行设计.
TCP/IP协议栈; 嵌入式操作系统; μC/OS-Ⅱ; ARM
目前固有的TCP/IP协议的实时性能较低, 主要是由于为了保证数据传输可靠性以及数据流量控制而忽视了实时性, 过于臃肿的协议栈影响了运行吞吐速率、 能耗等性能. 在高性能中断下这种影响或许微乎其微, 但是在追求低功耗、 实时性的物联网领域中是难以接受的. 而且过于追求轻便和轻量级反而会导致大量的丢包现象出现, 此外, 缺乏应用层基本协议接口也是实现其可扩展性的瓶颈. 近年来的其他相关研究大多都是围绕TCP/IP协议簇的裁剪和修改, 但是过于轻量的协议簇自然带来可靠性的缺失. 于是对更加轻便并能保证相当性能的栈的需求就迫在眉睫了. 确保可靠性、 实时性同时保证灵活性的TCP/IP协议栈, 正是本文所研究和实现的成果.
1 嵌入式实时操作系统及移植
1.1 嵌入式操作系统和RTOS
嵌入式系统是基于计算机技术的裁剪移植性极强的应用导向的专用计算机系统复合应用系统. 嵌入式系统多数是实时操作系统(RTOS), RTOS更加强调应用需求的实时性, 其遵循的设计原则是: 运用算法, 设计并保证系统行为的可预测性[1]. 无论何时何地, 都能为多个实时任务合理分配资源以争夺系统资源.
1.2 硬件选型及μC/OS-Ⅱ操作系统移植
1.2.1 硬件选型
本协议栈使用的处理器是LPC2124. 精简型的协议栈需要的是具备高实时性、 高集成度、 低功耗特性的硬件系统. 而LPC2124不仅具备上述条件, 且体积小、 重量轻、 易于安装和维护. 其内核基于ARM7处理器, 而ARM的Thumb指令体系, 优化后的16位指令操作码也为增加代码密度提供了保障.
而对于单片机的以太网接入方案W5100和ENC28J60都是常用到的芯片, 这两种方案也可以说是硬件协议栈和软件协议栈的典型代表. W5100自有集成TCP/IP协议栈, 并且价格不菲, 而ENC28J60则可以根据用户需求自定义协议内容. 所以本文选择ENC28J60作为网卡.
1.2.2 μC/OS-Ⅱ操作系统移植
μC/OS-Ⅱ是由美国研究人员Labrosse开发的嵌入式实时操作系统. 其系统结构见参考文献[2].
内核移植包括堆栈设计、 重定义数据类型以及任务切换等问题[3]. 主要围绕以下文件展开:
OS_CPU.H文件: 主要是对数据类型和堆栈以及中断的各类宏的声明和定义.
OS_CPU_C.C文件: 编写和设计堆栈初始化函数, 以及功能扩展函数.
OS_CPU_A.S文件: 用汇编语言编写针对处理器寄存器的操作, 包括了最高优先级任务调用函数、 任务切换函数和中断任务切换函数[4].
2 嵌入式TCP/IP协议栈的分析
2.1 TCP/IP精简协议栈模型设计
为了实现栈的可靠性和可扩展性, 增加了DHCP、 ICMP、 Socket和DNS这4个协议, TCP/IP协议实际上是无法脱离应用层协议的. 无论是路由还是数据传输, 常见的路由协议都是有应用层封装的. 单纯的传输层无法负担更复杂的任务, 而且维护工作中, 关于链路状态的获取等需求也是需要应用层参与的. 因此在精简TCP/IP协议簇的基础上, 必须要有一套可靠的应用层协议来维持可靠性和可扩展性. 所以选择了上述4个协议, DHCP和ICMP可以提供地址分配和PING命令. Socket为上层提供了可编程接口. DNS则是接入互联网的必要选择.
本文将遵循TCP/IP 协议模型进行开发与数据传输, 分为4层: 链路层、 网络层、 传输层、 应用层. 依据实时性需要将对各层进行不同程度的精简, 裁去非核心功能.
2.2 TCP/IP协议栈内容
2.2.1 数据链路层和网络层协议
ARP:提供IP地址和MAC地址映射. 通过设计和编辑以太帧首部实现这一协议. ARP作为基本协议无需裁剪.
IP: 是栈核心协议, 提供不可靠的无连接的数据报传送服务. 主要实现如下功能: ① IP数据报接收的前后处理; 提供简单的IP校验和的验证. ② IP数据报发送的前后处理.
ICMP: 是用作测试、 控制和管理网络的协议. 本协议栈仅实现了回显请求和应答的基本功能, 以方便于调试和测试, 实际工程中可以对ICMP进行进一步裁剪和封装以更大程度提升栈实时性.
2.2.2 传输层协议
UDP: 是一个简单的面向数据报的传输层协议, 提供无连接服务以及端到端的进程间的通信服务[4]. 要注意的是, 虽然UDP、 TCP 和IP 是用同样的校验方式, 但是UDP 和TCP 的校验和计算还考虑了一个12 B的伪首部.
TCP: 是一种面向连接的提供可靠服务的协议, 同样通过设计和编辑TCP首部实现其功能. 提供三次握手和四次挥手的连接过程以及数据传输功能, 无流量控制和拥塞控制等功能.
2.2.3 应用层协议
DHCP: 动态主机配置协议基于C/S模型和UDP协议. 提供基本的IP地址分配功能[5].
Socket: 套接字就是由源IP地址和目的IP地址以及源端口号和目的端口号组成的四元组, 是支持TCP/IP的网络通信的基本操作单元(和编程接口), 可以看作是不同主机之间的进程进行双向通信的端点.
DNS[6]: 是基于UDP实现域名和IP地址转换映射的网络协议. 查询过程一般是: 客户向DNS服务器的53端口发送UDP/TCP报文, DNS服务器收到后进行处理, 并把结果记录仍以UDP/TCP报文的形式返回.
DNS提供递归查询和非递归查询两种查询方式, 非递归查询方式与递归查询方式相比响应速度快, 本协议栈使用的是非递归方式.
3 嵌入式TCP/IP协议栈的设计
3.1 嵌入式TCP/IP协议栈的软硬件组成
软硬件结构如图 1 所示[7].
图 1 系统软硬件结构Fig.1 Structure of system software and hardware
图 1 中, 系统软硬件之间通过μC/OS-Ⅱ和网络芯片相关模块实现交互, 位于应用层的用户通过虚拟终端向主模块发布指令和接收响应, 主模块可以直接通过网络驱动库完成信息收发, 主模块和系统任务通过操作系统内核完成任务的管理和微处理器资源的使用.
3.2 嵌入式TCP/IP协议栈的模块划分
本文实现的嵌入式模块划分如表 1 所示. 协议模块已在第2节阐述, 余下的网络接口模块和网络驱动模块处于网络接口层.
表 1 TCP/IP协议栈模块划分
3.3 主程序流程
根据应用设想和设计理念, 设计包含核心功能的主程序流程如图 2 所示.
图 2 主程序流程Fig.2 Main program flow
首先, 系统通过初始化完成设置, 这一步将可能涉及到ARP、 DHCP以及UDP等相关协议的展开和应用. 系统根据来源于硬件接口的数据帧, 通过有序解析, 鉴别和处理不同类型的数据, 并据此调用相关处理模块对报文进行针对性处理和决策, 最后将处理结果返回硬件接口或响应.
系统的数据流是围绕网络数据报的封装和解析展开的. 依据网络分层的概念完成对数据报文的封包和解包.
图 2 未提及的网络接口层主要提供底层物理设备的服务, 如设备初始化、 中断、 数据收发等. 虚拟终端模块提供简单的用户交互, 用户可以通过终端发布指令(PING命令和DNSLookup命令)和收发信息(基于TCP和UDP的聊天对话).
4 嵌入式TCP/IP协议栈的实现
4.1 系统任务架构
μC/OS -Ⅱ操作系统是围绕任务展开工作的, 任务可以认为是进程[7].
在系统启动时需要先进行系统初始化, 完成一些系统内核处理, 然后, 完成网卡初始化. 接着进入到协议栈层级, 陆续完成DNS、 UDP以及协议栈消息邮箱初始化. 此后创建DHCP任务、 DNS任务、 PING任务、 TCP客户端任务和TCP服务器端任务. 最后, 调用OSStart函数启动操作系统多任务.
4.2 系统全局数据结构
系统需要实现一些全局数据结构, 以便实现协议栈. 故将这些内容编入variable.c文件[8].
IP地址结构体[8]: 由大小为4的无符号8位整型数组组成. BUF数据结构体: 用于保存数据报文, 由结构体指针、 长度和数据内容组成. SOCKET结构体. 此外, 还声明了一些常量宏定义, 以及字节序转换宏. 并将与IP地址获取相关的函数也设计为全局函数.
4.3 网络驱动模块和网络接口模块的实现
网络驱动模块用以对网卡进行初始化并且为链路层提供接口函数. 分为两部分(spi.c和enc.c)实现.
4.3.1 中断处理和spi端口初始化
由spi.c文件完成中断处理, spi即串行外设接口, 用于数据交换, enc网络芯片是用中断方式完成数据交换的, 需要对中断进行控制和处理. 这个模块将保证数据收发的高效完成. 设计spi端口来进行中断式数据收发.
4.3.2 enc网卡驱动和网卡接口
由enc.c文件完成网卡驱动控制和向上层提供信令接口. 驱动编写坚持简单高效, 仅设计读写网卡和网卡缓存的方法以及网卡初始化等函数, 为了平衡处理器和IO的速率差, 还设计了缓存管理函数.
4.4 数据链路层和网络层的实现
数据链路层的ARP协议由于其基本功能实现就已经足够精简, 无需赘述[9]. 此外, 实现了数据链路层数据帧的收发、 解析与封装.
网络层的IP协议实现了IP报文的收发、 解析与封装, 以及IP头部的校验和、 版本号、 目的地址等信息等校验. 并根据协议域, 判断是否为ICMP, 如是则将数据内容发送给ICMP模块; 如果为UDP, 则将数据内容发送给UDP模块[10]. 此外, 还实现了ICMP的显示终端(见4.7节), 以便于之后的测试和实验.
4.5 传输层的实现
UDP: 用户要使用UDP 协议发送数据时, 将用户数据按UDP 协议报文格式进行封装并发送[11]. 当IP 协议层发现接收的报文是UDP 数据报时, 将UDP 进程唤醒, 然后对接收到报文进行分析处理, 然后向用户进程发送信号通知用户进程接收数据.
TCP: 模块实现遵循三次握手建立连接和四次挥手关闭连接的协议规程. 运行和维护一个TCP客户端任务和TCP服务器端任务.
4.6 应用层的实现
Socket: 模块完成了对UDP和TCP的API封装以向上层提供更有效的接口[12].
DNS: 当用户请求进行DNS域名解析时, 即用户从虚拟终端输入DNSLookup指令时, DNS_send_task将获得任务消息邮箱, 从而处理该请求, 即将请求封装并发送给UDP模块. 而当DNS模块收到来自下层的报文时, 调用DNS_check函数处理报文段, 并将结果解析打印输出到虚拟终端上[13].
DHCP: 本系统是通过VmWare的虚拟网卡的DHCP服务器功能实现IP地址自动获取的, 且只适用于局域网. 系统启动后, 首先会调用DHCP_init函数初始化DHCP客户端任务[14]. 此后将执行DHCP的IP地址分配流程.
4.7 虚拟终端模块的实现
虚拟终端用于提供用户和系统的交互, 这一模块的数据交互都是通过操作系统提供的通用穿行口(UART)协议实现的. 主要接口check函数负责将用户输入进行筛选、 格式化和分类提交至下层模块, 而virtual_check和dns_check函数则完成更细化的输入处理[15].
5 嵌入式TCP/IP协议栈测试
协议栈使用Proteus进行模拟仿真, 先用Keilv4编译源代码并生成二进制文件, 再将文件关联至仿真芯片中. 仿真电路图如图 3 所示.
图 3 仿真电路图Fig.3 Simulation circuit diagram
首先进行功能测试, 结果如图 4 所示.
图 4 功能测试结果Fig.4 Function test results
图4前两行表示硬件设备初始化完成, 第三行表示DHCP模块正确运行并已经自动获取IP地址(192.168.75.129). 后面为PING成功的结果.
图 5 则是DNS测试结果. 终端上输入dnslookup www.baidu.com, 将会执行DNS. 使用wireshark软件可以正确抓到PING和DNS相关数据包. 使用TCP客户/服务器端程序和UDP程序可以实现与本系统的TCP、 UDP连接并简单双向对话.
图 5 DNS测试结果Fig.5 Test results of DNS
协议栈的性能测试方法如下: 按照1 s, 0.1 s和全速这3种时间间隔发送一个200字节的UDP数据包, 共发送1 500包, 测试10次, 计算有操作系统和无操作系统下的平均丢包率. 其测试结果如表 2 所示.
表 2 性能测试结果
当数据发送速率在1 s/包的情况下, 两者都不丢包. 但是当达到0.1 s/包时, 丢包率都十分高, 有系统的协议栈为97.9%, 无系统的为97.6%. 然而全速发送时, 操作系统管理下的协议栈有61.0%的丢包率, 无系统的为72.3%. 如果提供确认机制或超时重传机制, 数据将会被安全送达. 在全速传送200字节UDP数据包情况下, 数据速率可达16.55 K/s.
6 结 论
本文系统代码精简 (7.6 K RAM, 48 K ROM). 通过测试和实验得出了精简协议栈可以在高发送率下保证比较良好的送达准确率的结论. 这套基于嵌入式接口的精简TCP/IP协议栈系统的设计与实现, 为物联网工程应用的各类实际场景提供了一个可裁剪的中间件, 用户将可以基于此进行任意个性化定制和设计, 从而满足针对特定目的应用任务的需要.
[1]Cai X, Lyu M R, Wong K F. Component-based embedded software engineering: development framework, quality assurance and generic assessment environment[J]. International Journal of Software Engineering and Knowledge Engineering, 2002, 12(12): 107-133.
[2]吕京建, 张宏韬. 基于嵌入式中间件的系统开发方法[C]. 中国微计算机第十三届年会2002年嵌入式系统及其应用论文集. 2002: 414-419.
[3]何立民. 嵌入式系统的可靠性与安全性设计[J]. 单片机与嵌入式系统应用, 2016, 5(16): 77-79. He Limin. Design of reliability and security of embedded system[J]. Microcontrollers and Embedded Systems, 2016, 5(16): 77-79. (in Chinese)
[4]潘可. 具有完整TCP/IP协议支持的U-Boot[J]. 单片机与嵌入式系统应用, 2014, 14(2): 5-8. Pan Ke. U-boot with full TCP/IP protocol support [J]. Microcontrollers & Embedded Systems, 2014, 14(2): 5-8. (in Chinese)
[5]张立立, 王伟, 杜燕东. 基于TCP/IP的天文射电望远镜节点控制器研制[J]. 测控技术, 2013, 32(3): 35-40. Zhang Lili,Wang Wei, Du Yandong. Development of node controller for astronomical radio telescope based on TCP/IP[J]. Measurement and Control Technology, 2013, 32(3): 35-40. (in Chinese)
[6]卢有亮. 嵌入式实时操作系统μC/OS原理与实践[M]. 北京: 电子工业出版社, 2014.
[7]刘博文. 基于ARM的嵌入式实时操作系统的内存管理[D]. 武汉: 华中科技大学, 2011.
[8]马立国. 嵌入式实时操作系统μC/OS-Ⅱ在ARM上的移植[D]. 长春: 吉林大学, 2011.
[9]Labrosse J J. μC/OS-Ⅱ源码公开的实时嵌入式操作系统[M]. 邵贝贝, 译. 北京: 中国电力出版社, 2001.
[10]彭少熙, 孙正顺. 家庭网络中的嵌入式Internet方案[J]. 电子技术应用, 2001, 27(10): 47-50. Peng Shaoxi, Sun Zhengshun. Embedded Internet plan in home network[J]. Application of electronic technique, 2001, 27(10): 47-50. (in Chinese)
[11]杜春雷. ARM体系结构与编程[M]. 北京: 清华大学出版社, 2003.
[12]李海涛. 基于μC/OS-Ⅱ 的车载蓝牙控制系统[J]. 电视技术, 2014, 38(11): 190-192, 197. Li Haitao. Vehicle controlling system of bluetooth technology based on μCOS-Ⅱ[J]. Video Engineering, 2014, 38(11): 190-192, 197. (in Chinese)
[13]马昊, 吴晋峰, 邱小平. 基于μC/OS-Ⅱ操作系统的嵌入式配变监控终端研究[J].电子技术应用, 2015, 41(s1): 351-352, 359. Ma Hao, Wu Jinfeng, Qiu Xiaoping. Research on embedded monitoring terminal for distribution transformer based on μC/OS-Ⅱ operating system[J]. Application of Electronic Technique, 2015, 41(s1): 351-352, 359. (in Chinese)
[14]张玉杰, 吴安安. 基于TCP/IP及DALI总线技术的只能照明控制系统[J]. 电视技术, 2015, 22: 23-26, 43. Zhang Yujie, Wu Anan. Intelligent lighting control system based on TCP/IP and DALI bus technology[J]. Video Engineering, 2015, 22: 23-26, 43. (in Chinese)
[15]王建平, 周辰飞, 朱程辉, 等. 一种ZigBee-TCP/IP无缝网关模型[J]. 合肥工业大学学报(自然科学版), 2013, 36(9): 1058-1062. Wang Jianping, Zhou Chenfei, Zhu Chenghui, et al. A ZigBee-TCP/IP seamless gateway model[J].Journal of HeFei University of Technology (Natural Science), 2013, 36(9): 1058-1062. (in Chinese)
Design and Implementation of TCP/IP Protocol Stack Based on Embedded Interface
ZHENG Ai-yu
(School of Software Engineering, Southeast University, Nanjing 215000, China)
In order to improve the TCP/IP protocol's ability of real-time, reliability and extensible property in embedded devices, and also meet the requirement of low power consumption, using LPC2124 ARM micro controller and the ENC28J60 network-chip, implemented a simple embedded TCP/IP streamlined protocol stack.The protocol stack uses embedded real-time operating system-μC/OS-II as the kernel, in addition to the basic TCP/IP protocol cluster, it also contains the DHCP, ICMP, Socket interface and DNS protocol to enhance the flexibility and reliability. Based on the C language and assembly language, protocol stack was compiled using Keil and was simulated in Proteus. The transplantation of the system, hardware driving and the whole protocol stack are completed. Using wireshark catch tool made a series of tests and experiments on the functionality and performance of the protocol stack system. Results conclude that, the tidy protocol stack on the basis of the realization of basic functions brings shorter coding (7.6 K RAM, 48 K ROM),and the UDP transmission speed reaches 16.5 K/s. Besides, The protocol stack support extension, users can design by their own requirement.
TCP/IP protocol stack; embedded system; μC/OS -Ⅱ; ARM
1673-3193(2016)06-0614-06
2016-03-15
国家自然科学基金资助项目(61201344)
郑爱宇(1990-), 男, 硕士生, 主要从事嵌入式系统及图像处理研究.
TP393.04
A
10.3969/j.issn.1673-3193.2016.06.011