新闻中心

EEPW首页 > 手机与无线通信 > 设计应用 > 对Windows TCP/IP协议栈的一种简化设计

对Windows TCP/IP协议栈的一种简化设计

作者:时间:2012-05-22来源:网络收藏

摘要:为了让下的网络数据快速发送与接收,提高实时性能,采用对 栈进行一种,通过利用提供的用户与设备对象的交互,减少Windows从用户态到内核态的分层,对Socket层进行简单的封装,并且利用零拷贝技术减少数据的拷贝次数以及设置多级优先级队列使数据按照优先级发送,从而使数据达到快速发送和接收的目的。实验结果验证了这种方法能达到预期效果。

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

关键词:网络体系结构;驱动;;零拷贝;优先级队列

随着现代信息技术的进一步发展,对信息传递的速度及对大信息量的传输都有进一步需求,在这样的情况下,无论是对于硬件要求还是软件方面的要求都在提升。而在相同的硬件条件下,如何提高通信的速度、实时性能,软件的优劣在很大程度上影响着这些方面。由于Windo ws的广泛使用和其方便完善的网络结构的支持,针对Windows的网络开发不断增加,然而由于Windows系统为了包容多种以及Windows分层驱动的特点,导致数据从用户应用程序到网卡经过的驱动层数很多,势必导致数据的延迟增加,这对那些要求通信实时性能较高的系统来说是无法容忍的。所以研究Windows网络体系架构,对协议栈进行优化,使之适合于对于特定要求的系统,有很重要的研究意义和价值。

1 Windows网络的多层结构

如图1所示,标准的Windows网络体系结构的最底层是网卡,网卡通过NDIS与网卡(NIC)驱动程序通信,网卡驱动程序又通过NDIS与协议驱动程序通信。在NIC驱动程序和协议驱动程序之间还可以插进去一个中间驱动程序。在协议驱动程序的上边,是内核模式TDI客户驱动程序,通过TDI接口同协议驱动程序交互。再往上,则是用户模式的动态连接库(提供WIN32 NETAPI)及网络应用程序。

a.JPG

从图1中可以看出,用户层编写网络程序与其他主机进行通信,发送数据需要经过Sockets接口,TDI客户,TDI传输驱动接口,MDIS协议驱动(TCP/IP协议栈),NIC驱动程序,网卡,可以看出数据从用户提交给网卡的分层很多,Windows操作系统利用这种分层的方法,有诸多好处,开发人员可以只关注整个结构中的某一层;分层可以降低层与层之间的依赖,既可以良好地保证未来的可扩展,在复用性上也是很好的优势。但是分层结构也不可避免具有一些缺陷,一方面,分层过多会导致系统性能的下降,因为不采用分层结构,很多业务可以直接造访数据库,以此获取相应的数据,如今却必须通过中间层来完成,其中需要处理数据通过各层的信息等操作,这些都降低了系统性能;另一方面是数据的拷贝次数增多,数据拷贝操作不单需要占用CPU时间片,同时也需要占用额外的内存带宽,这就增加了系统开销。这些消耗都会造成数据的时间延迟增加,这对于那些对实时性能有特别要求的而又需要利用Windows平台的系统来说,这是很难容忍的。

2 对Windows TCP/IP协议栈的

由于Windows网络结构分层较多,导致系统性能下降,网络数据的实时性能得不到体现,一种策略是现今Windows TCP/IP协议栈,减少分层;另一方面,利用零拷贝技术减少拷贝次数,减少系统性能消耗;可以采用多级优先级队列,让优先级较高的数据比优先级低的数据优先发送的基本策略,采用适当的调度算法进行处理。通过这几个方面的改进,可以一定程度上弥补Windows系统网络通信延迟较大的缺陷。

b.JPG

如图2所示,第1层为用户应用层;第2层是协议驱动,里面包括简化了的TCP/IP协议栈,只保留TCP,UDP,ARP,ICMP协议,并且对Wind ows中的AFD驱动模块简化,一些数据结构等就存放在设备扩展中;第3层是网卡驱动,第4层就是具体收发数据的网卡。在这几层里面第2层是最关键的部分,下面就具体如何设计进行比较详细的介绍。

2.1 采用零拷贝技术

简单一点来说.零拷贝就是一种避免CPU将数据从一块存储拷贝到另外一块存储的技术。零拷贝技术可以减少数据拷贝和共享总线操作的次数,消除传输数据在存储器之间不必要的中间拷贝次数,从而有效地提高数据传输效率。而且,零拷贝技术减少了用户应用程序地址空间和操作系统内核地址空间之间因为上下文切换而带来的开销。在本文中对于TCP/IP协议栈,采用零拷贝技术,避免操作系统内核缓冲区之间进行数据拷贝操作,可以大大提高系统性能。

在接收发送数据时,用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把数据传输到内核缓冲区中,网卡驱动程序中依然用包描述符来指明数据的地址,大小等信息。在收包处理线程中,对数据包的拆包等操作,同样的不需要拷贝到新的缓冲区中,利用包描述符提供的包地址,大小等信息进行处理即可。

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



上一页 1 2 3 下一页

评论


相关推荐

技术专区

关闭