微波EDA网,见证研发工程师的成长!
首页 > 射频和无线通信 > 射频无线通信文库 > 对Windows TCP/IP协议栈的一种简化设计

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

时间:05-22 来源:互联网 点击:

S_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堆栈的内核文件对象File()bject是同一个File()bject,这样可以用内核文件对象作为纽带作用。在协议驱动的设备扩展NDISPROT_OPEN_CONTEXT结构体内,建立一个File Port链表,如图3所示。链表的每个节点包含有内核文件对象、接收数据缓冲区、发送数据缓冲区、端口号、接收数据缓冲区大小、发送数据缓冲区大小等儿部分。内核文件对象用来标识是哪一个用户Socket句柄;接收、发送数据缓冲区用来存放Socket的接收、发送的数据;端口号的作用是让网络数据包可以知道提交到哪个内核文件对象下的接收缓冲区;接收、发送数据缓冲区大小指明接收、发送缓冲区最大的长度。如果缓冲区队列满,而这时候又有数据过来,则该数据应被丢弃。在协议驱动程序里面,利用这个FilePort链表,可以实现收发数据,设置接收、发送缓冲区的大小等操作。

需要注意的是在NDISPROT_OPEN_CONTEXT结构体内,需创建一个NPROT_LOCK类型的锁,用来对FilePort链表进行互斥访问。

2.4.1 端口号的绑定

在协议驱动设备

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top