IP协议栈范文
IP协议栈范文(精选8篇)
IP协议栈 第1篇
本课题研究是基于闪电定位系统的网络接口部分, 设计通信协议, 联成雷电遥测网络。该网络具有实时观测雷电活动, 显示方位, 然后自动记录、存储和整理分析雷电参数, 雷电参数可以在终端上任意的调用、查询和统计, 这样, 雷电探测仪的功能就能得到更充分的发挥。雷电监测定位系统在雷电的监测、研究以及防护等领域处于极其核心的位置。
2 软件设计
设计的关键是TCP/IP协议栈的嵌入, 能够使收发双方顺利解包通信。本软件运行于终端上, 实现与终端DSP的双向通信, 在通信中可以自行按照资料定制数据包的格式。
2.1 TCP/IP协议栈程序设计
本课题是基于嵌入式系统的TCP/IP设计, 所以必须对TCP/IP协议栈进行必要的简化。本设计保留四个主要的协议, 即ARP协议、IP协议、ICMP协议、TCP协议。
它实现的基本功能有以下几个方面:
(1) 实现数据的接受、发送, 同时对数据进行一定的处理。
(2) 实现网络基本传输协议。
(3) 实现网络远程控制, 基本分为以下几个模块:主控模块, 初始化模块, 协议模块, 网络传输接口模块。
在系统工作时, 程序先从main () 函数运行, 接着调用RTL8019AS初始化程序, 最后主程序进入一个无条件循环工作状态, 一直等待中断服务程序或和其它应用功能函数的运行。程序流程图如图2-1所示。
2.1.1定制ARP协议
ARP协议的处理过程, 主要分为ARP的初始化、相应ARP请求、ARP应答和ARP包处理。在实现网卡的驱动程序之后, ARP处理操作就是封装ARP包。
ARP请求函数实现ARP请求操作。ARP协议根据子网掩码判断IP地址是否在同一网段, 如果在同一子网段, ARP就请求其MAC地址, 否则请求默认网关的MAC地址。在发送ARP请求包时, 因为不知道对方物理地址, 在设置好本机的IP地址和物理地址以及目的IP地址后, 必须将目的物理地址设置为广播地址, 由收到该请求的主机来填充此字段。
ARP的应答函数, 除目的端硬件以外, 所有的其他字段都有填充值。在收到一份ARP请求包后, 应答函数就把硬件的地址填充进去, 然后把两个目的端地址分别替换掉两个发送端的地址, 并把相关操作字段置为2, 最后发送回去。
ARP的处理函数用来完成对接收ARP应答包的信息处理, 主要涉及到ARP开始合法ARP字段更新ARP表的学习和更新, 以及唤醒IP层的等待发送报文调度函数。
2.1.2 IP协议的实现
在发送IP报文的时候, IP发送程序要判断目的IP地址是否在本网段内, 这要涉及到子网掩码和网关的IP地址。根据本地IP地址和子网掩码来判断是不是本网段内主机。若为本网段内主机, 而且ARP缓存表中没有该地址的映射关系, 则在本网段内发送ARP请求, 请求该主机的物理地址与IP地址映射;若该主机不在本网段内, 就要把目的物理地址设置为网关的物理地址来发送IP报文, 相应的ARP请求也是发送给网关的ARP请求。系统中实现的IP模块主要包括以下功能:IP初始化、IP包处理、发送IP报文。
2.1.2 IP协议的实现
发送IP包时, 程序要判断目的IP地址和本地IP是否在同一网段内, 这要根据本地IP地址和子网掩码来判断。若目的IP为本网段内地址, 并且ARP缓存表中不存在该地址的映射关系, 则在本网段内发送一个ARP请求, 用于请求该主机的物理地址与IP地址映射关系。如果该主机不在本网段内, 就把目的物理地址设置成网关物理地址来发送IP包, 相应的ARP请求也发送给网关。该设计中涉及到的IP模块主要包括以下几个功能:IP初始化、IP处理、IP包发送。
2.1.3定义TCP协议
TCP是面向连接的协议, 传输TCP数据一般要经过三个阶段:建立连接、传输数据以及断开连接。由于该系统的设计是针对某个特定的应用进行的, 因而对TCP协议的算法进行适当的简化是很有必要的。
TCP状态机处理接收的TCP字段, 这由TCP报文处理函数来实现, 传输的数据放在TCP缓冲区中, 并且要置位相应的标志。
调用TCP状态机是在接收到报文时, 发送报文时要调用TCP状态机函数, 以此更新套接字的状态。通过定制系统的TCP/IP协议栈, 使系统更加模块化, 发送TCP报文时, TCP层把数据报文封装好, 并交给IP层, 报文的发送任务就由IP层处理。
3 测试结果
在对计算机IP地址进行设置后, 可以实现PC机与DSP终端的网络通信。在测试的过程中, 可以通过ping命令, 来实现和查看网络连接情况。然后用SpyNet从主机抓包, 先由终端向PC端发送数据, 然后再接收终传来的信息。由图可以看出控制软件的发送信息和接收信息的协议类型。本次测试借助程序抓包的情况下进行的, 验证了终端对于网络数据的接收和发送功能。基本实现了设计的要求和功能。
由图可知, 本机发送了“您好, 这是测试信息”, 在收终端到信息后, 把数据原包发送回来。并在软件上显示出来。由以上测试表明, 终端与PC机不仅成功连接, 而且发送数据成功, 说明终端网络模块, 网络驱动以及TCP/IP协议都能正常工作。
4 结论
本文研究了DSPs嵌入TCP/IP协议栈, 完成了硬件平台的搭建, 轻量级TCP/IP协议栈的嵌入。在实现TCP/IP协议时, 考虑到DSP的自身存储容量、运行速度和总线宽度, 所以对一些协议内部复杂的细节处理要去掉, 采用精简的协议进行通讯。DSP利用精简的TCP/IP可以实现基于以太网的数据传输, 为进一步实现雷电探测的远程测控、远程诊断和远程软件升级提供了很好的平台。此外, 可以在DSP中嵌入实时操作系统, 嵌入不同的网络组件, 这些为气象雷电定位的实现具有十分重要的意义。
参考文献
[1]张昊伟, 舒跃强, 李德军.闪电定位技术评述[J].气象水文海洋仪器, 2010 (03) .
IP协议栈 第2篇
摘要:实现一个运行在16位数字信号处理器TMS320VC5402上的小型嵌入式TCP/IP协议栈。对TCP/IP协议中的IP协议、ARP协议、UDP协议进行分析,完成基于TCP/IP协议的嵌入式网络系统。
关键词:DSPTMS320VC5402TCP/IP协议栈嵌入式系统
引言
随着嵌入式系统应用范围的不断扩展及网络应用的日益普及,使得越来越多的嵌入式系统需要支持网络功能。TCP/IP是目前一种被广泛采用的网络协议。TCP/IP是一套把因特网上的各种系统互连起来的协议组,已成为事实上最常用的网络标准之一。本文对TCP/IP协议中的IP协议、ARP协议和UDP协议进行了分析,利用DSP的专用汇编语言实现了自己的通信协议。由此可使DSP直接对Ethernet发来的数据包解分析,并能按照TCP/IP协议正确打包和发送,最终实现DSP与PC机的数据通信,成功地完成了语音数据的采集和发送,实现了DSP与PC机的语音数据传输。
1TCP/IP协议分析
一般在嵌入式系统中实现的TCP/IP协议都是面向数据采集和传输的,所以大部分实现都是IP协议、ARP协议、UDP协议或者是TCP协议。本文完成的是IP协议、ARP协议和UDP协议。一般认为TCP/IP为四层协议,实现的协议栈结构如图1所示。
DSP程序自下而上实现以下协议:
①媒介访问控制MAC(MediaAccessControl),向以太网收发数据。传送的数据格式为Ethernet数据帧格式。Ethernet帧的长度是可变的,但都大于64字节,小于1518字节。它包括头部、数据和尾部三部分。8字节的前导用于帧同步,CRC域用于帧校验。目的地址和源端地址是指网卡的物理地址(MAC地址),具有唯一性。
②地址解析协议ARP(AddressResolutionProtocol),使得物理地址和IP地址可以对应起来。在Ethernet上,使用地址解析协议ARP协议来实现IP地址到MAC地址的动态转换。ARPRequest(ARP请求)和ARPResponse(ARP响应)类型都是0X0806.ARP报文格式包括硬件类型、协议类型、硬件地址长度、协议地址长度、操作字段、源端物理地址、源端IP地址、目的物理地址和目的IP地址。
③Internet网核心协议IP(InternetProtocol),实现IP网络上的数据传输的基础。IP协议提供了一种高效、不可靠和无连接的传输方式。IP报文是IP协议的基本处理单元,是由报头和数据两部分组成的。IP报头包括20字节的固定部分和变长的选项部分。20字节的固定部分包括IP协议的版本号、IP首部长度、服务类型、报文总长度、标识符、片偏移、报文生存时间、首部校验和以及源端IP地址和目的端IP地址。
④用户数据报协议UDP(UserDatagramProtocol),提供不可靠的数据传输功能。它不对要发送的数据进行缓冲,直接把从应用层收到的数据加上UDP首部发送出去。UDP不会把应用层多、次发送的数据合并成为一个包发送出去。这对于编写简单的请求/响应模式的应用是很方便的,而且利用UDP协议对传输速率也没有太大的影响。UDP协议的数据报格式包括源端口口、目的端口号、数据报长度、UDP校验和以及UDP数据。
⑤上层应用协议,对语音数据打包传输,实现DSP与PC机的语音数据传输。
2硬件接口电路
硬件接口电路如图2所示。
微处理器采用的是TI公司生产的TMS320VC5402数字信号处理器。它采用了改进的哈佛结构,操作速率达到了100MIPS.以太网控制芯片采用RTL8019AS,是台湾Realtek公司生产的一种高度集成的以太网控制器。它实现了以太网媒介访问层(MAC)和物理层(PHY)的全部功能。译码、电平变换及向功能由XC95144xl完成。它是Xilinx公司生产的低功耗CPLD器件。HR61001G是中山汉仁电子有限公司生产的10BASE-T接口器件,起低通滤波和隔离变压等作用。
3软件设计
3.1DSP上嵌入式TCP/IP协议的汇编程序设计
由于DSP的资源有限,所以网络协议根据嵌入式应用进行了裁减。本设计中完成了ARP、IP、UDP等部分协议,既能够保证DSP接入以太网,又使DSP资源能够满足嵌入式系统应用的要求。
首先介绍一下所设计的DSP接收和发送以太网数据包所使用的数据结构。作者选择了联合体结构作为DSP接收和发送以太网数据包的缓冲区。联合体允许大小和类型不同的定义临时存储在同一存储器空间。这样的好处是各层协议之间数据的传递,实质上是数据指针在传递,而不是数据拷贝传递。而且各层协议可以直接使用该缓冲区,因为缓冲区内的结构体完全
是按照各个协议的帧格式设计的。在联合体databuf中有四个结构体成员―ethernetpkt、ippkt、udppkt、arppkt,分别对应着以太网数据帧、IP协议、UDP协议、ARP协议的帧格式。这4个结构体成员是按照它们各自协议的帧格式进行定义的。值得注意的是,因为databuf中存储的`是RTL8019AS发送的以太网数据帧,联合体的成员共用databuf缓冲区,所以在各个结构体中要预留低层协议报头存储空间。例如,IP协议的结构体ippkt就要在结构体定义中留下ethernetpkt报头的存储空间,即ippkt定义中前9个整型空间不能使用,从第10个整型空间开始才是IP数据报的内容。
下面分4层介绍所完成的嵌入式TCP/IP协议。
①物理层:主要完成以太网控制器RTL8019AS的复位,寄存器的初始化,并设置RTL8019AS的工作方式、中断响应、DMA通道接收缓冲区的地址设置等。
初始化程序如下:
WRITE0x21,CR/*设置命令寄存器,选中第0页*/
WRITE0x4c,PSTART/*页起始地址寄存器初始化,设定接收缓冲区起始页地址*/
WRITE0x80,PSTOP/*页停止地址寄存器初始化,设定接收缓冲区终止页地址*/
WRITE0x4c,BNRY
/*页边界地址寄存器初始化,设定从接收缓冲区读取数据的位置,读指针*/
WRITE0x40,TPSR/*发送页地址寄存器初始化,设定发送缓冲区的起始页地址*/
WRITE0xcc,RCR
/*接收配置寄存器初始化,使用接收缓冲区,仅接收自己地址的数据包、广播地址数据包和多点播地址包,小于64字节的包丢弃,校验错的数据包不接收*/
WRITE0xe0,TCR
/*传输配置寄存器初始化,启用CRC自动生成和自动校验,工作在正常模式*/
WRITE0xc9,DCR
/*数据配置寄存器初始化,使用FIFO缓存,工作在正常模式,DMA传输数据16位宽*/
WRITE0x01,IMR/*中断屏蔽寄存器初始化,使能数据包正确接收中断*/
WRITE0xff,ISR/*复位中断状态寄存器*/
WRITE0x61,CR/*设置命令寄存器,选中第1页*/
WRITE0x4d,CURR
/*当前页地址寄存器初始化,指向当前正在写的页的下一页,写指针*/
其中WRITE为宏指令,其定义如下:
WRITE.macrodata,reg
STdata,*(net_reg)
PORTW*(net_reg),reg
RPT#(20-1)
NOP
.endm
②网络层:主要实现IP协议和ARP协议。当DSP接收到正确的以太网数据包以后,调用check_packet函数处理。如果是ARP请求,则发送一个ARP应答;如果是ARP应答,则把对方的IP地址和以太网地址放到ARP缓存中;如果是IP包,则调用IP处理模块处理,接收数据。
check_packe函数如下:
arp:CMPM*(databuf.ethernetpkt.protocol),#0x0608
;判断协议类型是否为ARP协议
BCip,NTC
CALLarp_process;调用ARP协议处理模块
ST#taskfree,*(task);设置空闲任务指针
Btaskfree;跳转到空闲任务
Ip:CMPM*(databuf.ethernet.protocol),#0x0008;判断协议类型是否为IP协议
CC
ip_process,TC;若为IP协议,调用IP协议处理模块
ST#taskfree,*(task);设置空闲任务指针
Btaskfree;跳转到空闲任务
arp_process:接收ARP请求后,封装好ARP数据报,调用send_packet函数完成发送。在本设计中,DSP工作复位时,ARP协议发送一个ARP请求,发送自己的IP地址和物理地址给PC机。
ip_process:接收IP数据报后,判断协议,协议如果为17,即是UDP协议,则调用函数udp_process,处理UDP数据报,否则丢弃该数据报。在本设计中,正确接收一帧数据报后,会给PC机一个应答信息,通知PC机已经正确接收了数据报,可以继续发送数据。应答信息的封装首先调用create_udp_packet完成对应答信息的UDP协议的封装,然后调用create_ip_packet函数,这个函数完成了把封装好的UDP数据报再封装成IP数据报。最后调用send_packet函数完成发送。
③传输层:如果IP数据报中的协议类型为17,则为UDP数据报,需要调用udp_process函数处理数据报。正确接收了数据后,给发送一个应答信息,上面已经提到了具体过程,这里不再复述了。这里介绍一下UDP协议的一个难点―UDP数据的和校验。UDP和校验要求加上UDP伪首部以后再进行校验,伪首部格式包括32位源IP地址、32位目的IP地址、8位数据0、8位协议和16位UDP数据长度。作者根据接收缓冲区的内存管理特点,即接收缓冲区的成员结构共用同一块数据存储区,所以将IP协议的帧头从生存时间开始到帧头结束封装成UDP伪首部。其实这样做,只需将8位生存时间改为全0,16位首部和改为UDP数据长度即可,8位的协议、32位源IP地址和32位的目的IP地址不用改动。作UDP和校验的时候,从IP协议帧头的报文生存时间开始到IP数据报的数据部分结束作带进位的相加,最后比较对和校验就可以了。
④应用层:由于传输的是语音数据,将采集的数据经过A律压缩放到DSP数据缓冲区databuf中,应用TCP/IIP协议将其发送给PC机。将PC机发送来的语音数据A律压缩通过DSP的多通道缓冲串行口发送给声卡。对于语音数据的处理,交给PC机完成,这里只实现数据的传输。
注:TCP/IP协议源码见网站。
3.2PC机上的应用程序设计
使用的VB编程,利用Winsock控件完成语音数据的接收。这方面有很多例子可以借鉴,所以就不作太多的介绍。
结语
IP协议栈 第3篇
随着现代信息技术的进一步发展,对信息传递的速度及对大信息量的传输都有进一步需求,在这样的情况下,无论是对于硬件要求还是软件方面的要求都在提升。而在相同的硬件条件下,如何提高通信的速度、实时性能,软件的优劣在很大程度上影响着这些方面。由于Windows的广泛使用和其方便完善的网络结构的支持,针对Windows的网络开发不断增加,然而由于Windows系统为了包容多种协议以及Windows分层驱动的特点,导致数据从用户应用程序到网卡经过的驱动层数很多,势必导致数据的延迟增加,这对那些要求通信实时性能较高的系统来说是无法容忍的。所以研究Windows网络体系架构,对TCP/IP协议栈进行优化[1],使之适合于对于特定要求的系统,有很重要的研究意义和价值。
1Windows 网络的多层结构
如图1所示, 标准的 Windows 网络体系结构的最底层是网卡,网卡通过 NDIS 与网卡(NIC) 驱动程序通信,网卡驱动程序又通过 NDIS 与协议驱动程序通信。在 NIC驱动程序和协议驱动程序之间还可以插进去一个中间驱动程序。在协议驱动程序的上边,是内核模式 TDI客户驱动程序, 通过 TDI 接口同协议驱动程序交互[2]。再往上,则是用户模式的动态连接库(提供WIN32 NETAPI) 及网络应用程序。
从图1中可以看出,用户层编写网络程序与其他主机进行通信,发送数据需要经过Sockets接口,TDI客户,TDI传输驱动接口,NDIS协议驱动(TCP/IP协议栈)[3],NIC驱动程序,网卡,可以看出数据从用户提交给网卡的分层很多,Windows操作系统利用这种分层设计的方法,有诸多好处,开发人员可以只关注整个结构中的某一层;分层可以降低层与层之间的依赖,既可以良好地保证未来的可扩展,在复用性上也是很好的优势。但是分层结构也不可避免具有一些缺陷,一方面,分层过多会导致系统性能的下降,因为不采用分层结构,很多业务可以直接造访数据库,以此获取相应的数据,如今却必须通过中间层来完成,其中需要处理数据通过各层的信息等操作,这些都降低了系统性能;另一方面是数据的拷贝次数增多,数据拷贝操作不单需要占用 CPU 时间片,同时也需要占用额外的内存带宽,这就增加了系统开销。这些消耗都会造成数据的时间延迟增加,这对于那些对实时性能有特别要求的而又需要利用Windows平台的系统来说,这是很难容忍的。
2对Windows TCP/IP协议栈的简化设计
由于Windows网络结构分层较多,导致系统性能下降,网络数据的实时性能得不到体现,一种策略是简化现今Windows TCP/IP协议栈,减少分层;另一方面,利用零拷贝技术减少拷贝次数,减少系统性能消耗;可以采用多级优先级队列,让优先级较高的数据比优先级低的数据优先发送的基本策略,采用适当的调度算法进行处理。通过这几个方面的改进,可以一定程度上弥补Windows系统网络通信延迟较大的缺陷。
如图2所示,第1层为用户应用层;第2层是协议驱动,里面包括简化了的TCP/IP协议栈[4,5],只保留TCP,UDP,ARP,ICMP协议,并且对Windows中的AFD驱动模块简化,一些数据结构等就存放在设备扩展中;第3层是网卡驱动,第4层就是具体收发数据的网卡。在这几层里面第2层是最关键的部分,下面就具体如何设计进行比较详细的介绍。
2.1 采用零拷贝技术
简单一点来说,零拷贝就是一种避免CPU将数据从一块存储拷贝到另外一块存储的技术。零拷贝技术可以减少数据拷贝和共享总线操作的次数,消除传输数据在存储器之间不必要的中间拷贝次数,从而有效地提高数据传输效率。而且,零拷贝技术减少了用户应用程序地址空间和操作系统内核地址空间之间因为上下文切换而带来的开销。在本文中对于TCP/IP协议栈,采用零拷贝技术[6,7],避免操作系统内核缓冲区之间进行数据拷贝操作,可以大大提高系统性能。
在接收发送数据时,用NDIS中的NDIS_PACKET包描述符,包描述符中包含了数据包的总长度,指向第一个缓冲描述符NDIS_BUFFER的指针,缓冲描述符NDIS_BUFFER里面的Start Virtual Address才是指向真正的数据所在的首地址以及包含了此缓冲中的数据长度。利用这个NDIS_PACKET包描述符,可以实现无需对数据进行拷贝,只要获得包描述符即可。
当用户数据提交给内核缓冲区时,采用直接I/O的方式,在内核中需要分配一个包首部的大小,用于TCP/IP协议层加上各层的首部,并且把该首部地址以及用户缓冲区地址用NDIS_PACKET包描述符封装。当发包线程把NDIS_PACKET包提交给协议栈处理时,不需要把包描述符中的数据拷贝到新的缓冲区中,可以直接利用NDIS提供的函数得到数据的首地址,以及数据包的总长度等。在协议栈中添加上各层首部以及其他操作后,就可以调用发包函数把NDIS_PACKET包描述符提交给网卡驱动,网卡驱动通过DMA把数据传送到网卡环形缓冲区中,再由网卡发送出去。
反之,在收包时,网卡通过DMA把数据传输到内核缓冲区中,网卡驱动程序中依然用包描述符来指明数据的地址,大小等信息。在收包处理线程中,对数据包的拆包等操作,同样的不需要拷贝到新的缓冲区中,利用包描述符提供的包地址,大小等信息进行处理即可。
2.2 设置多级优先级队列
在网络数据传输中,由于有些紧急数据希望尽快发送出去提交给目的主机,而目前的Windows系统网络传输机制并没有提供这样的功能。可以通过采用多级优先级队列的方式来达到一定的实时效果,比如对于紧急数据,可以设置最高优先级值,而一般数据就可以设置最低优先级值。在用户应用程序中,对发送函数进行封装,新的发送函数有个优先级参数,通过指明优先级参数值灵活处理数据,当提交给内核时,就按照优先级值放到相对应的优先级队列中。相应的在内核收包、发包缓冲区中,设置多级优先级队列,按照多级反馈队列调度算法进行处理,每个队列的优先级不同,并且每个队列的被处理的时间不同,各个队列的时间片是随着优先级的减少而增加的,优先级越高的队列中它的被线程处理的时间也就越短。比如紧急数据放到最高优先级队列中,迟缓的数据可以放到最低优先级队列中,在内核的发包线程中,首先判断最高优先级队列是否为空,不为空则优先发送该队列中的数据包,当该队列的时间用完,如果该队列还有包没有处理完,则把这些包链接到低一级的队列尾部,然后判断低一级优先级队列是否为空,重复以上的操作依次进行下去,当对最低优先级队列处理完后,再循环处理。如果线程在处理第i队列的数据时,这时候有新的用户数据进入到比i队列优先级高的j队列中,则线程处理完该数据就立即去处理j队列,这个可以用一个掩码mask,每一位标识一个队列,当队列不为空,则该标识位置为1,否则置为0。
2.3 封装Socket层
创建Socket套接字,就是打开设备对象(第一次是创建,之后就是打开),而打开设备对象就会创建一个内核文件对象,这个内核文件对象其实就可以映射创建的Socket套接字。对于打开设备对象,就可以用CreateFile()函数,并且把返回的句柄定义为Socekt句柄,之后的操作就可以直接用这个Socket句柄进行操作,如send()函数,可以用WriteFile()函数封装实现;Receive()函数可以用ReadFile()函数封装实现;bind()函数、setsockopt ()函数、getsockopt()函数都可以通过DeviceIoControl()函数封装实现。为了真正实现打开设备等操作,需要在协议驱动程序中对各个用户应用程序下达的IRP请求进行响应,用派遣函数就可以实现。在图2中,用户程序可以通过新封装好的Socket层,使用原来同样的Socket编程语句,这样使用户使用起来感觉没有差别,对用户是透明的。
2.4 协议驱动
在应用程序中,对同一个线程环境下的文件句柄的读,写等,映射到内核中的IRP I/O堆栈的内核文件对象FileObject是同一个FileObject,这样可以用内核文件对象作为纽带作用。在协议驱动的设备扩展NDISPROT_OPEN_CONTEXT结构体内,建立一个FilePort链表,如图3所示。链表的每个节点包含有内核文件对象、接收数据缓冲区、发送数据缓冲区、端口号、接收数据缓冲区大小、发送数据缓冲区大小等几部分。内核文件对象用来标识是哪一个用户Socket句柄;接收、发送数据缓冲区用来存放Socket的接收、发送的数据;端口号的作用是让网络数据包可以知道提交到哪个内核文件对象下的接收缓冲区;接收、发送数据缓冲区大小指明接收、发送缓冲区最大的长度。如果缓冲区队列满,而这时候又有数据过来,则该数据应被丢弃。在协议驱动程序里面,利用这个FilePort链表,可以实现收发数据,设置接收、发送缓冲区的大小等操作。
需要注意的是在NDISPROT_OPEN_CONTEXT结构体内,需创建一个NPROT_LOCK类型的锁,用来对FilePort链表进行互斥访问。
2.4.1 端口号的绑定
在协议驱动设备扩展中需要建立一张表,里面存放已默认分配的端口号以及用户绑定的端口号,端口号是从小到大按序排列,表的作用是当用户应用程序绑定端口号操作时,首先会通过二叉查找法查找这张表,看该端口号是否存放在该表中,如果找到,则要返回给应用程序绑定失败,如果没有找到,则把该端口号插入到适当位置,并返回给应用程序绑定成功。用户应用程序通过调用bind()函数实现绑定Socket套接字,其含义就是用端口号来惟一标识用户线程下的Socket,让网络数据包提交给正确的Socket,在bind函数里面可以通过封装DeviceIoControl函数调用来实现。
2.4.2 发送数据过程
用户应用程序发送的IRP写请求(WriteFile()函数),传递到协议驱动程序后,调用派遣函数NdisProtWrite,通过IRP I/O堆栈里面的内核文件对象循环遍历FilePort链表找到对应的节点,然后把用户应用程序的数据通过缓冲区读写设备的方式拷贝到NDISPROT_OPEN_CONTEXT结构的相应的Priority SendQueue优先级队列中。如图3所示,发包线程的工作主要有,从Priority SendQueue优先级队列中提取数据,如何提取按照多级反馈队列调度算法处理,经过简化的TCP/IP协议栈,然后再调用NdisSendPackets函数发送给网卡驱动程序。在TCP/IP协议栈中,把该数据的优先级值赋值给IP首部的服务类型(TOS)字段中,使收包的时候根据此字段的优先级值把包放进相应的收包优先级队列中。
2.4.3 接收数据过程
协议驱动从网卡驱动程序接收网络数据包,这些数据包是打包封装好的,首先存放在NDISPROT_OPEN_CONTEXT结构的收包优先级队列Priority RecvQueue中,这样可以接收到高速上传过来的底层数据。如图3所示,需要建立一个收包处理线程,它的主要工作是,从收包优先级队列提取数据,具体算法根据上面的多级反馈队列调度算法,然后经由TCP/IP协议栈的处理,如果是UDP,TCP的数据包则通过包的目的端口号,遍历FilePort链表找到对应的节点,然后把剩下的净数据提交给节点(目标Socket)的收包缓冲区中。值得注意的是,因为NDIS封装数据用的是NDIS_PACKET结构,NDIS_PACKET结构里面包含一个NDIS_BUFFER结构的链表,在每个NDIS_BUFFER里面才真正指向数据的首地址,这里说的提交,并没有拷贝数据,只是把净数据的首地址再次链接到FilePort链表中。当用户应用程序通过Receive()函数接收数据的时候,会调用ReadFile()函数,发出读IRP请求,IRP到达协议驱动后,调用NdisProtRead()派遣函数处理,NdisProtRead()会通过IRP I/O堆栈里面的内核文件对象,遍历FilePort链表,找到相应的节点,再把节点接收缓冲区里面的数据拷贝到用户缓冲区里面。
3测试与分析
3.1 测试环境和方法
测试时,使用2台主机分别作为客户机和服务器。硬件和操作系统都是相同的配置,操作系统是Microsoft Windows XP Professional Service Pack 3,Pentium(R)Dual-Core CPU,主频2.70 GHZ,内存2 GB,网卡Realtek RTL8102E/RTL8103E,交换机为朗讯Lucent Cajun P116T。测试的主要目的是分析简化后的网络相对于原来系统而言,在通讯延迟方面有何改进。测试的方法采用如下方案:在局域网内,采用UDP数据报进行通信测试,从客户机向服务器发送数据,数据长度为300 B,即ping-pong测试,客户端取1 000次的往返时间作为测试参数,对没有简化TCP/IP协议栈之前的客户端与简化之后的客户端进行相同的测试,记录次数15次。
3.2 结果分析
从图4中可以看出,经过对协议栈简化后,传输时间明显大大减少。经计算,简化前平均耗时1.241 s,而简化后的平均耗时为0.072 s,减少了94.198%,简化前耗时的样本标准差为0.038 2,简化后耗时的样本标准差为0.004 9,显然简化后的稳定性要更好。测试结果表明,经过简化后的这种设计,耗时和稳定性能都能到达很好的效果。
4结语
本文讨论了一种简化现有的Windows系统TCP/IP协议栈的一种方法,减少了驱动结构层次,使用户应用程序的数据能较快提交给协议驱动程序,协议驱动程序通过封装Socket,并且设置多级优先级队列以及采用零拷贝技术。通过这些技术的使用,能使数据提交给网卡的系统开销减少,使数据发送时间延迟减少,能满足一定的实时性能需求。
摘要:为了让Windows下的网络数据快速发送与接收,提高实时性能,采用对Windows TCP/IP协议栈进行一种简化设计,通过利用Windows提供的用户与设备对象的交互,减少Windows从用户态到内核态的分层,对Socket层进行简单的封装,并且利用零拷贝技术减少数据的拷贝次数以及设置多级优先级队列使数据按照优先级发送,从而使数据达到快速发送和接收的目的。实验结果验证了这种方法能达到预期效果。
关键词:网络体系结构,协议驱动,TCP/IP,零拷贝,优先级队列
参考文献
[1]张帆,史彩.Windows驱动开发技术详解[M].北京:电子工业出版社,2008.
[2]谭文,杨潇,邵坚磊.Windows内核安全编程[M].北京:电子工业出版社,2009.
[3]STEVENS W R.TCP/IP详解卷1:协议[M].北京:机械工业出版社,1999.
[4]毛德操.Windows内核情景分析[M].北京:电子工业出版社,2009.
[5]李园.Windows下的TCP协议栈开发[M].北京:北京邮电大学出版社,2007.
[6]可向民,龚正虎,夏建东.零拷贝技术及其实现的研究[J].计算机工程与科学,2000,22(5):17-24.
[7]CHANG M L,LI Y C H.A zero-copy TCP/IP protocolstack for embedded system[J].Real-Time System,2006,34:5-18.
[8]WEHRLE Klaus,PAHLKE Frank.Linux网络体系结构:Linux内核中网络协议的设计与实现[M].北京:清华大学出版社,2006.
[9]韦安,刘国平.工业实时TCP/IP协议栈的研究与开发[J].控制工程,2005,12(4):389-392.
IP协议栈 第4篇
随着嵌入式设备与网络的日益结合,在单片机系统中引入TCP/IP协议栈,以支持单片机接入网络,成为嵌入式领域的一个重要方向。在此对基于SST89E516RD单片机的TCP/IP协议栈的实现方法给予讨论。选用SST89E516RD单片机实现了在线仿真和编程的功能,大大节约了开发成本。采用VB 6.0语言与Window 98/2000/XP等为软件开发平台,对系统进行了测试。经过几个月的软硬件测试表明:系统设计合理、稳定可靠,已基本实现了最初的设计目标。对其他类似系统移植该项技术奠定了基础,有很好的参考价值。
1 系统硬件实现
整个系统以SST89E516RD单片机为核心,通过RTL8019AS以太网控制芯片实现远程通信。串口完成网卡参数的修改、在线仿真。在系统中还使用X5045作为外部扩展的E2PROM,用来存储IP地址、物理地址以及网卡的其他配置信息,同时X5045还具有电压监控、看门狗定时器、上电复位三种功能,使用X5045监控系统的运行过程,当系统不稳定时可以进行有效地复位。图1为系统硬件结构图。
2 系统软件实现
系统软件主要包括客户端和服务器端软件的设计,主要有以下几部分内容:
(1) RTL8019AS的初始化和驱动程序的设计;
(2) 数据帧的发送和接收子程序;
(3) TCP/IP协议栈程序的设计;
(4) 客户端和服务器端程序的设计;
(5) X5045看门狗和E2PROM程序的设计。
系统的主程序流程图如图2所示。
由图2可知,系统首先完成对单片机定时器、串口、网卡芯片和以太网等部分的初始化,然后进入以太网处理部分的主程序,通过定时器中断进行网口数据的超时出错处理,并完成TCP定时器保活和ARP表生存时间的更新。
2.1 系统初始化
所谓初始化和驱动程序是指实模式下一组硬件芯片的驱动子程序,它们屏蔽了底层硬件处理细节,同时向上层软件提供与硬件无关的接口。主要包括定时器初始化,初始化PING表、ARP表,初始化TCP,RTL8019AS的初始化等。RTL8019AS的初始化主要包括网卡的复位和网卡寄存器的初始化。RTL8019AS的初始化主要包括网卡的复位和网卡寄存器的初始化。RTL8019AS内部寄存器有4页,与NE2000兼容的有3页,第4页不用。页选择由CR寄存器的PS1,PS0位确定。在零页寄存器中可以设置接收、发送状态配置以及发送缓存区的起始页与接收缓存区起止页地址等;在1页寄存器中可以设置以太网接口的MAC地址和组播地址。对网卡的初始化就是对相关寄存器初始化,这些寄存器包括CR,RCR,TCR,PSTART,PSTOP,BNRY,TPSR,ISR,DCR,IMR,CURR,PAG0~PAG5,MAR0~MAR5等。初始化过程如下:
(1) CR=0x21,选择页零的寄存器同时使芯片处于停止模式,不会发送和接收数据包;
(2) RCR=0xE0,设置接收结构寄存器,monitor方式,所有数据包都被拒绝;
(3) TCR=0xE2,设置发送配置寄存器,工作在内部lookback模式;
(4) PSTART=0x4C,接收缓冲区开始页面地址;
(5) PSTOP=0x80,接收缓冲区中止页面地址;
(6) BNRY=0x4C,接收缓冲区最后页面指针;
(7) TPSR=0x40,发送页的起始页地址,初始化为指向第一个发送缓冲区的页即0x40;
(8) ISR=0xFF,清除所有中断标志;
(9) DCR=0xC8,设置数据配置寄存器,使用FIFO缓存,普通模式,8位数据DMA;
(10) IMR=0x00,设置中断屏蔽寄存器,屏蔽所有中断;
(11) CR=0x61,选择页一的寄存器;
(12) CURR=0x4D,网卡写内存的指针,指向当前正在写的页的下一页,初始化时指和0x4C+1=0x4D;
(13) 设置多址寄存器MAR0~MAR5,均设置为0x00;
(14) CR=0x22,使网卡芯片开始工作;
(15) 设置网卡地址寄存器PAR0~PAR5;
(16) CR=0x21,选择页零的寄存器;
(17) RCR=0xCC,设置接收结构寄存器,设置为使用接收缓冲区,跟外部网络连接;
(18) TCR=0xE0,设置发送配置寄存器,启用CRC自动生成和自动校验,工作在正常模式;
(19) CR=0x22,使网卡芯片开始工作;
(20) ISR=0xFF,清除所有中断标志;
2.2 TCP/IP协议栈的移植
以太网帧的发送与接收属于协议层中的最底层。发送前的协议封装和接收时的协议分解都非常简单。封装时,只需在上层封装数据前面添加14 B的以太网首部就可以了;接收到数据帧之后,根据头信息中的帧类型字段判断是否属于IP包或ARP包,若是就继续相应的协议分解,否则将被丢弃,不予处理。帧的接收工作由网卡自动完成,只需对相关的寄存器如PSTART,PSTOP,CURR和BNRY进行适当的初始化即可。以太网帧的发送过程如下:
(1) 初始化命令寄存器CR,启动RTL8019AS;
(2) 设置数据配置寄存器DCR,以字节方式通信;
(3) 设置发送配置寄存器TCR,选择RTL8019AS数据发送的工作方式;
(4) 设置远程开始地址寄存器RSAR0(低位),RSAR1(高位),指明远程DMA操作时所传送数据的起始地址;
(5) 设置远程字节计数寄存器RBCR0(低位),RBCR1(高位),指明远程DMA操作时所传送的数据的字节数;
(6) 设置命令寄存器CR,开始远程DMA写操作。RTL8019AS自动将数据I/O端口的数据写入其缓冲区中;
(7) 开始向数据I/O端口传送需要发送的数据;
(8) 数据传送完毕后,设置发送页起始地址寄存器TBCR,指明待发送数据的起始地址;
(9) 设置发送字节计数寄存器TBCR0(低位),TBCR1(高位),指明待发送数据的字节数;
(10) 设置命令寄存器CR,启动本地DMA操作,把缓冲区中的数据发送到网络上;
(11) 结束。
需要指出的是,数据在发送前必须先由上到下进行层层封装才能正确地发送出去,同时,接收到的数据包还必须自下而上层层解包才能为用户所识别,即协议分解。在协议编程实现中,数据封装与协议分解互为逆过程。这就是说,必须在数据采集子系统中实现嵌入式TCP/IP协议才能完成数据的TCP/IP处理。
2.3 客户端和服务器端程序的设计
分别设计客户端和服务器端程序,适应于不同的工作场合。在面向连接的TCP协议中,服务器和客户机开始通信之前必须首先建立连接。在连接之前,服务器程序必须正在运行并处于监听模式,等待客户端的连接。TCP的连接是通过3次握手协议来完成的。首先,客户端发送1个SYN标志位的TCP段给服务器,其带有所选择段的初始序号。服务器端收到该报文段后,以1个带有SYN标志的段作为应答,其中也给出根据本身情况选择的初始序号,并包含对客户端的确认。而客户端收到服务器端的应答后,再次送回1个报文段,其中带有对服务器端SYN的确认。这样双方的连接就建立了,以后就能开始传送数据。同样终止1条TCP连接实际上也需3次握手过程。
3 应用系统实现
为了验证系统的可行性,应用VB开发了接口程序,构建了软硬件测试平台,用来设置网卡的配置参数并实现数据的发送与接收。所有配置参数包括(本地IP地址、服务器端IP地址、端口号、网卡物理地址、ping的IP地址、串口号等)都能通过串口动态地更改。系统能实现Ping的功能,以方便检查以太网的状态。
3.1 参数设置界面
用串口线将测试板(数据采集和控制系统模块,下同)与计算机连接起来,选择好串口号,然后按“连接单片机”按钮,连接状态工具栏里出现“已经连接”,说明测试板与计算机已经连接上,然后就可以修改配置参数了。在参数设置栏中填写正确的参数值后,按“设定”按钮,接收状态栏中会提示参数设置成功,然后按测试板上的复位键,网卡的参数配置
就被写到了X5045中。参数设置界面如图3所示。
3.2 数据收发测试界面
分别测试客户端和服务器端软件通信是否正常。
(1) 服务器端程序的测试
打开客户端测试界面,如图4所示,设置连接IP地址为192.168.0.44(该地址必须与服务器端的IP地址一致),设置连接端口号为3330(该端口号必须与服务器端端口号一致)。将作为服务器端的程序烧入到测试板的微处理器中,通过图3修改配置界面,将服务器端需要的参数写入X5045,参数配置包括:“单片机IP地址”(指的是测试板自身的IP地址)为192.168.0.44,“服务器端IP地址”可以不用设置(因为测试板本身就即服务器端);如果是新网卡芯片,还需要设置MAC地址,这里设为121314151617(一般选择任意的12位数即可);“服务器端口号”设为3330(必须与客户端一致);网关设为192.168.0.1(要与上位机保持在同一个网段内)。设置好所有参数后,可以进行数据的收发了。
(2) 客户端程序的测试
打开服务器端测试界面,如图5所示。
设置连接IP地址为192.168.0.44(该地址指的是上位机自身的IP,必须与客户端设置的“服务器端IP地址”一致),设置连接端口号为3330(该端口号须与客户端设置的“服务器端口号”一致)。将作为客户端的程序烧入到系统的微处理器中,参数配置:“服务器IP地址”(指的是上位机的IP地址)为192.168.0.44,“单片机IP地址”可以不用设置(因为系统仅作为客户端),“服务器端口号”设为3330(必须与客户端一致),网关设为192.168.0.1(要与上位机保持在同一个网段内)。设置好所有参数之后,即可进行数据收发。服务器端的数据可以被发送到串口,同样,数据也可以从串口发送到服务器端。测试表明:上位机通过以太网与系统之间的通信正常。
4 结 语
在此实现了TCP/IP协议栈在单片机上的移植,完成了系统的硬件电路和相关嵌入式软件的设计,应用VB开发了上位机修改参数界面,通过串口完成对网卡等参数的配置和修改,解决了数据包的超时重发、定时保活、参数配置、硬件看门狗复位等一系列问题。实验表明,整套程序比较稳定,收发数据正常,TCP超时重传效果很好。经过近1个月的测试,没有出现任何丢包和堵塞的现象。
IP协议栈 第5篇
相对于OSI/RM参考模型, TCP/IP协议栈却是发展至今最为成功的网络体系结构。目前, 从小型局型网到Internet的通信架构都遵循TCP/IP协议栈模型。
2 TCP/IP协议模块关系
TCP/IP协议栈是一个四层结构, 分别是网络访问 (接口) 层、网际层、传输层和应用层。TCP/IP协议栈总共包含大约100多个协议, 通过这些协议可以高效和可靠地实现网络设备之间的互联, 下图给出了TCP/IP协议栈的各层名称及相关的协议 (注:位于网络接口层的是各种网络硬件设备的驱动程序和介质访问控制协议, 并不属于TCP/IP协议栈) 。
在网络接口层中, 可以根据数据帧的类型来确定网络层程序, 例如, 当以太网帧类型字段为0x0800时, 应将帧中的数据交给IP模块来处理;当帧类型字段为0x0806时, 应将帧中的数据交给ARP模块来处理;当帧类型字段为0x08035时, 应将帧中的数据交给RARP模块来处理。
在网络层, IP模块根据IP数据报首部中的协议值来决定将数据报中的数据交给哪一个模块来处理。例如当协议值为6时, 应将数据交给TCP模块来处理;当协议值为17时, 应将数据交给UDP模块来处理。
在传输层, TCP和UDP根据TCP或UDP首部中的端口号决定将数据交给哪一个进程去处理。例如当端口号为80时, 应将数据交给HTTP进程;当端口号为53时, 应将数据交给FTP进程。
3 利用Packe Tracer解析TCPIP协议栈各模块的关系
为了直观地理解和分析TCP/IP协议模块关系, 我们使用Packe Tracer软件来进行分析。为了能够尽可能说明问题, 我们将Server0指定为DNS服务器和WWW服务器, IP为192.168.0.1, 而PC0指定为一个客户端, IP为192.168.0.100。
(1) 关于ARP协议分析。从下图可以看出以太网 (Ethernet II) 字段的类型是0x806, 所以这里将帧中的数据交给ARP模块来处理
(2) HTTP协议分析。IP数据报的格式中有一个协议字段, 它出此数据报携带的数据是使用何种协议, 以便目的主机的IP层知道应将数据交给哪个处理过程。常用协议字段值对应协议如下:
从下图中可以知道两点信息:1.在IP数据包中标出的协议是:x6, 表示应将数据交给TCP来处理进程;2.在TCP数据包中标出的端口是80, 表示应将数据交给HTTP进程。
(3) DNS协议分析。从下图中可以知道两点信息:1.在IP数据包中标出的协议是:0x11表示应将数据交给TCP来处理进程;2.在UDP数据包中标出的端口是53, 表示应将数据交给DNS进程。
4 总结
当目的主机收到数据包后, 网络接口层会首先根据以太网首部中的“上层协议”字段确定该数据帧是IP、ARP还是RARP协议的数据报。假如是IP数据报, IP协议再根据IP首部中的“上层协议”字段确定该数据报的有效载荷是TCP、UDP、ICMP还是IGMP, 然后交给相应的协议处理。假如是TCP段或UDP段, TCP或UDP协议再根据TCP首部或UDP首部的“端口号”字段确定应该将应用层数据交给哪个用户进程。IP地址是标识网络中不同主机的地址, 而端口号就是同一台主机上标识不同进程的地址, IP地址和端口号合起来标识网络中唯一的进程。
摘要:计算机网络发展初期阶段, 许多研究机构、计算机厂商和公司都推出了自己的网络系统, 然而它们之间没有兼容性可言, 也无法相互通信。为了解决网络之间兼容性的问题, 国际标准组织ISO (International Standard Organized) 于1984提出了开放系统互边参考模型OSI/RM (Open System Interconnection/Reference Model) , 该模型很快成为了计算机网络体系结构中理论模型。
IP协议栈 第6篇
油田测井技术中,利用网络进行远程控制是一个新的发展方向。但是,测井实时性与网络传输之间传输速度的协调处理是需要解决的重点技术之一。现在流行的windows系统在处理实时性上不如DOS(Disk Operation System)系统稳定,但是DOS系统本身又缺少网络功能。所以,在S G X 3型数控系统中采用了DOS系统,利用嵌入式Internet技术解决底层硬件实时性问题,实现远程控制的数控测井解决方案。在此方案中,为了使实施底层硬件控制的D O S系统具有网络传输功能,需要设计T C P/I P(Transmission Control Protocol/Internet Protocol)协议栈。
TCP/IP的发展与英特网的发展密切相关。目前网上使用的主要协议大都是基于T C P/I P协议栈的。另一方面,嵌入式Internet是随着嵌入式系统的广泛应用和计算机网络技术的发展而发展起来的一项新兴概念和技术。实现嵌入式设备的Internet网络化,需要实现TCP/IP网络协议。通常的解决方法有:第一是用专用的服务器实现,第二是通过专用的嵌入式网关连接,第三是把标准网络技术TCP/IP一直扩展到嵌入设备,由嵌入式系统自身实现服务器功能,是解决问题的最佳方案。本文采用了第三种解决方法,从最简单的操作系统DOS入手,使用灵活的C语言,从最底层逐步设计,建立一个最基本的TCP/IP协议栈,实现DOS系统下的网络功能。
2 TCP/IP协议栈整体设计
2.1 系统软硬件环境
基于网络的SGX3数控测井系统中采用了DOS操作系统下的嵌入式PC104做下位机,上位机用Windows2000/XP操作系统,两者通过以太网进行大数据量传输的技术。为了增强网络的控制和数据传输速度与数量,需要深入地对网络部分进行了解和设计,才能对网络进行更有效的控制。实现嵌入式Internet技术的关键,在于如何利用现有资源实现TCP/IP等协议处理,而在DOS下实现TCP/IP协议是最直接和清晰的,有利于对TCP/IP协议形成较深刻的认识,深入理解嵌入式Internet的关键技术,为在Linux下更为深入地开发嵌入式PC下的TCP/IP网络应用打基础。
2.2 运行系统整体软件结构
DOS下实现TCP/IP协议栈的一种思路是[2]:利用ODI(Open Data-Link Interface)接口与下层的NIC(Network Interface Card)进行数据交换,ODI接口又与上层的Packet Driver接口层进行标准转换,Packet Driver与上层的TCP/IP协议栈进行数据通讯。TCP/IP协议栈实现ARP,IP,ICMP,UDP,TCP等基本协议,应用层协议利用socket接口与TCP/UDP进行数据通信。
这个最基本的TCP/IP协议栈工作在以太网上,与底层以太网卡交换数据是通过Packet Driver接口进行的。这个接口多个应用程序共享一个数据链路层的网络接口。它提供了对一个特定数据包类型的初始化访问、结束访问,发送一个数据包,获取网络接口的统计数据和接口的信息。DOS下TCP/IP协议栈运行的整体框图如下图1:
本TCP/IP协议栈中实现ARP,IP,ICMP,UDP,TCP等协议和SOCKET主要的接口函数。具体的协议栈结构如图2。
3 ARP的设计与实现
3.1 ARP简介
在互联网络上,主机和网络设备都是通过逻辑地址来标识,在TCP/IP协议簇中逻辑地址也就是IP地址[1]。在互联网上各主机(不包括像路由器这样的网络连接设备)的公共IP地址是唯一的。数据分组通过物理网络在主机和网络设备之间传递。在物理级上,主机和网络设备都有各自的物理地址来标识。物理地址也是本地地址,由硬件实现,它的有效范围只是在本地网络,所以它在本地范围内必须是唯一的。在以太网中物理地址是48位的MAC地址。
ARP的作用是将一个IP地址与其对应的物理地址对应起来[1]。当发送站需要接收站的物理地址时,会去内存中的ARP表中找对应的物理地址,如果找到就将其放到发送帧的目的地址处。如果没有找到,就广播一个ARP查询分组。网络上的每一个主机或网络设备都会接收到这个分组,但只有查询分组中指定的接收站会作出反映,发送一个ARP响应分组给发送站,于是发送站得到了接收站的物理地址。如图3所示:
3.2 ARP协议相关数据结构
根据RFC826标准,定义与ARP相关的主要数据结构如下:
ARP数据帧的头部结构arp_Header:
其中hwType表示硬件类型,protAddrLen表示协议类型,hw Prot Addr Len表示硬件地址长度和协议长度,opcode表示操作,srcIPAddr表示发送方硬件地址,src IPAddr表示发送方IP地址,dst Eth Addr表示目标硬件地址,dstIPAddr表示目标IP地址。在以太网的环境下,硬件地址长度为6八位组,IP地址长度为4八位组。
为了记录ARP协议解析到的IP地址与相应的硬件地址对应关系,设计使用ARP表用。使用ARP与IP对应的ARP表,记录下解析的MAC地址,以减少在一定时间(如:300m)内对同一IP地址的多次重复解析,从而加快TCP/IP协议栈的运行。设计结构arp_tables如下:
其中,IP表示一个主机或网络设备的IP地址,hardware表示IP对应的硬件地址,flags标识本记录的有效性,expiry表示记录有效的时限。
当接收到ARP数据包时,如果源MAC地址是主机地址,就将源MAC与IP地址对保存到ARP表中,即使本机不是目的地址。为了减少ARP表的长度,和处理数据包的时间,同时又尽量保留与本机交互比较频繁的MAC/IP地址对,本文在处理接收ARP数据包时,只将目的IP是本机的数据包中的源地址对保存到ARP表中。对于嵌入式Internet设备来说,它们的通信对象相对是变化不大的,这样在减小了ARP表的同时也加快了查询ARP表的时间,提高了效率。
3.3 ARP协议模块设计
ARP整体模块图如图4:
3.3.1 主控制模块:arp_resolve(IPAddress)
输入参数:要解析的IP地址
返回值:IPAddress对应的MAC地址
说明:此模块解析IPAddress的MAC地址。
本模块根据输入的IP地址,首先检查ARP表是否有有效的地址对记录与要解析的IP地址相对应。如果有,就可以直接取出硬件地址,然后返回硬件地址。如果没有,就要进行ARP操作。对于与本机处于同一子网的IP地址,可以直接发出ARP请求报文,然后等待接收ARP应答报文。如果ARP应答报文正确,就可以得到要解析IP对应的硬件地址。如果不在同一子网,就要根据网关表找到目的子网对应的网关IP,然后解析网关IP(网关的IP已经在网络参数配置文件中设置)。本文中,TCP/IP协议设计用于主机,所以,可以直接将发送到其他网络的网关指定为本机所在网络的网关,以简化处理,加快处理。
3.3.2 输出处理模块:arp_request()
说明:发送一个ARP请求报文
本模块用来发送准备好的ARP报文,其最终是调用了Packet Driver中发送数据的函数。
3.3.3 输入处理模块:arp_handler()
输入参数:接收到的ARP数据报的首部
说明:本模块处理ARP数据报,如果输入的是一个ARP请求,则作出响应。如果是ARP响应则对ARP表作出相应的修改。
通常的处理是将收到的所有A R P的源M A C地址保存到ARP表中。为了减小ARP表的大小,尽可能保存有用的ARP记录,提高ARP表查询的效率,本ARP表中只记录与本机通信相关的主机的ARP,其他的主机不记录。即:只记录由本机发出请求的主机和向本机发出请求的主机。
3.3.4 ARP表处理模块:arp_search()
输入参数:要寻找的IP地址
返回:如果找到,返回IP对应的ARP表的记录;如果没有找到就返回NULL。
说明:本模块的作用是在ARP表找到IP对应的记录。
4 结束语
嵌入式TCP/IP协议栈应用于嵌入式设备,实现嵌入式设备的网络化是一个发展方向。本文设计的TCP/IP协议栈适用于主机而不是网络设备(如:路由器,三次交换机等)。对本文的TCP/IP协议栈的检测是利用运行在PC机上的windos2000系统进行的。其中对ARP的验证是对比利用windows系统获取的MAC地址与利用本协议栈获取的是否一致,这一步是进行上层协议设计的基础。结果是两者对局域网内同一个IP地址获取的MAC地址是一致的。
参考文献
[1]IAN MCLEAN.Windows2000 TCP/IP技术内幕[M].北京:机械工业出版社,2001.10
[2]姜淑菊,张书云,TCP/IP协议的通信程序设计[J],计算机应用,1997,(2):26-28
lwip协议栈的移植 第7篇
lwip协议栈是由瑞士的计算机科学家Adam Dunkels带头及一众科学家共同费时费力悉心研发的免费的, 容易移植的, 源代码公开的简化的TCP/IP协议栈。该协议栈在有无操作系统的设备上都可以运行。
该协议栈的优点是极大的保存了TCP/IP协议的主要功能, 但是又不像TCP/IP协议栈那样对系统资源的占用比较大。而是只需要极小的RAM和ROM的内存就可以使Lwip运行起来。而低端的嵌入式平台正是需要这样的协议栈, 所以Lw IP就广泛的应用在了嵌入式设备上。
虽然lwip协议栈占用的内存很小, 但是它还是照旧实现了TCP/IP的主要功能和协议, 而且调用接口的回调方式也相当高效。
二、Lw IP系统适配层
lwip把与操作系统有关联的主要函数及其数据类型打包封装, 使得lwip的移植变的简单且容易操作, 具体的步骤则是Lw IP直接调用系统适配层的接口和数据结构, 舍弃掉特定的操作系统函数。操作系统中的定时器, 消息机制, 进程的操作这些频繁使用的服务都会借由操作系统适配层, 被Lw IP统一调用。所以想要把Lw IP协议移植与别的操作系统, 说白了就是把该操作系统与Lw IP的操作系统适配层匹配的一个过程。操作系统适配层主要如下:
1) 定时时钟协议是操作系统适配层提供的一个最主要的协议, 触发函数得的调用由时钟协议控制, 时间不能少于200ms, 时间一到函数马上被调用。
2) 操作系统适配层的进程同步机制只提供了信号量方式。所以要想解决某一个操作系统不支持信号量的问题, 就得需要模拟信号量, 这就用到了临界区或互斥锁机制
3) 消息的传递是由Lw IP中的操作系统适配层中的“邮箱”机制来实现传递的。邮箱机制中的邮寄操作, 提取操作是两个最主要的操作.邮寄操作最大特点是进程不阻塞, 操作系统适配层把邮寄到邮箱中的消息一一排入消息队列中, 直到另外一个进程提取这个消息并且处理它。
三、Lw IP应用接口
原始接口、序列接口和Socket接口是lwip提供的三种应用程序接口供上层的应用程序适用。
1. 原始接口。
函数回调接口是原始接口的另外一种叫法, 协议栈内部的回调函数是用来实现整个通讯的流程的, 并且任务间的互相切换在该流程中不会出现, 所以同一个任务过程中应用程序和lwip协议栈时钟会同时运行, 所以原始接口这种高效的接口使用方式将应用程序和lwip协议栈能够紧紧的结合在一起。
原始接口由于其代码简单, 运行时间短, 占用系统资源是三种接口中最少的, 所以应用也是相对比较广泛。但是由于简单所以对开发者的要求比较高, 开发者必须相当熟悉Lw IP的内部处理流程和机制, 对初接触的人来说难度很大, 而且回调接口中的应用程序的代码也不太容易看懂, 所以一般不选用该接口.但是如果嵌入式系统可用资源特别紧张, 那也就只能选择原始接口才能达到要求。
2. 序列接口。
“Sequential API”是序列接口的另一种叫法, 该接口调用lwip服务的方式是按序来调用。它比起原始接口则是多了对消息的转发, 存储, 处理等一系列操作,
消息机制主要是用来传递应用程序和lwip协议栈之间的数据传递。所以一般为了适合多个网络应用, 在设计应用程序的序列接口时, 都是用多任务的思想来设计的。这样设计的好处是当其中一个程序的服务任务中断的时候就不会影响其他服务程序, 因为网络应用都很复杂, 多任务的思想应该贯穿始终。这样在一些需要同时处理多个连接或者并发的服务程序时候、序列接口常常被作为首选。
3. Soeket接口。
当想要为应用程序提供标准的操作接口时, socket接口就会成为首选接口。该接口又是序列接口的进一步打包封装, 与序列接口功能类似。
该接口在三个接口中是占用和运行开销系统内存最大的一个接口, 又因为嵌入式系统本身内存空间就小, 而能使用lwip协议栈的嵌入式系统更加不会有剩余的可供随意使用的内存空间, 因此若不是为了方便移植或者快速开发, 一般不会选用该接口。
综上所述, 这三种接口所需要的代码空间和运行时间各不相同, 原始接口效率最高, 但使用起来比较麻烦;Socket接口使用最方便, 但运行效率最低;序列接口在使用方便性和执行效率上介于原始接口和SOCKET接口之间。如果序列接口与Socket接口被应用确认为不需要时, 就可以进一步释放资源空间。
四、本章小结
IP协议栈 第8篇
关键词:lwip,信号量,邮箱
1 引言
Lw IP是一套轻量级的开源TCP/IP协议栈, 在需要网络通信的嵌入式平台上得到广泛应用。由于网络协议经常需要动态 (实时) 和静态 (单步) 调试手段的结合, 而市场现有的嵌入式模拟器和板载调试器无法很好的满足这种调试需求, 并且成本高昂。
鉴于上述问题, 为方便基于嵌入式系统的网络应用的开发与调试, 我们提出了在成熟的WINDOWS开发环境进行Lw IP协议栈调试的想法。要想在实现此想法最关键的一步就是将该协议栈移植于windows平台下。
我们了解Lw IP协议栈的基本架构和内存管理机制, 确认移植的可行性。基于VC++6.0开发环境, 移植Lw IP_v1.2.0。在移植时, 注意下述移植要素, 才能保证Lw IP的顺利启动与执行。这些关键点包括以下内容。
2 内存
Lw IP协议栈在实现时重点关注如何在拥有完整尺度的TCP/IP协议前提下, 尽可能减小RAM的使用。Lw IP协议栈在内存管理上的独特设计, 使得其适合于在只拥有数千字节RAM和40k左右ROM的嵌入式系统中使用。
不过, 对于WINDOWS系统, 我们不必关注如何减小内存占用, 因为移植Lw IP协议栈到WINDOWS系统, 目的是借用WINDOWS系统更方便的调试Lw IP网络应用。内存不是Lw IP移植到WINDOWS系统的瓶颈。但是, 考虑到, 给内存调试预留一定条件, 若完全不考虑内存限制, 有可能导致在WINDOWS上正常运行的Lw IP网络应用, 因为内存配置差别太大, 程序移植到嵌入式系统之后, 运行时产生意想不到的问题。这里我们还是需要强调和注意Lw IP内存的相关接口与参数配置。
内存初始化参数:
Lw IP协议栈可以使用的内存都取自静态数组:
内存定义并非只要定义一个总的内存大小就行。Lw IP定义了数个静态变量, 让内存管理层次化, 方便理解和阅读。我们着重关注Lw IP移植需要配置的参数, 下面依次介绍。
内存初始化过程:
首先, 在函数mem_init中完成内存管理链表的初始化, 主要工作如下:
接着, 在memp_init中完成堆内存的初始化, memp_memory变量记录了Lw IP系统协议数据真正使用的内存空间。
#define MEMP_MAX 120000
3 线程
Lw IP协议栈以线程为单位运行, 最少只有一个TCP/IP线程 (即Tcpip_thread) , 该线程负责处理所有的TCP/UDP连接, 各种网络程序都通过TCP/IP线程与网络交互。
在WINDOWS系统中, 既有进程, 又有线程。考虑到Lw IP协议栈在多线程运行时, 线程之间需要共享变量, 最终采用WINDOWS线程与Lw IP的工作线程进行适配的方式。同时, 专门定义了线程结构, 用于记录和管理线程参数, 主要适配代码如下。
(1) 线程管理结构
(2) 创建线程
4 通知与保护
Lw IP支持多线程, 必然涉及线程之间的通信和全局变量的访问保护。如对于协议栈的数据管理链表pbuff_list, 就存在被多个线程访问和改写的可能。Lw IP提供了三种不同的通知和保护机制:信号量, 邮箱和临界区。
4.1 信号量
信号量可用于线程之间需要等待执行的同步场合。因为WINDOWS系统也有信号量, 所以可以进行直接的移植。
(1) 信号量的初始化
信号量的申请和建立在sys_sem_new中实现, 主要功能是申请建立并返回一个新的信号量, 其中调用WIN32系统函数实现与WINDOWS系统的对接。
(2) 发送信号量
4.2 邮箱
除了信号量, Lw IP系统定义了邮箱, 用于线程之间的消息通知。邮箱是Lw IP提供的一种更复杂的通知机制, 信号量只能够实现线程之间的同步, 却不能传递参数, 而邮箱弥补了这一点。Lw IP邮箱的实现方式:将消息实现为一个队列, 可以允许一次投递多条消息;也可以每次只投递一条消息。
我们选择信号量, 同时配合临界区和消息数组的方法, 在WINDOWS系统上实现了Lw IP邮箱机制。
(1) 初始化邮箱
(2) 发送消息 (message) 到邮箱, 该函数是阻塞的, 直到消息真正被投递才返回。
4.3 临界区
临界区是一种访问保护机制, 保证同一时刻一段程序操作的逻辑连续性和不可分割性。要引起注意的方面则是在移植的时候, 要确保该函数支持的递归调用始终是来自于同一个任务或者中断的, 这样引发的结果则是该区域在被保护的同时, 还是能够一直调用sys_arch_protect函数。只是此时调用者会收到函数返回值传递的该区域已经被保护的信息。
由于WINDOWS提供了临界区操作接口, 临界区的函数接口移植比较简单。
(1) 创建临界区
(2) 获得临界区
(3) 释放临界区
4.4 初始化
与其它TCP/IP协议栈类似, Lw IP协议栈在启动时, 需要配置合适的参数, 才能够保证协议栈正常启动和运行
5 结语
IP协议栈范文
声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。