IoCallerDriver 将该请求转发给 TDI 传输器,即 TCP/IP协议进行处理。为了描述主线,这里暂把先前 TCP 建立连接的三次握手 过程给省略了。发送过程如图 3所示。
http://www.paper.edu.cn 图 3 发送框图 数据从 TDI 客户进入 TDI 传输器后,经过一系列的函数调用,生成适合在网络上传输 的数据包。这个过程包括对数据的封包,超时,创建重传队列,数据分片[5],路由设置等。 发送数据时首先双方应该建立连接前完成一个三次握手[6]的过程, 在连接建立以后双方开始 进行可靠的通信。 4 所示为建立连接以后, 图 发送过程在 TCP/IP 协议层中函数的调用流图。 TDI 传输器的派遣例程调用 tcp_send 函数发送数据,将数据转入到 TCP 层,完成 TCP 层的 包头以及控制状态的设置。在调用 ip_queue_xmit 后,数据转到 IP 层进行处理,在这里完成 IP 包格式的设置以及分片操作等。最后调用 ether_output 函数设置好 MAC 头以后,一个完 整的数据帧就行成了,然而为了符合 NDIS 对数据包格式的封装要求,这里需要对数据结构 进行调整。数据在进入 ether_output 函数前一直是以 SK_BUFF[7]的形式进行管理的,这个结 构体有四个指针,通过对这四个指针的上下移动来对数据进行操作。在进入 ether_output 函 数之后数据重新打包成适合 NDIS 接口传输的 Packet 形式。然后调用 NDIS 函数 NdisSend 函数将数据由下层驱动送出。 图 4 发送过程 TCP/IP 协议层函数流程图 4.3.2 接收过程 下层网卡接收到数据以后,将通知微端口驱动程序,微端口驱动程序再将数据指示给 NDIS 协议驱动程序进行处理。 在协议层中对数据进行一系列的处理之后再通知给 TDI 客户, TDI 客户再将数据通知给上层应用程序。接收过程如图 5 所示。 -6-
http://www.paper.edu.cn 图 5 接收框图 数据从微端口指示给 NDIS 协议驱动以后, 首先将 NDIS 层的数据包格式 Packet 拆开组 装成 SK_BUFF 的形式,设置好该结构的各个成员。然后调整它的四个指针来获取不同层的 实际数据。首先分离出 MAC 帧头,判断收到的包是否为 IP 包,否则直接丢弃,是则继续 往上进入 IP 层处理。然后分离出 IP 头,判断当前包是否分片,是则等收齐所有分片以后重 新组包往上传递, 不是则直接上传。 最后分离出 TCP 头, 通过分析 TCP 头中所携带的信息, 以及当前 TCP 所在的状态来进行相应的处理。如当前的 TCP 状态是尚未建立连接则调用 tcp_rcv_state_process 函数,该函数根据 TCP 头中标志位的置位
情况来进行相应处理。如果 已经建立连接则调用 tcp_rcv_established 函数进行数据的接收过程处理,将接收的数据加入 队列, 当队列满了以后通过设置事件的信号态来指示上层的 TDI 客户有数据到达, 然后 TDI 客户以同样的方式通知上层应用程序。接收过程 TCP/IP 协议层中的函数调用过程如下图 6 所示。 图 6 接收过程 TCP/IP 协议层函数流程图 -7-
http://www.paper.edu.cn 5. 结论 本文以 RFC 文档中关于 TCP/IP 协议的标准规范为理论基础,以 Windows DDK 为开发 工具,结合项目需求,设计开发了一套 TCP/IP 协议。本套协议并未实现整个 TCP/IP 协议族 中的所有协议,只是对 TCP 和 IP 部分进行了实现。在前面总体协议框架的设计基础上,最 终得到的产品有,FTP 测试应用程序,TDI 客户及 TCP/IP 协议(TDI 传输器)。下面是测 试该 TCP/IP 协议的部分截图。 7 为启动加载 TCP/IP 协议(irdcTCP与 TDI 客户(TdiTirdcTcp 图 的截图。图 8 为协议接收数据的截图。 图 7 启动 TCP/IP 协议与 TDI 客户截图 图 8 接收数据截图 参考文献 [1] 陈向群,马洪兵,王雷,林斌,王磊,张高.Windows 内核实验教程[M].北京:机械工业出版社,2002:47-56 [2] Microsoft corp.DDK Documentation[DB/CD] [3] Chris Cant.Writing Windows WDM Device Drivers:Windows 设备驱动程序开发指南[M].孙义,马莉波, 国雪飞.北京:机械工业出版社,2000: 5-8 [4] Walter Oney.Programming the Microsoft Windows Driver Model[M].2nd Ed.Washington:Microsoft Press,2003:118-126 [5] RFC791
http://www.ietf.org/rfc/rfc791.txt [6] RFC793 http://www.ietf.org/rfc/rfc793.txt [7] 李善平,刘文峰,李程远,王焕龙,王伟波.Linux 内核 2.4 版源代码分析大全[M].北京:机械工业出版 社,2002:437-452 -8-
http://www.paper.edu.cn Design and Realization of TCP/IP protocol Based on Windows System Zhang Wei,Su Fang,Xu Huimin School of Telecommunications Engineering,Beijing University of Posts and Telecommunications,Beijing
(100876) Abstract In this paper, a method is introduced, which is the development of TCP/IP protocol Based on Windows System. The main frame of the protocol is designed according to the theory of Network Driver Interface Standard (NDIS and Transport
Driver Interface (TDI on the Windows Driver Development Kits (DDK help document. Realization of the function of TCP/IP protocol is programmed according to the standard of TCP/IP protocol on the Request for Comments (RFC documents. Keywords:Transmission Control Protocol/Internet Protocol,Windows Driver Development Kits, Network Driver Interface Standard,Transport Driver Interface -9-
Windows平台下TCPIP协议的设计与实现.
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)