杭州商学院校园网网络计费系统
--计费信息获取子系统的设计与实现
李壮相
[摘要] 本文给出了一个基于Web的、跨平台的校园网网络计费系统的初步设计与实
施方案,并给出系统的模块结构和功能的描述,同时详细地探讨了计费信息
获取子系统(底层数据报文截取及其接口)的分析、设计与实现。
[关键词]计费系统、底层数据报文截取、TCP/IP、FTP、数据报文、共享介质
信息流量、虚拟设备、VxD技术、数据采集、数据控制
一、引言
因特网以其信息传送方便、快捷、费用低廉,并且可以实现资源共享等诸多优点,深受广大用户青睐。目前,我院已通过国家教科
网连入因特网,给我们的教学、科研带来极大的方便,同时也不可回避因特网服务的计费问题。目前的网络虽然在速度上有了很大的提
高,但是随着网络用户数量的迅速增加和传输量的增加(比如图片和多媒体资料越来越普遍),网络带宽仍然很紧张。对网络使用收取
合理的费用一方面可以维持网络的运行和发展,另一方面,也可以促使用户合理使用网络资源。由于网络结构的多样性和计费规则的复
杂性,为此我们分析我院校园网的特点,在校园网网络的软硬件上提出了一种校园网的网络计费系统的设计与实施方案。
作为计费信息系统的基础,计费信息的截取是系统整体的核心关键部分,该模块的分析、设计与实现好坏直接影响着系统的设计与
实现和校园网的网络计费管理,本文对此进行详细的探讨和讨论。
二、系统设计和分析
国际上,计费管理负责监视和记录用户对网络资源的使用,并分配网络运行成本。其主要功能有:
数据的采集(包括简单的统计功能),即从用于计费的设备(如计费路由器)中采集原始数据,经过简单的统计后,放入数据库。 我院校园网的主干网络采用高速非共享介质的网络结构,但是院内各部门与外界的互联均依赖共享介质,所以我们设计的校园网网络
计费系统正是建立在这一"关口"上。
在共享介质网络中,流经这一网络的任何数据包,均可由这一网段的任何一台主机所截获。因此,把网络计费系统设计在与外界互联
的网段上,即可统计出校园内各部门与外界的所有通信量。
总体上,我们所设计的网络计费系统分为三部分,一是在Win32平台上的线程对数据包的截获,并且进行初步的整理,生成日志文件,
并加适当的控制,这是低层的服务程序,作为前台;而后台则是在Windows NT Server上的数据库管理,用Borland Delphi 4.0开发,直接
取得第一部分截取程序生成的日志文件和通过FTP获取在Linux服务器上其它服务生成的日志文件,对其分析,统计出有效的数据信息,并至
于以BDE驱动的数据库文件中。三是计费信息用户查询子系统,使得用户能在线通过权限查询到自己各个时间段内的计费信息和费用情况,
有利于减轻网络管理员的工作负担。
具体情况如下:
⑴、因特网采用的是TCP/IP协议,所以Win32平台上的进程只要截获到所有的IP数据包,就可以分析出所需要统计的计费信息。对于统
计信息分以下几种情况:
FTP:又分上传和下载,下载的数据报信息不用列入统计范围,上传则需要;
UDP:数据报信息需要统计;
拨号上网:可以通过在路由器上生成的日志文件进行分析;
电子邮件:也可以通过Windows NT Server上的Nescape邮件服务器留下的日
志文件进行统计,而不需要进行数据报的截获;
⑵、后台的数据库信息管理通过由Delphi开发的管理信息系统采集上述的数据信息实现的,对FTP、UDP、拨号上网和电子邮件的信息
进行再次整理、分析,统计出必要的数据存于数据库中,可供使用校园网服务的各部门查询其费用情况之用。
⑶、计费信息用户查询子系统,用户通过页面浏览器访问,提交请求反馈该用户使用校园网信息服务的费用情况。查询子系统通过权
限(如身份认证)和查询条件查询数据库的数据,输出该用户的需求的信息。
系统计费依据
对于网络计费的信息而言,最根本的是IP地址、网络流量以及时间段。因此,系统的计费依据就是IP的地址和流量,还有时间段的统
计,以此信息作为收费规则。
㈠、IP地址 区分出校内和校外、国内和国外。由于因特网的网络地址管理都是划分层次的,只要知道其隶属于哪一层次即可进行
管理;
㈡、IP流量 区分出国内和国外的数据流量来统计;
㈢、时间段 对于拨号上网的用户,不同的时间段有不同的收费规则;
㈣、特殊的校内部门有其对应的计费依据。
三、计费信息获取子系统(底层数据报截取及其接口)的分析与设计
3.1 关于VxD技术
① 为什么要使用VxD技术
为了减轻服务器的负担,而我院校园网的主干网络采用高速非共享介质的网络结构,但是院内各部门与外界的互联均依赖共享介
质,根据这一特点可用一台独立的计算机来处理计费工作以达到这一目的。这台服务器的操作系统可以是Linux也可以采用Win32,但
Win32具有易操作、可视化的的优点。虽然Win32平台不支持对设备的直接存取,但可以采用VxD技术来实现这一功能。
② VxD在网卡上应用的关键技术
A. 载入VxD
#include HANDLE hVxD;
hVxD = CreateFile("\\\\.\\VPACKET.VXD",
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED | FILE_FLAG_DELETE_ON_CLOSE,
NULL);
if (hVxD == INVALID_HANDLE_VALUE)
return SYSERR;
B. 释放VxD
CloseHandle(hVxD);
C. 绑定VxD到网络接口卡
int Bind(HANDLE hVxD, BYTE* inBuffer)
{
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;
}
D.读数据包
int RcvPacket(HANDLE hVxD, BYTE* Buffer, DWORD cbIn)
{
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_PROTOCOL_READ,
Buffer,
cbIn,
Buffer,
cbIn,
&cbRet,
&ovlp);
if (!result)
GetOverlappedResult(hVxD,
&ovlp,
&cbRet,
TRUE);
CloseHandle(hEvent);
return cbRet;
}
E.送数据包
与IOCTL_PROTOCOL_READ相似,此时参数为IOCTL_PROTOCOL_WRITE
3.2 截取部分的分析与设计
由于校园网网络计费系统分为三大部分,采用底层数据报文截取来提供计费管理的信息依据,所以首先就要从相关的网络方面知识入手。
在计算机网络体系结构中,虽然TCP/IP体系结构不是国际标准,但占有非常重要的地位。世界上第一个分组交换网是美国军方的实验网
ARPANET,它的体系结构也采用分层次的结构。当初的ARPANET现已发展成为世界上规模最大的计算机网络Internet,即因特网。在因特网所
使用的协议中,最著名的就是运输层的TCP传输控制协议和网络层的IP互连网协议。TCP/IP体系结构已成为计算机网络的事实上的国际标准,
也称为工业标准。 又因为因特网采用的是TCP/IP协议(传输控制协议与互连网协议),流经共享介质的网络任何的数据报文遵循着该协议,
所以Win32操作系统平台上的数据报截取进程模块只要截获到所有的TCP/IP数据报,从其报文的首部即可分析出所需的必要计费数据信息。
而对于网络计费系统的计费信息而言,最根本的是源IP地址、目的IP地址、源端口、目的端口、TCP/IP数据报文的长度以及报文流经该
共享介质网段的时间。这些信息的获取就要采用TCP/IP协议,进行相应的处理。因此,网络计费系统计费依据的获取就是IP的源、目的地址,
源、目的端口和TCP/IP数据报文长度,还有报文流经的时间这项重要信息的获取。
首先是分析TCP/IP网络体系下两个最主要的协议--互连网协议IP和传输控制协议的数据报文格式开始,从协议报文最基本的字段信息中
提取出对计费管理有效的数据依据。
以下详细描述TCP/IP报文格式。
IP数据报文段的格式如下所示:
其中首部中几个重要字段的意义是:
总长度 占16Bit,是指首部和数据之和的长度,单位为字节,在本文中又称之为流量,数据报文的最大长度为65535字节,而相应的TCP数据报文段的格式如下所示:
其中首部中重要字段的意义是:
端口 TCP使用端口(port)进行寻址。在主机中往往有多个进程在运行,为区分哪个进程在进行通信,就必须在运输层上设置 从上述的两种数据报文的首部格式可见,要对截获的TCP/IP数据报进行必要的信息提取,即将总长度、协议、源站点IP地址、
目的站点IP地址、源端口、目的端口这几个字段从数据报文中分离出来,再加上实时截获时的系统时间,就可以构成一条较为完整
的计费信息记录,但是对此记录还需进一步的过滤处理,只有源站点IP地址和目的站点IP地址至少二者之一为院内IP地址时,才能
真正算是构成完整的信息记录。
其次是如何进行TCP/IP数据报文的截获。由于计费信息的实时动态性,及Win32操作系统的普遍性、易操作和可视化等优点,所
以我们决定在Win32平台上编写底层数据报截取模块,但是Win32系统不提供底层设备的直接操作,于是我们利用Win32的编程特色,使
用虚拟设备驱动程序的技术,使Win32系统对设备的控制如同对文件的操作,(前面已详细描述了VxD技术)任何流经共享介质网段的数
据报文也必然会流经连接在共享介质网段上的计算机的设备(网卡),利用对虚拟设备驱动程序的读写就能够轻易地操作该设备,
截获所有的TCP/IP数据报文。又因为在共享介质网段上流经的数据报文的流量是不可估算的,所以采用线程技术的编程思想,就能较
好地处理数据报文的流量问题。
第三是底层数据报文截取和Windows NT Server上服务端计费管理部分的接口是通过生成数据报文流量的日志文件进行沟通的。
TCP/IP数据报文的日志文件处理问题,也即截获有效的计费信息记录后,如何交给服务端的管理应用程序进行进一步的数据处理。在
获得TCP/IP数据报文时分离出"总长度、源站点IP地址、目的站点IP地址、源端口、目的端口"这几个重要的字段信息,并附加上当前
的系统时间,以一定的形式分隔作为一条记录存放在Windows NT Server系统的FTP服务管理路径下的日志文件中或者指定的某一路径,
供Windows NT Server上的计费系统服务管理端下载处理或直接拷贝。当服务管理端的数据处理模块使用FTP协议,将Win32操作系统
下的数据报文流量日志下载或拷贝后,对其中未分析的记录进行处理:先将每一条记录重新分割,还原为计费信息依据的几个重要字
段,然后导入到相应的库表中,同时对端口类型分类统计,根据IP地址表区分出校内外、国内、国际的入流量和出流量;再对记录的
时间划分,根据收费规则表、节假日收费表和流量计算出相应的日、月信息费用(费用是累计上去的),存储入库表,就完成了计费
系统的数据处理和计费功能。
从上可见,网络计费管理系统的核心关键部分就在于"数据报文的截获----分类、统计、汇总相应的计费信息"两个子系统,前者
充分利用Win32操作系统的特性和系统核心编进行数据报文的截取、后者采用数据库技术对计费信息的进行系统管理,两者的处理是
相互独立的,但同时各自又有必然的联系。查询系统的虽然是一个独立的模块,但可以看成计费处理信息的一部分。
计费信息截获子系统,该子系统模块的详细结构图如下所示:
3.3流量控制的原理分析和总体设计
在任何网络体系结构的层次中,控制都是必不可少的功能,但不同的层次有不同的控制内容,不同层次之间的有不同的分工。
TCP/IP体系结构中IP层同OSI/ISO体系结构中的网络层相似,其控制功能包括:差错控制、拥塞控制以及路径控制等。IP层作为TCP/IP
体系结构中至关重要的一层,其控制功能是最复杂的。IP层协议ICMP,就是TCP/IP中传递网络控制信息的主要手段。同时,ICMP还提供
差错报告功能,可以利用它实现校园网的流量控制。
如同其他高层协议数据一样,ICMP报文也是封装在IP数据报的数据部分中进行传输的,如图所示。
IP数据报 ICMP数据的封装
包含ICMP报文的IP数据报报头"协议"域指出数据区内容为ICMP报文。
ICMP报文也分为头标和数据区两大部分,其中头标包含"类型"、"代码"和"校验和"三个域。
ICMP报文格式如图所示。
其中"类型"域是一个字节的整数,指出ICMP报文的类型
"代码"域是也是一个字节的整数,提供关于报文类型的进一步信息
"校验和"域共两个字节长,提供整个ICMP报文的校验和
"数据区"包含出错的数据报报头及该数据报前64比特数据。
类型域所代表的意义如下表:
我们知道,网关的主要功能是进行数据报寻径并转发数据报,网关寻径和转发数据报并不总是能够成功的。在下述情况下,
网关便会发现信宿不可到达: ⑴信宿机硬件不在运行中(如故障、关机),⑵发送者指定的信宿地址不存在,⑶网关不知道去
往信宿的路径。一旦发生以上情况,网关便会向信宿机发送"信宿不可到达"报文(如图)并抛弃相应数据报。
ICMP"信宿不可到达"报文格式
其中类型3即表示"信宿不可到达"报文。码域可取0-12共十三个值,进一步细分,如表所示:
分析我院的网络体系结构,不难发现基于共享介质网络的很容易实现流量控制这一功能,只要伪造一个ICMP包即可达到干扰目
的。当收到IP包时(不包含ICMP本身),分析其IP地址是否有效,如无效,则向信宿发送一个差错控制报文(ICMP)即可。在局域
网传输的速度远远高于广域网,所以这个差错控制报文(ICMP)一定会比正确的信息快得多,导致正确的信息被当作无效数据抛弃,
从而达到干扰的目的。这是关键的一个步骤,经过实验证明,使用码值0和1均可,因为所谓"信宿"四个层次的概念,从大到小依次
为:网络、主机、协议、端口,因此采用1更合适。
四、系统结构和实现
4.1 系统的结构
校园网网络计费系统的设计是基于Web、跨平台的,系统结构图如下所示:
4.2 系统的实现
网络计费系统在实现时分成三大模块:Win32平台截获数据报的进程模块和Windows NT Server 4.0上的数据库信息管理模块
以及Web信息查询模块。
①、Win32平台上截获数据报进程的子模块:
读线程:负责截获流经共享介质的数据报,并存储在共享内存段中;
写线程:负责从共享内存段读出数据报,对其进行初步整理后,写入日志文件
②、Windows NT 上数据库信息管理的子模块:
分析统计信息模块:通过FTP接收来自底层截获的计费信息、邮件服务器上的
邮件日志和路由器上的拨号网络日志,同时进行分析、统计出有效的计费数据,至于数据库当中;
③、Web信息查询模块:
公共网关接口部分:根据用户的请求,从计费信息数据库中提取相关的收费信
息并以HTML的形式返回给用户;
HTML FORM部分:用户可以通过浏览器访问该页面,提交请求反馈该用户使
用校园网服务费用情况。
五、计费信息截获子系统的系统实现
5.1计费信息截获子系统(底层数据报文截取)的实现
基本数据结构的说明 由于Win32的虚拟设备驱动程序技术使对设备的控制如同对文件的操作,任何流经共享介质网段的数据报文
也必然会流经连接在共享介质网段上的计算机的设备(网卡),利用系统Win32操作系统的特性就能够轻易地操作该设备,截获所有的
TCP/IP数据报文。
所以引用系统的Include Head File来定义数据结构:
struct EtherAddr {
unsigned char AddrByte[6];
};
struct EtherPacketHead {
struct EtherAddr DestEther;
struct EtherAddr SourEther;
unsigned short ServType;
};
struct IPAddr {
unsigned char AddrByte[4];
};
struct IPPacketHead {
BYTE VerHLen;
BYTE Type;
WORD TtlLen;
WORD Id;
WORD FlgOff;
BYTE TTL;
BYTE Proto;
WORD ChkSum;
struct IPAddr SourIP;
struct IPAddr DestIP;
};
初始化过程
初始化网卡设备的接口
1、载入虚拟驱动程序 参照3.1 VxD技术
2、绑定虚拟驱动程序到设备上
if(!this->Bind(hVxD,ndis))
{
ShowMessage("无法绑定网络设备(网卡)");
return;
};
其中ndis的含义是设备名,一般是0000、0001等等。在Win32注册表的如下位置:
HKEY_LOCAL_MACHINE/System/CurrentControlSet/control/net/0000
(可从设置适配器的对话框中设置)
建立双线程
读线程 专门负责网卡设备上读取数据报文,及将其放入缓冲区
GetIpThread *GetIPPacket=new GetIpThread(true);
GetIPPacket->Resume(); //请求同步
写线程 负责从缓冲区读取数据报文,并对报文的网络协议值进行过滤,只有协议值为6时的报文才有效。及实时显示当前的状态
和其它与Windows有关的操作。
SaveInfo *SaveMemo=new SaveInfo(true);
SaveMemo->Resume();
在程序中过滤的代码段如下:
if(FormMain->swaps(pEtherHead->ServType)==ETHER_PROTO_IP) //从以太网过滤出IP数据报文
{
……
if(pIPHead->Proto==6) //TCP(6)
{
……
//协议值为6,即是TCP的数据报文
……
}
……
}
同时还需判断目的端口值,一般提供的因特网服务有FTP(文件传输协议)21、TELNET(远程登录)23、SMTP(简单邮件传输协议)25、
WWW(World Wide Web)80、POP3(邮局协议)110。
因此只需过滤出这些熟知端口的值:
switch(FormMain->swaps(pTCPHead->DestPort)) {
case 21: p=FormMain->port[0]; break; //ftp(send command)
case 200: p=FormMain->port[9]; break; //ftp(send data)
case 23: p=FormMain->port[1]; break; //telnet (远程登录)
case 80: p=FormMain->port[2]; break; //web (Internet)
case 8000: p=FormMain->port[3]; break; //oicq (8000)
case 6666: p=FormMain->port[4]; break; //icq (6666)
case 139: p=FormMain->port[5]; break; //Neighbor (网上邻居--远程访问)
case 110: p=FormMain->port[6]; break; //pop3 (收 mail)
case 25: p=FormMain->port[7]; break; //smtp (发 mail)
case 443: p=FormMain->port[2]; break; //pws(Personal Web Server)
case 70: p=FormMain->port[8]; break; //gopher
case 8080: p=FormMain->port[10]; break; //杭州商学院内部网
case 1433: p=FormMain->port[12]; break; //sql server
default : p=FormMain->port[11]; break; //所有的IP包
}
当数据报文经过过滤后,即可得出有效的计费依据信息(源站点IP地址、源端口、目的站点IP地址、目的端口、报文长度、系统截获时间),子进程每隔512次就写入日志文件(IpInfo.log)中。
退出处理
为了维护系统的安全稳定,模块退出是必须对打开的文件、设备进行逐一处理,同时对未保存的计费信息进行保存。 对于日志文件的记录格式,采用如下的编排:(源站点IP地址、源端口、目的站点IP地址、目的端口、报文长度、系统截获时间)。
在模块截取的日志文件实例为:
……
210.33.89.106:1246:202.102.13.156:80:40:2000/5/21
210.33.89.106:1543:204.178.112.166:80:40:2000/5/21
210.33.89.105:1579:194.117.203.152:80:40:2000/5/21
210.33.89.106:1246:202.102.13.156:80:40:2000/5/21
210.33.89.106:1246:202.102.13.156:80:40:2000/5/21
……
在Windows NT Server 上的计费处理部分中的数据处理模块将日志文件通过FTP协议获取,逐条记录分析、分类、统计和汇总,最后得出有效得计费管理信息,导入计费信息数据库中。这就是基本的接口处理。
5.2流量控制的设计与实现
设计与实现
建立一个合法用户的数据库如下表:
其中,Type为True时(即,为注册用户),Time字段和Date字段自动无效。
Time为卡用户的剩余时间,以小时为单位,但精确到秒。
Date为网卡的有效期,网卡不能永久性占据数据库,Date字段里的时间就是定期清理数据库的时间。
计费信息截获子系统,控制部分的详细结构图如下所示:
基本数据结构的说明
引用系统的Include Head File来定义数据结构:
struct ICMPPacketHead {
BYTE Type;
BYTE Code;
WORD ChkSum;
}
初始化过程 参照3.2 截取部分的分析与设计
建立双线程
读线程 专门负责网卡设备上读取数据报文,及将其放入缓冲区
GetIpThread *GetIPPacket=new GetIpThread(true);
GetIPPacket->Resume(); //请求同步
干扰线程 负责从缓冲区读取数据报文,并对报文的网络协议值进行过滤,只有协议值为6时的报文才有效。及判断无效IP进行干扰。
SaveInfo *SaveMemo=new SaveInfo(true);
SaveMemo->Resume();
在程序中过滤和干扰的代码段如下:
if(isValid(Apsourip)||isValid(Apdestip))
FormMain->MemoRpy->Lines->Add("合法用户");
else
{
FormMain->MemoRpy->Lines->Add("非法用户");
SendICMPPacket(FormMain->hVxD,
pdestether,
psourether,
pdestip,
psourip,
Buffer,
128); //发送ICMP包,干扰非法用户
}
退出处理 为了维护系统的安全稳定,模块退出是必须对打开的文件、设备进行逐一处理。
六 、结束语
校园网网络计费系统的初步设计与实现如上所述,由于采用底层开发进行数据的截取,迅速获得必要的信息,使计费系统的运行更
加迅速、准确、有效,适应校园网的网络管理要求。 不可否认,底层数据报文这一模块的开发还不够完善,控制部分目前为止还只能手
工输入合法用户的数据库,如IP地址和Mac地址一直是手工录入,而理论上应该是只要用户名和密码正确就可以全自动获取IP和Mac地址,
从这一点上与163和169等大规模的信息服务网还有相当大的距离,为此该模块仍需不断的扩大、改进和完善。
值此论文定稿之际,谨向一直给予我悉心关怀和教诲的任午令教授和石银保老师表示深深的谢意。在毕业设计和论文的撰写中,导
师都给予了热情的帮助和精心的教导。使我的毕设和论文得以完成。导师们严谨务实的治学作风,渊博的学识和诲人不倦的精神使我难
以忘怀。
[参考文献]
[1] DOUGLAS E.COMER,DAVID L.STEVENS 《Internetworking With TCP/IP》
Vol II:Design,Implementation,and Internals(Second Edition)
1994 by Prentice-Hall,Inc URL:http://www.phei.com.cn
[2] Dipl.-Ing. Christopher Chlap,University of Canberra, Australia,
Faculty of Information Sciences and Engineering
《Direct Network Access in Windows 95》
6. August, 1997 URL:http://willow.canberra.edu.au
[3] 余建斌 《黑客的攻击手段及用户对策》人民邮件出版社
[4] 蒋东兴,林鄂华,陈棋德,印敏,刘启新 《Windows Sockets网络程序设计大全》 清华大学出版社,1999
[5] 清汉计算机工作室 《C++ Builder网络开发实例》机械工业出版社,1999
[6] 岑贤道,安常青 《网络管理协议及应用开发》清华大学出版社,1999
本文地址:http://com.8s8s.com/it/it4091.htm