1
李成大 :Windows 下 TCP/ IP 协议分析软件的设计开发
·331·
2
2
第 2 期
Windows 下 TCP/ IP 协议分析软件的设计开发
(成都电子机械高等专科学校 计算机系 , 四川 成都 610031)
李成大
摘 要 : 为适应计算机网络教学的需要 ,帮助学生更加直观地理解网络协议的实现原理 ,笔者用 VC 并利
用 VxD 技术开发设计了 TCP/ IP 协议分析软件 。该软件在 Windows 环境下对网络中的数据流进行监听 、截
获 、存储 ,对 TCP/ IP 协议族中各种数据包的包头信息 、数据以及校验和进行分析 ,还原得到协议的各项内
容 。重点介绍该协议分析软件的核心部分 —数据采集子系统和协议分析子系统的设计方案和实现方法 。
关键词 : TCP/ IP ; 协议分析 ; VxD
中图法分类号 : TP273 文献标识码 : A 文章编号 : 1001
3695 (2002) 02
0133
03
Development of a TCP/ IP Protocols Analysis Software in Windows
( Dept . of Computer , Chengdu Electromechanical College , Chengdu Sichuan 610031 , China)
LI Cheng
da
Abstract : In order to meet the demands of the computer networks course teaching and help students understand the principle of TCP/ IP
protocols , the author designed the TCP/ IP protocols analysis software using VC programming language. This software monitors ,captures
and stores the data stream in networks , and analyzes the datagram headers , data area and checksum of TCP/ IP Protocols. The emphasis
of this paper is the introduction of how to implement the data collection subsystem and protocols analysis subsystem , both of which are the
core of this software.
Key words : TCP/ IP ; Protocols Analysis ; VxD
1 引言
计算机网络的各层及其协议的集合称为网络的体系
结构。网络的体系结构是计算机网络教学中最重要最核
心的内容 。当应用进程的数据在网络中传送时 ,在发送
端首先被分解成一个个的数据包 ,然后将报文逐层下传 ,
每经过一层都要加上与该层协议有关的控制信息 。当数
据流沿物理层到达接收端时 ,再将报文逐层上传 ,每一层
根据控制信息进行必要的操作后将控制信息剥去 ,然后
将该层剩下的数据单元上交给更高的一层 ,直至将最终
的数据交给接收端的应用进程 。
Internet 上所使用的 TCP/ IP 协议在计算机网络中占
有特殊重要的地位 ,许多学校的计算机网络教学都以它
为例进行讲解 。为了使学生在枯燥的网络理论学习之余
增加直观的感性认识 ,加深对网络协议原理和内容的理
解 ,笔者开发设计了 Windows 环境下的 TCP/ IP 协议分析
软件 。该软件主要由三部分组成 :用户界面子系统 、数据
采集子系统和协议分析子系统 。用户界面子系统主要实
现 Windows 下美观 、直观的用户操作界面 ,方便教师的教
学和学生的学习 。数据采集子系统和协议分析子系统是
该协议分析软件的核心部分 。下面介绍两个子系统的设
计方案和实现方法 。
2 数据采集子系统
2
1 数据采集原理
TCP/ IP 协议的核心部分是传输层协议 ( TCP 与
UDP) 、网络层协议 ( IP) 和物理层接口层 。这三层通常
在操作系统内核中实现 ,而一般用户不能直接感受到
操作系统的内核 。因此本系统中对网络中原始数据的
采集和协议分析必须通过对网卡进行直接读写来实
现 。
计算机网络虽然是共享通道 ,但它一般只接收数
据包中的目的地址与自己网络地址相符的数据包 ,而
不接收网上传输的发往其它计算机的数据包 。所以本
软件中为了实现既可以采集本机通讯的数据 ,又可以
采集其它主机间的通讯数据 ,应把网卡的工作方式设
置为杂收方式 (Promiscuous Mode) 。
2
2 VxD 技术
收稿日期 : 2001
02
20
由于 Windows 采取的保护措施屏蔽了系统的底层
2
·431·
3
3
3
3
3
3
3
3
3
3
3
计算机应用研究
2002 年
操作 ,用户不能像在 DOS 下一样直接操纵和使用系统
的硬件资源 ,如内存 、I/ O 端口 、中断和 DMA 等 ,所以
我们 采 用 虚 拟 设 备 驱 动 程 序 VxD ( Virtual Device
Drivers) 来实现对网卡的直接读写 。在本系统中我们
利用第三方提供的 VxD 进行二次开发 ,这样既提高了
软件的适应性 (能适应多种型号网卡) ,又缩短了开发
周期 。
2
3 VxD 编程关键技术
(1) 载入 VxD
# include < windows. h >
HANDLE hVxD ;
hVxD = CreateFile (″\
\
\
\
.
\
\ VPACKET. VXD″, GENERIC
EXISTING, FILE AT
READ | GENERIC WRITE , 0 , NULL , OPEN
TRIBUTE NORMAL | FILE FLAG OVERLAPPED|
FILE FLAG DELETE ON CLOSE ,
NULL) ;
if (hVxD = = INVALID HANDLE VALUE)
return SYSERR ;
(2) 释放 VxD
CloseHandle (hVxD) ;
(3) 绑定 VxD 到网络接口卡
inBuffer)
int Bind ( HANDLE hVxD , BYTE
{
HANDLE hEvent ;
DWORD cbRet ;
OVERLAPPED ovlp = {0 ,0 ,0 ,0 ,0} ;
int result ;
int cbIn = 5 ;
hEvent = CreateEvent (0 , TRUE , 0 , NULL) ;
if ( ! hEvent)
return SYSERR ;
ovlp . hEvent = hEvent ;
/ / DeviceIoControl 函数直接发送一个控制码给指定的设备促使相应
的设备去执行指定的操作
result = DeviceIoControl ( hVxD , IOCTL
PROTOCOL BIND ,inBuffer ,
cbIn , inBuffer , cbIn , &cbRet , &ovlp) ;
if ( ! result)
GetOverlappedResult (hVxD , &ovlp , &cbRet , TRUE) ;
CloseHandle (hEvent) ;
return OK;
}
if ( ! this
{
ShowMessage (″无法绑定网络设备 (网卡)″) ;
return ;
} ;
其中 ndis 的含义是设备名 ,一般是 0000 ,0001 等
> Bind (hVxD ,ndis) )
等 ,在 Win9x 注册表的如下位置 :
HKEY LOCAL MACHINE/ System/ CurrentControlSet/ Services/ Class/
Net/ 0000
(4) 读数据包
Buffer , DWORD cbIn)
int RcvPacket ( HANDLE hVxD , BYTE
{HANDLE hEvent ;
DWORD cbRet = 0 ;
OVERLAPPED ovlp = {0 ,0 ,0 ,0 ,0} ;
int result ;
hEvent = CreateEvent (0 , TRUE , 0 , NULL) ;
if ( ! hEvent)
return SYSERR ;
ovlp . hEvent = hEvent ;
result = DeviceIoControl ( hVxD , IOCTL
cbIn , Buffer , cbIn , &cbRet , &ovlp) ;
if ( ! result)
GetOverlappedResult (hVxD , &ovlp , &cbRet , TRUE) ;
PROTOCOL
READ ,Buffer ,
CloseHandle (hEvent) ;
return cbRet ;
}
(5) 送数据包
与 IOCTL PROTOCOL READ 相似 ,此时参数为
IOCTL PROTOCOL WRITE。
3 协议分析子系统
协议分析子系统的任务是根据 TCP/ IP 协议族的内
容 ,对 TCP/ IP 协议族中各种数据包的包头信息 、数据以
及校验和进行分析 ,并实现数据的重组和还原 。限于篇
幅 ,下面仅介绍对 IP 包数据和 TCP 包数据进行分析的方
法 。
3. 1 IP 协议分析
(1) IP 数据包格式 (如表 1)
表 1 IP 数据报文段的格式
0 4 8 12 16 20 24 28 31
版本 首部长度
服务类型
总长度
标志
寿命
协议
标志
段偏移
首部校验和
源站点 IP 地址
目标站点 IP 地址
长度可变的任选字段
填充
数据
…
其中首部中几个重要字段的意义是 :
● 总长度
占 16Bit ,是指首部和数据之和的长度 ,单位为字节 ,
在本文中又称之为流量 。
● 协议
占 8Bit ,是指此数据报文所携带的运输层数据是使
用何种协议 ,以便目的主机的 IP 层知道应将此数据报文
上交给哪个进程 。常用的协议和相应的协议字段值是 :
UDP(17) 、TCP(6) 、ICMP(1) 、GCP(3) 、EGP(8) 、IGP(9) 、SPF
(89) 以及 ISO 的 TP4 (29) 。
● 源站点 IP 地址
占 32Bit ,发送数据报文的主机地址 。
● 目的站点 IP 地址
占 32Bit ,数据报文发送到的主机地址 。
● 数据
数据报文所携带的数据信息 。
(2) 描述 IP 包头信息的数据结构
struct ip {
unsigned char ip
/
/
short
/
nsigned short
/
short
/
ip
header length
ip
ip off ;
fragment offset field
ip
identification
hl :4 ;
/
len ;
total length
/
version
/
v :4 ,
id ;
/
/
1
1
1
1
2
1
1
1
2
2
1
1
1
1
1
·531·
1
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
2
2
第 2 期
李成大 :Windows 下 TCP/ IP 协议分析软件的设计开发
/
/
/
# define IP DF 0x4000
/
dont fragment flag
# define IP MF 0x2000
/
more fragments flag
# define IP OFFMASK 0x1fff
/
mask for fragmenting bits
unsigned char ip
/
unsigned char ip p :8 ;
/
/
unsigned short ip
/
/
unsigned char source[4 ] ,dest[4 ] ;
/
/
} ;
source and dest address
time to live
checksum
protocol
ttl :8 ;
sum ;
/
3. 2 TCP 协议分析
(1) TCP 数据包格式
TCP 数据报文段的格式如表 2 所示 。
表 2 TCP 数据报文段的格式
0 4 16 31
源端口
目标端口
数据偏移
保留
校验和
发送序号
确认序号
选项和填充
数据
…
窗口
紧急指令
其中首部中重要字段的意义是 :
● 端口
TCP 使用端口 ( Port) 进行寻址 。在主机中往往有多
个进程在运行 ,为区分哪个进程在进行通信 ,就必须在运
输层上设置一些端口 。一个端口是一个 16Bit 的地址 。
对于一些常用的应用层服务 ,都各有一个对应的端口号 ,
这些端口号称为熟知端口 ( Wellknown Port) ,数值为 0~
255 。常用的熟知端口有 : FTP ( 文件传输协议) 21 , Telnet
(远程登录) 23 ,SMTP(简单邮件传输协议) 25 ,WWW(World
Wide Web) 80 ,POP3 (邮局协议) 110 等 。
(2) 描述 TCP 包头信息的数据结构
struct tcphdr {
sport ; /
unsigned short th
unsigned short
/
dport ;
th
unsigned int
/
th
seq ;
unsigned int
/
th ack ;
unsigned char
/
th off :4 ,
th x2 :4 ;
/
unsigned char
th flags ;
# define TH FIN 0x01
# define TH SYN 0x02
# define TH RST 0x04
# define TH PUSH 0x08
# define TH ACK 0x10
# define TH URG 0x20
unsigned short
th win ;
unsigned short
sum ;
th
unsigned short
th
urp ;
} ;
/
source port
destination port
sequence number
acknowledgement number
data offset
(unused)
window
checksum
/
urgent pointer
/
/
/
/
/
/
/
/
/
/
3. 3 协议分析的实现
if ( FormMain
> swaps (pEtherHead
IP) / / 从以太网过滤出 IP 数据报文
{
> ServType) = = ETHER PROTO
> DestPort) )
> port[9 ] ; break ;
> port[0 ] ; break ;
> port[1 ] ; break ;
> port[2 ] ; break ;
> Proto = = 6) / / TCP(6)
…
if (pIPHead
{
…
/ / 协议值为 6 ,即是 TCP 的数据报文
…
}
…
}
> swaps(pTCPHead
然后过滤出熟知端口的值 :
switch (FormMain
{
case 21 : p = FormMain
/ / ftp (send command)
case 200 : p = FormMain
/ / ftp (send data)
case 23 : p = FormMain
/ / telnet (远程登录)
case 80 : p = FormMain
/ / web ( Internet)
case 8000 : p = FormMain
/ / oicq (8000)
case 6666 : p = FormMain
/ / icq (6666)
case 139 : p = FormMain
/ / Neighbor (网上邻居
case 110 : p = FormMain
/ / pop3 (收 mail)
case 25 : p = FormMain
/ / smtp (发 mail)
case 443 : p = FormMain
/ / pws(Personal Web Server)
case 70 : p = FormMain
/ / gopher
case 1433 : p = FormMain
/ / sql server
default
: p = FormMain
/ / 所有的 IP 包
}
远程访问)
> port[5 ] ; break ;
> port[6 ] ; break ;
> port[7 ] ; break ;
> port[2 ] ; break ;
> port[8 ] ; break ;
> port[3 ] ; break ;
> port[4 ] ; break ;
> port[12 ] ; break ;
> port[11 ] ; break ;
4 结束语
从实际使用的效果来看 ,利用该 TCP/ IP 协议分析软
件 ,可以非常直观地观察到网络中传输的原始数据 ,还原
得到协议的各项内容 ,帮助学生深入理解 TCP/ IP 协议的
实现原理 。在《计算机网络》课中 ,笔者使用此软件进行
辅助教学 ,取得了良好效果 ,具有相当的推广价值 。
参考文献 :
计算机网络[M]
北京 :电子工业出版社 ,1999
[1 ] 谢希仁
[2 ] Douglas E Comer ,David L Stevens. Internetworking with TCP/ IP.
Vol II : Design , Implementation , and Internals ( Second Edition)
[M]
[3 ] Dipl.
95[ Z]
[4 ] 余建斌
Prentice
Ing. Christopher Chlap. Direct Network Access in Windows
1997
黑客的攻击手段及用户对策 [M]
北京 :人民邮
Hall ,Inc ,1994
电出版社 ,1998
[5 ] 蒋东兴 ,等
Windows Sockets 网络程序设计大全 [ M]
北
京 :清华大学出版社 ,1999
作者简介 :
李成大 (1969
为计算机网络 、工业测控系统 。
) ,男 ,黑龙江省铁力人 ,讲师 ,工学学士 ,研究方向