Windows 平台下 TCP/IP协议的设计与实现 1 张维,苏放,徐惠民
北京邮电大学电信工程学院,北京 (100876 E-mail :
摘 要:本文介绍了在 Windows 平台下开发 TCP/IP协议的方法。根据 Windows 驱动开发 套件 (DDK帮助文档中关于网络驱动接口规范 (NDIS与传输驱动接口 (TDI的相关原理设计 了整体协议框架,根据 RFC 文档中关于 TCP/IP协议的标准规范编写程序实现了 TCP/IP协 议族的相应功能。
关键词:TCP/IP协议; Windows 驱动开发套件;网络驱动接口规范;传输驱动接口 中图分类号:TP393.4 1. 引言
本文背景基于一个 TCP/IP协议改进项目, 项目要求通过改进 TCP/IP协议拥塞控制算法 来提高无线网络环境下的数据吞吐量。目前的 TCP 协议在无线网络环境下无法区分出拥塞 丢包与误码丢包,根据这两种不同的丢包原因需要对 TCP 的窗口进行不同的调整,因此需 要对现有的 TCP/IP协议进行改进。针对这个需求提供的一个解决方案就是自己开发出一套 TCP/IP协议以替代系统 TCP/IP协议, 但是并不需要实现整个 TCP/IP协议族, 重点实现 TCP 与 IP 协议即可。
2. TCP/IP协议概述
TCP/IP协议是 Internet 的技术基础。 Internet 是一个广域网,是目前联通世界上绝大多 数国家和地区的全球性信息系统。在 Internet 上,可以实现低成本、高速率、交互式的信息 查询、信息发布、通讯联络以及协同作业等等现代化的工作、学习和生活。
TCP/IP协议族通常分为四个层次,应用层、传输层、网络层和链路层。如图 1所示
图 1 TCP/IP协议族四层结构
应用层向用户提供一组常用的应用程序,比如电子邮件 (SMTP、文件传输访问 (FTP、 远程登录 (Telnet等。
传输层提供进程间端到端的通信。在 TCP/IP协议族中,主要有两种不同的传输协议:传输控制协议 (TCP和用户数据报协议 (UDP。 TCP 提供面向连接的、可靠的 (没有数据重复 或丢失 , 全双工的数据流传输服务。 而 UDP 则提供的是不可靠的面向无连接的数据传输服 务,其可靠性应由上层应用程序来支持。
网络层,主要负责数据包的分组及路由选择。在 TCP/IP协议族中,网络层协议包括网 1本课题得到华为高校科技研究基金资助(NO.YJCB2005055WL 。
际协议 IP 、互连网控制报文协议 ICMP 、地址转换协议 ARP 和反向地址转换协议 RARR 。
链路层处于四层结构的最低层,负责接收 IP 数据报并通过网络发送之,或从网络上接 收物理帧,抽出 IP 数据报,交给 IP 层。通常包括网络设备驱动程序及网络接口卡等。
3. TCP/IP协议的系统设计
以 Windows 网络体系结构 [1]为基础, 参照 Windows DDK中关于网络协议驱动与传输驱 动接口 [2] (TDI的相关资料, 以及考虑到与原有系统 TCP/IP兼容, 提出的设计方案如图 2所 示。
图 2 TCP/IP协议设计框图
应用程序也就是根据协议开发的特定应用。这里是针对开发的 TCP/IP协议编写的一个 FTP 小应用程序,用来测试开发的协议。应用程序通过 Win32 API[3]接口将其操作转化成相 应的请求提交给 TDI 客户。
传输驱动程序接口(TDI 客户是核心态的驱动程序。 它的主要功能是完成上层应用 程序的请求, 或者根据该请求产生相应的 TDI 操作, 并将该操作传递给下层的 TDI 传输器。 TDI 客户通过 Win32 API接口与上层应用程序交互;通过 TDI 接口与下层 TDI 传输器进行 交互。
TDI 传输提供者(TDI Transport Provider又称为 TDI 传输器, NDIS 协议驱动程序, 以及协议驱动程序,是工作在核心态的协议驱动程序。其中 TCP 协议, IP 协议, ARP 协议 等都是在这个模块中实现。它通过 TDI 接口与上层的 TDI 客户进行交互;通过 NDIS 接口 与下层微端口驱动进行交互。
NDIS 下层微端口驱动程序是工作在核心态的驱动程序, 它负责将 TDI 传输器接入至特 定的网络适配器。它通过 NDIS 接口与上下层进行交互。
4. TCP/IP协议的系统实现
由图 2中可以看出,整个系统可分为四部分,应用程序、 TDI 客户、 TDI 传输器和下层 微端口驱动。 事实上对于下层微端口驱动并不需要考虑, 因为可以直接调用 NDIS 库函数将 数据转发到这层, 处于这层上的驱动会自动将数据送出网络适配器。 因此真正需要开发的也 就是上面三个部分。应用程序是用来实现简单文件传输的,因此考虑开发两个小应用程序, 一个为服务器端, 一个为客户端, 服务器端用来监听和处理来自客户端的连接请求。 客户端
主要是向服务器端请求连接和发送数据。 TDI 客户负责将来自应用程序的请求进行相应的处 理之后转发给下层的 TDI 传输驱动。 TDI 传输驱动主要是实现 TCP, IP等功能, 并与下层的 NDIS 接口进行交互。
4.1 应用程序的实现
客户端,可以通过本地的某个端口向对方发送数据。并显示一些错误状态。 服务器端,可以指定在本地的某个端口监听连接请求,接收数据,并显示一些状态。 实现:通过 DeviceIOControl 及相应 ControlCode 来将命令传输到下层的 TDI 客户。 主要接口函数:CreateFile 和 DeviceIoControl
CreateFile 函数原型: HANDLE CreateFile( LPCTSTR lpFileName, DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD
dwCreationDisposition, DWORD
dwFlagsAndAttributes, HANDLE hTemplateFile ;
lpFileName 在这里就是指向要操作的 TDI 客户(驱动的符号链接,符号链接是下层 驱动程序对 Win32子系统可见的引用符号,也就是代表了一个下层的驱动。这个函数的功 能是打开下层的 TDI 客户,并返回该设备句柄,以后对设备的所有操作都是通过该句柄来 引用。
DeviceIoControl 函数原型: BOOL DeviceIoControl( HANDLE hDevice, DWORD dwIoControlCode, LPVOID lpInBuffer, DWORD
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)