第1章网络应用程序设计基础
网络编程的基础是计算机网络,本章简要讲述网络程序设计中涉及的计算机网络方面的基础知识,包括各种网络术语、网络拓扑结构、网络协议等。基于计算机网络开发的分布式网络应用程序种类多样,设计需求也千差万别,本章对常用的网络程序设计方法进行归纳,由高层至底层分别介绍了面向应用的网络编程方法、基于TCP/IP协议栈的网络编程方法和面向原始帧的网络编程方法。
1.1计算机网络基础
1.1.1协议层次和服务模型
计算机网络,是指将地理位置不同且具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统、网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。总的来说,计算机网络的组成基本上包括计算机、网络操作系统、传输媒体以及相应的应用软件四部分。
计算机网络是一个极为复杂的系统,网络中有许多部分:大量的应用程序和协议、各种类型的端系统,以及各种类型的链路级媒体。面对这种复杂的系统,如何简化管理是非常重要的。为了降低设计难度,网络设计者以分层的方式组织协议以及实现这些协议的网络硬件和软件。协议分层具有概念化和结构化的优点,每一层都建立在它的下层之上,使用它的下层提供的服务,下层对它的上层隐藏服务实现的细节。
一个机器上的第n层与另一个机器的第n层交流,所使用的规则和协定合起来被称为第n层协议。这里的协议,是指通信双方关于如何进行通信的一种约定,每个协议属于某个层次。特定系统所使用的一组协议被称为协议栈(protocol stack)。
1. OSI参考模型
在OSI出现之前,计算机网络中存在多种体系结构,其中以IBM公司的系统网络体系结构(System Network Architecture,SNA)和DEC公司的数字网络体系结构(Digital Network Architecture,DNA)最为著名。为了解决不同体系结构的网络互连问题,国际标准化组织ISO于1981年制定了开放系统互连参考模型(Open System Interconnection Reference Model,OSI/RM)。这个模型把网络通信的工作分为7层,它们由低到高分别是物理层(physical layer)、数据链路层(data link layer)、网络层(network layer)、传输层(transport layer)、会话层(session layer)、表示层(presentation layer)和应用层(application layer),如图1-1a所示。
图1-1OSI参考模型与TCP/IP参考模型
第1层到第3层属于OSI参考模型的低三层,负责创建网络通信连接的链路;第4层到第7层为OSI参考模型的高四层,具体负责端到端的数据通信。每层完成一定的功能,每层都直接为其上层提供服务,并且所有层次都互相支持,而网络通信则可以自上而下(在发送端)或者自下而上(在接收端)双向进行。当然并不是每一通信都需要经过OSI的全部七层,有的甚至只需要双方对应的某一层即可。物理接口之间的转接,以及中继器与中继器之间的连接就只需在物理层中进行;而路由器与路由器之间的连接则只需经过网络层以下的三层。总的来说,双方的通信是在对等层次上进行的,不能在不对等层次上进行。
2. TCP/IP参考模型
ISO制定的OSI参考模型过于庞大、复杂,招致了许多批评。与此对照,由技术人员自己开发的TCP/IP协议栈获得了更为广泛的应用。
TCP/IP协议栈是美国国防部高级研究规划局计算机网(Advanced Research Projects Agency Network,ARPANET)和其后继因特网使用的参考模型。TCP/IP参考模型分为五个层次:应用层、传输层、网络层、链路层和物理层,如图1-1b所示。
在TCP/IP参考模型中,去掉了OSI参考模型中的会话层和表示层(这两层的功能被合并到应用层实现)。以下分别介绍各层的主要功能。
(1)应用层
应用层是网络应用程序及其应用层协议存留的层次。TCP/IP协议簇的应用层协议包括Finger(用户信息协议)、文件传输协议(File Transfer Protocol,FTP)、超文本传输协议(Hypertext Transfer Protocol,HTTP)、Telent(远程终端协议)、简单邮件传输协议(Simple Mail Transfer Protocol,SMTP)、因特网中继聊天(Internet Relay Chat,IRC)、网络新闻传输协议(Network News Transfer Protocol,NNTP)等。
应用层之间交换的数据单位为消息流或报文(message)。
(2)传输层
在TCP/IP模型中,传输层的功能是使源端主机和目标端主机上的对等实体可以进行会话。在传输层定义了两种服务质量不同的协议,即传输控制协议(Transmission Control Protocol,TCP)和用户数据报协议(User Datagram Protocol,UDP)。
. TCP协议是一个面向连接的、可靠的协议,为应用程序提供了面向连接的服务。这种服务将一台主机发出的消息流无差错地发往互联网上的其他主机。在发送端,它负责把上层传送下来的消息流分成数据段并传递给下层;在接收端,它负责把收到的数据包进行重组后递交给上层。另外,TCP协议还要处理网络拥塞控制,在网络拥塞时帮助发送源抑制其传输速度;提供端到端的流量控制,避免缓慢接收的接收方没有足够的缓冲区接收发送方发送的大量数据。TCP的协议数据传输单元为TCP数据段(TCP segment)。
UDP协议是一个不可靠的、无连接的协议,为应用程序提供无连接的服务。这种服务主要适用于广播数据发送和不需要对报文进行排序和流量控制的场合。UDP的协议数据传输单元为UDP数据报(UDP datagram)。
(3)网络层
网络层是整个TCP/IP协议栈的核心。网络层的功能是通过路径选择把分组发往目标网络或主机,进行网络拥塞控制以及差错控制。
网际协议(Internet Protocol,IP)是网络层的重要协议,该协议定义了数据包中的各个字段以及端系统和路由器如何作用于这些字段。
网络层中的另一个协议Internet控制报文协议(Internet Control Message Protocol,ICMP)用于在IP主机、路由器之间传递控制消息。控制消息包括网络是否畅通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。
另外网络层也包括决定路由的选路协议(如RIP、OSPF等),数据包根据选定的路由从源传输到目的地。
网络层的协议数据传输单元为数据包(packet),或称为分组。
(4)数据链路层
数据链路层负责物理层和网络层之间的通信,将网络层接收到的数据分割成特定的、可被物理层传输的帧,并交付物理层进行实际的数据传送。
数据链路层提供的服务取决于应用于该链路层的协议,常用的协议包括以太网的802.3协议、Wi-Fi的802.11协议和点对点协议(PPP)等。因为数据包从源到目的地传送通常需要经过几条链路,所以它可能被沿途不同链路上的不同链路层协议处理。
数据链路层的协议数据传输单元为帧(frame)。
(5)物理层
链路层的任务是将整个帧从一个网络元素移动到邻近的网络元素,而物理层的任务是将该帧中的一个一个比特从一个节点移动到下一个节点。该层中的协议仍然是链路相关的,并且进一步与链路(如双绞线、单模光纤)的实际传输媒体相关。对应于不同的传输媒体,跨越这些链路移动一个比特的方式也不同。
物理层的协议数据传输单元为比特(bit)。
1.1.2网络程序寻址方式
在邮寄信件时,邮政业务需要提供收信人的地址;在电话交流时,电话系统需要拨号者提供通信对方的电话号码。与之类似,在一个网络程序与另一网络程序通信之前,必须告诉网络某些信息以标识另一个程序。在TCP/IP中,网络应用程序使用两个信息来唯一标识一个特定的应用程序:IP地址和端口号。在具体的网络应用中,IP地址和端口号的使用还会遇到一些更复杂的变化,比如名称解析、网络地址转换等。
1. IP地址
互联网上的每个主机和路由器都有IP地址,它将网络号和主机号编码在一起。这个组合在全网范围内是唯一的(原则上,互联网上没有两个机器有相同的IP地址)。
IP地址是二进制数字,具有IPv4和IPv6两种类型,分别对应于已经标准化的网际协议的两个版本。IPv4地址的长度为32位,用于标识40亿个不同的地址。对于今天的Internet来说,这个地址范围并不能满足实际使用的需要。IPv6地址的长度为128位。
在表示IP地址以便于人们使用方面,为IP的两个版本采用了不同的约定。按照惯例,将IPv4地址写为一组4个用句点隔开的十进制数字(例如10.0.0.3),这被称为“点分十进制”表示法。点分十进制字符串中的4个数字表示IP地址的4个字节的内容,每个部分都是0~255之间的数字。
另一方面,根据约定,16字节的IPv6地址被表示为用冒号隔开的十六进制数字的组合(例如2000:fdb8:0000:0000:0000:0023:7865:28a1),每一组数字表示2字节的地址,可以省略前导0和只包含0的组序列。
就IPv4地址而言,最初对IP地址编址的方法是分类编址方法,如图1-2所示,IP地址的网络部分被限制长度为8、16或24比特,分别称为A、B和C类网络,D类网络用于多播,E类网络保留供今后使用。
图1-2IP地址格式和分类
此外还有一些地址段有特殊的用法,比如:
10.0.0.0~10.255.255.255、172.16.0.0~172.31.255.255、192.168.0.0~192.168.255.255是私有地址,这些地址被大量用于内部的局域网络中,以免以后接入公网时引起地址混乱。
127.0.0.0~127.255.255.255是保留地址,用于本地回环测试,发送到这个地址的封包不会被传输到线路上,而是被当作到来的封包直接在本地处理,这允许发送者不需要知道网络号就可以完成封包的发送。
169.254.0.0~169.254.255.255是保留地址。
0.0.0.0表示所有不清楚的主机和目的网络,一般在网络配置中设置了缺省网关,那么Windows系统会自动产生一个目的地址为0.0.0.0的缺省路由。
255.255.255.255表示限制广播地址,对本机来说,它指本网段内(同一广播域)的所有主机。
在域名系统出现之后的第一个十年里,基于分类编址进行地址分配和路由IP数据包的设计就已明显表现出可扩充性不足的问题(参见RFC 1517)。为了解决这个问题,互联网工程工作小组在1993年发布了一系列的标准——RFC 1518和RFC 1519,以定义新的分配IP地址块和路由IPv4数据包的方法。无类别域间路由(Classless Inter-Domain Routing,CIDR)是一个IP地址归类方法,用于给用户分配IP地址以及在互联网上有效地路由IP数据包。CIDR用13~27位长的前缀取代了原来地址结构对地址网络部分的限制,一个IP地址包含两部分:标识网络的前缀和紧接着的在这个网络内的主机地址。以地址222.80.18.18/25为例,其中“/25”表示其前面地址中的前25位代表网络部分,其余位代表主机部分。
在管理员能分配的地址块中,主机数量范围是32~500 000,从而能更好地满足机构对地址的特殊需求。另外,将多个连续的前缀聚合起来,在总体上可以减少路由表的表项数目。
2. 端口号
网络层IP地址用来寻址指定的计算机或者网络设备,而传输层的端口号用来确定运行在目的设备上的应用程序。端口号是16位的,范围在0~65 535之间。在设备上寻址端口号时经常使用的形式是“IP:端口号”,通信的两端都要使用端口号来唯一标识其主机内运行的特定应用程序。
许多公共服务都使用固定的端口号,例如万维网(World Wide Web,WWW)服务器默认使用的端口号是80,FTP服务器使用的端口号是21,SMTP服务器使用的端口号是25等。自定义的服务一般使用高于1024的端口号。
3. 名称解析
在一个基于TCP/IP的网络中,IP地址被用来唯一标识网络上的一台计算机。如果某台计算机想访问网络中的其他计算机,首先必须知道目标计算机的IP地址,然后使用该IP地址与其通信。
但在实际应用中,用户很少直接使用IP地址来访问网络中的资源,而是习惯使用便于记忆的计算机名或域名。比如当用户在浏览器地址栏中输入“http://www.test.com”想要访问网络中的某台服务器时,客户计算机必须通过一个地址转换过程,将该域名转换成该服务器的IP地址,这个名称转换过程是通过名称解析服务完成的。
名称解析服务可以访问广泛来源的信息,两种主要的来源分别是:域名系统(Domain Name System,DNS)和本地配置数据库(一般是操作系统中用于本地名称与IP地址映射的特殊机制,如Windows系统中的NetBIOS解析)。
4. 网络地址转换
IP地址是短缺的资源,对于整个Internet来说,长期的解决方案是迁移到IPv6,这个转化正在慢慢进行,但是要想真正完成需要经过很多年的时间。这样,人们必须找到一个快速的、能够马上投入使用的解决方法。网络地址转换(Network Address Translation,NAT)是接入广域网(WAN)的一种技术,能够将私有(保留)地址转化为合法的IP地址,它被广泛应用于各种Internet接入方式和各种类型的网络中。NAT不仅完美地解决了IP地址不足的问题,而且还能够有效地避免来自网络外部的攻击,隐藏并保护网络内部的计算机。
NAT的实现方式有三种,即静态转换、动态转换和端口多路复用。
静态转换是指将内部网络的私有IP地址转换为公有IP地址时,IP地址对是一对一的,是一成不变的,某个私有IP地址只转换为某个公有IP地址。借助于静态转换,可以实现外部网络对内部网络中某些特定设备(如服务器)的访问。
动态转换是指将内部网络的私有IP地址转换为公用IP地址时,IP地址是不确定的,是随机的,所有被授权访问Internet的私有IP地址都可随机转换为任何指定的合法IP地址。也就是说,只要指定哪些内部地址可以进行转换,以及用哪些合法地址作为外部地址,就可以进行动态转换。动态转换可以使用多个合法外部地址集。当ISP提供的合法IP地址略少于网络内部的计算机数量,可以采用动态转换的方式。
端口多路复用是指改变外出数据包的源端口并进行端口地址转换(Port Address Translation,PAT)。内部网络的所有主机均可共享一个合法外部IP地址实现对Internet的访问,从而可以最大限度地节约IP地址资源。同时,又可隐藏网络内部的所有主机,有效避免来自Internet的攻击。因此,目前网络中应用最多的就是端口多路复用方式。
NAT有效解决了IP地址短缺的问题,但是它也带来了一些新的问题,使得开发点对点通信应用程序会有很多附加的考虑,主要体现在:
处于NAT后面的主机不能充当服务器直接接收外部主机的连接请求,必须对NAT设备进行相应的配置才能完成外部地址与内部服务器地址的映射。
处于不同NAT之后的两台主机无法建立直接的UDP或TCP连接,必须使用中介服务器来帮助它们完成初始化的工作。
1.2分布式网络应用程序
随着计算机技术的发展和应用的深入,分布式网络应用程序在构建企业级的应用中更加流行。这类程序的主要特点是:
分布式网络应用程序将整个应用程序的处理分成几个部分,分别在不同的机器上运行,这里的“分布”包含两层含义:地理上的分布和数据处理的分布。
多台主机之间交互协作,共同完成一个任务。
就网络访问而言,分布式应用对用户来说是透明的,其目标在于提供一个环境,该环境隐藏了计算机和服务的地理位置,使它们看上去就像在本地一样。
从应用场合来看,分布式网络应用程序大致可分为以下五类:
1)远程控制类应用程序。远程控制类应用程序的目的是远程操作对方主机的行为。其主要工作过程是:程序与远程主机建立会话,根据控制需求,传送命令,使用统一的操作界面操控多台主机。典型的应用有远程协助、木马远程监控等。
2)网络探测类应用程序。网络探测类应用程序的目的是通过灵活的探测包构造能力获得期望的探测结果。其主要工作过程是:选择较低层的网络编程接口,根据探测需求,构造特殊请求,对探测目标进行各类请求的发送,接收并分析响应,给出探测结论。典型的应用有端口扫描、操作系统探测、网络爬虫等。
3)网络管理类应用程序。网络管理类应用程序的目的是对网络数据和网络设备进行监管,发现异常,限制应用等。其主要工作过程是:根据网络管理需求,选择合适的网络编程接口,使用特定的网络管理协议进行设备的状态监控,或通过强大的流量分析能力对网络进出流量进行监控。典型的应用有网络管理、上网监控、网络流量分析、入侵检测等。
4)远程通信类应用程序。远程通信类应用程序的目的在于提供用户间的各类通信渠道。其主要工作过程是:根据通信需求,选择合适的通信模型,为文字聊天、文件传输、语音视频等用户应用设计稳定可靠的传输通道。典型的应用有即时通信、电子邮件客户端、联机游戏等。
5)信息发布类应用程序。信息发布类应用程序的目的在于发布信息。其主要工作过程是:在公开知名的地址上开放服务,等待用户的信息查询和发布请求,提供有效的信息展示能力。典型的应用有WWW服务器、FTP服务器、Whois服务器等。
1.3网络编程方法纵览
根据实际工作的具体需求,实现网络程序设计的方法很多,如套接字编程、基于NDIS的编程、Web网站开发等等。每一种编程方法都可以实现数据的传输,但不同方法的工作机制差别很大,其实现能力也有很大差别。在实际运用中需要首先明确这些方法的工作层次和特点,然后选择适合的编程方法。从网络数据的内容来看,不同的编程方法可操控的数据可以是链路层上的帧、网络层上的数据包、传输层上的数据段或应用层上的消息流。以下参考操控网络数据的层次分别阐述常用的网络编程方法。
1.3.1面向应用的网络编程方法
在应用层上有大量针对具体应用、特定协议的网络应用程序编程方法,这些方法屏蔽了大量网络操作的细节,提供简单的接口用于访问应用程序中的数据流。面向应用的网络编程方法主要有以下几种。
(1)WinInet编程
WinInet编程面向Internet常用协议中消息流的访问,这些协议包括HTTP协议、FTP协议和Gopher文件传输协议。WinInet函数的语法与常用的Win32 API函数的语法类似,这使得使用这些协议就像使用本地硬盘上的文件一样容易。
(2)基于WWW应用的网络编程
WWW又称为万维网或Web,WWW应用是Internet上最广泛的应用。它用HTML来表达信息,用超链接将全世界的网站连成一个整体,用浏览器这种统一的形式来浏览,为人们提供了一个图文并茂的多媒体信息世界。WWW已经深入应用到各行各业。无论是电子商务、电子政务、数字企业、数字校园,还是各种基于WWW的信息处理系统、信息发布系统和远程教育系统,都采用了网站的形式。这种巨大的需求催生了各种基于WWW应用的网络编程技术,主要包括网页制作工具(如Frontpage、Dreamweaver、Flash和Firework等)、动态服务器页面的制作技术(如ASP、JSP和PHP等)。
(3)面向SOA的Web Service网络编程
随着业务应用程序对业务需求的灵活性要求逐步提高,传统紧耦合的面向对象模型已不再适合,面向服务的体系架构(Service-Oriented Architecture,SOA)可以根据需求通过网络对松散耦合的粗粒度应用组件进行分布式部署、组合和使用。在SOA方式下,服务之间通过简单、精确定义的接口进行通信,不涉及底层编程接口和通信模型。SOA可以看作是B/S模型、XML/Web Service技术之后的自然延伸。
Web Service是一种常见的SOA的实现方式,是松散耦合的可复用的软件模块。Web Service完全基于XML(可扩展标记语言)、XSD(XML Schema)等独立于平台和软件供应商的标准,是创建可互操作的、分布式应用程序的新平台。
在Internet上发布后,Web Service能够通过标准协议在程序中访问。在谷歌、新浪微博等传统WWW应用平台下已发布了大量通过Web Service可远程访问的公共API访问接口,尤其是在云计算方兴未艾的趋势下,越来越多的程序需要跨平台交互,基于Web Service的网络程序设计将得到越来越广泛的应用。
1.3.2基于TCP/IP协议栈的网络编程方法
基于TCP/IP协议栈的网络编程是最基本的网络编程方式,主要是使用各种编程语言,利用操作系统提供的套接字网络编程接口,直接开发各种网络应用程序。在套接字通信中,常用套接字类型包括三类:流式套接字(用于在传输层提供面向连接、可靠的数据传输服务)、数据报套接字(用于在传输层提供无连接的数据传输服务)和原始套接字(用于网络层上的数据包访问)。
这种编程方式由于直接利用网络协议栈提供的服务来实现网络应用,所以层次比较低,编程者有较大的自由度。这种编程要求程序设计者深入了解TCP/IP的相关知识,掌握套接字编程接口的主要功能和使用方法。
1.3.3面向原始帧的网络编程方法
在网络上直接发送和接收数据帧是最原始的数据访问方式。在这个层面上,程序员能够控制网卡的工作模式,灵活地访问帧中的各个字段。然而,这种灵活性也增加了程序设计的复杂性,要求程序员深入掌握操作系统底层的驱动原理,并具备较强的编程能力。面向原始帧的网络编程方法主要有以下几种。
(1)直接网卡编程技术
在OSI/RM模型中,物理层和数据链路层的主要功能一般由硬件——网络适配器(网络接口卡或网卡)来完成,每个工作站都安装有一个或多个网卡,每个网卡上都有自己的控制器,用以确定何时发送数据,何时从网络上接收数据,并负责执行网络协议所规定的规程,如构成帧、计算帧检验序列、执行编码译码转换等。
对于不同的网络芯片,其编程方法略有区别,但原理相似,多使用汇编语言,通过操纵网卡寄存器实现对网卡微处理器的控制,完成数据帧的发送与接收。
直接网卡编程为用户提供了直接控制网卡工作的能力,速度很快。但是这种编程方法比较抽象,要求编程人员具有一定的汇编语言基础,且由于不同厂商的网卡之间有很大的差异,程序的通用性较差。
(2)基于Packet Driver的网络编程方法
为了屏蔽网络适配器的内部实现细节,使用户与网卡之间的通信更为方便,几乎所有的网卡生产厂家都提供相应的网卡驱动程序,其中包含了Packet Driver编程接口,由它来屏蔽网卡的具体工作细节,在上层应用软件和底层的网卡驱动程序之间提供一个接口。
使用Packet Driver不用针对网卡硬件编程,使用较为方便,且Packet Driver作为一个网络编程标准,适用于所有网卡。
(3)基于NDIS的网络编程
网络驱动程序接口规范(Network Driver Interface Specification,NDIS)是一个较为成熟的驱动接口标准,它包含局域网网卡驱动程序标准、广域网网卡驱动程序标准以及存在于协议和网络之间的中间驱动程序标准。它为网络驱动抽象了网络硬件,指定了分层网络驱动间的标准接口,因此,它为上层驱动(如网络传输)抽象了管理硬件的下层驱动。同时NDIS也维护了网络驱动的状态信息和参数,这包括到函数的指针、句柄等。
NDIS在网络编程中占据着重要的地位,许多编程方法都是基于NDIS实现的。
(4)WinPcap编程
WinPcap是一个Windows平台下访问网络中数据链路层的开源库,能够用于捕获网络数据包并进行分析。
WinPcap为程序员提供了一套标准的网络数据包捕获接口,包括了一个内核级的数据包过滤器,一个低层的动态链接库(Packet.dll),一个高层的依赖于系统的库(wpcap.dll)。它可以独立于TCP/IP协议栈进行原始数据包的发送和接收,主要提供了直接在网卡上捕获原始数据包、核心层数据包过滤、通过网卡直接发送原始数据包和网络流量统计等功能。
目前WinPcap已经达到了工业标准的应用要求,是非常成熟、实用的捕获与分析网络数据包的技术框架。
习题
1. TCP/IP协议栈的五个层次是什么?在这些层次中,每层的主要任务是什么?
2. 请分析路由器、链路层交换机和主机分别处理TCP/IP协议栈中的哪些层次。
3. 请阐述NAT技术的主要实现方式,并思考NAT技术对网络应用程序的使用带来哪些影响。
4. 某业务要求实现一个局域网上网行为监控的软件,能够对局域网内用户的上网行为(包括访问站点、使用聊天工具、发布言论等)进行截获和分析,请选择一个合适的网络程序设计方法,并说明该软件设计的主要流程。