《网络应用程序设计》课件第1章 网络编程概述_第1页
《网络应用程序设计》课件第1章 网络编程概述_第2页
《网络应用程序设计》课件第1章 网络编程概述_第3页
《网络应用程序设计》课件第1章 网络编程概述_第4页
《网络应用程序设计》课件第1章 网络编程概述_第5页
已阅读5页,还剩130页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第1章网络编程概述1.1计算机网络概述1.2网络模型

1.3网络协议1.4网络编程模式与编程接口1.5服务方式1.6编程基础习题1.1计算机网络概述

随着计算机技术的发展,以计算机为主体的各种远程信息处理技术应运而生,计算机与通信的结合也日益紧密。计算机网络就是计算机科学和通信科学密切结合的产物。20世纪60年代初建立的美国航空公司飞机订票系统SABRE-1,是由一台大型计算机和遍布美国约2000多台终端组成的联机终端网络。到1969年,美国国防部高级计划研究局研制的ARPA网正式开通,体现了计算机和通信的深度结合,也是计算机网络发展的里程碑。

计算机网络属于多机系统的范畴,它代表着当前计算机体系结构发展的一个重要方向。就通信学科的通信技术演变而言,计算机技术的应用是通信技术的基础。计算机在通信中的应用使数据通信和数字通信等新的通信技术和应用领域相继出现,并随计算机技术的发展而迅速发展。数据通信是继电报、电话之后的一种重要的通信方式。综合业务数字网(ISDN)已成为网络发展的重要方向。 20世纪70年代末到80年代初,微型计算机有了突破性的进展。大量的微型计算机涌向社会,渗透到社会生活的各个方面。由于微型计算机有限的资源和较低的处理能力限制,加速了微机局域网的发展。局域计算机网络又推动了办公自动化系统、工厂自动化系统及实验室自动化系统的发展。局域计算机网络是继广域计算机网络发展之后又一个新的计算机领域。广域计算机网络和局域计算机网络互连,就会形成局部处理和远程处理,有限地域范围的资源共享和广大地域范围的资源共享相结合的网际网络。例如,美国ARPA网连接了1000多个广域网和局域网,形成了范围广泛的远程处理和局部处理相结合的庞大的网际网系统。

计算机网络的发展在计算机学科上有着重要的意义,特别是对计算机的系统结构有较大影响。计算机网络是一门综合性学科,它进一步扩大了计算机的应用范围,促进了包括计算机技术、通信技术在内的各个领域的飞速发展。计算机网络经历了一个从简单到复杂,由低级到高级的发展过程。这个过程可分为三个阶段。 1.以单计算机为中心的联机网络 早期计算机昂贵,只有数目有限的计算中心才拥有,而通信线路和通信设备使用的价格较便宜。为了共享主机资源,及时进行信息的采集和处理,计算机内部增加了通信功能,使远处的输入/输出设备通过通信线路直接和计算机相连,形成了联机终端网络这一主要的系统结构形式,如图1-1所示。图中HOST代表主机,T代表终端,RLC代表远程线路集中器。这种以单计算机为中心的联机网络称为第一代网络,是由单用户独占一个系统发展到分时多用户系统的。图1-1单处理机联机系统结构图

上述联机终端网络存在如下缺点:

(1)主机既要承担通信工作,又要承担数据处理,所以它负荷重、效率低。

(2)通信线路利用率低,特别是在终端远离主机时,分散的终端都要单独占用一条通信线路,费用高。 为了改正以上缺点,在主机和通信线路之间设置前置机来专门处理与终端的通信,将通信功能从主机中分离出来,使主机能集中更多的时间进行数据处理。在终端集中的区域设置集中器,大量终端先通过低速线路连到集中器上,集中器则通过高速线路与主机相连,如图1-2所示。图1-2具有前置处理机的系统结构图

2.计算机-计算机网络 计算机技术的发展和通信技术的进步使得多个单处理机联机终端网络可互连起来,形成多处理机为中心的网络。 利用通信线路将多个计算机连接起来一般有两种形式:第一种是通过通信线路将主计算机互连起来,主机承担数据处理和通信工作;第二种是设置通信控制处理机(CCP,CommunicationControlProcessor),主机间的通信通过CCP的中继功能间接进行,把通信从主机中分离出来。由CCP组成的传输网络称通信子网,如图1-3所示。图1-3具有通信子网的计算机网络

通信子网规模进一步扩大成为社会公用的数据通信网,如图1-4所示。这种网络具有以下优点:允许异种机入网,兼容性好,通信线路利用率高。广域网及国家级的计算机网络大多采用这种形式。图1-4具有公用数据通信网的计算机网络

3.体系结构标准化网络 随着诸多网络的出现,为了使网络的系统软件、网络硬件具有通用性,网络呈现了标准化发展的趋势。按体系结构标准化形成的网络称为第三代网络。

1)各计算机制造商网络体系结构标准化

1974年,IBM公司首先提出了完整的计算机网络体系标准化的概念,宣布了SNA(SystemNetworkArchitecture)标准,并以该标准建立网络,称为SNA网。随后,DEC公司公布了DNA(数字网络系统结构),Unive公司公布了DCA(数据通信体系结构),宝来公司公布了BNA(宝来网络体系结构)等。 2)国际体系结构标准化

1979年,国际标准化组织(ISO)成立了TC97(计算机与信息处理标准化委员会)下属的SC16(开放系统互连分技术委员会),制定了“开放系统互连参考模型(OSI)”,以便于异种计算机互连构成网络。1980年,美国电子电气工程师协会成立IEEE802局域标准委员会,制定了IEEE802标准,使局域网的发展走向标准化。1.2网络模型

1.2.1ISO/OSI网络体系结构研究方法 世界上不同年代、不同厂家、不同型号的计算机系统千差万别,将这些系统互连起来就要彼此开放。所谓开放系统,就是遵守互连标准协议的实系统。实系统是指一台或多台计算机、有关软件、终端、操作员、物理过程和信息处理手段等的集合,是传送和处理信息的自治整体。采用抽取实际系统中涉及互连的公共特性构成的模型系统,然后研究这些模型系统,即开放系统互连的标准。这样就避免了涉及具体机型和技术的实现细节,还避免了技术的进步对互连标准的影响。所谓模型化的方法,就是用功能上等价的开放系统模型代替实际开放系统。

模型化的方法按两步进行。第一步研究开放式系统的基本成分和涉及它们的组织及功能,构造开放系统互连的顺序式的七层模型,即应用层、表示层、会话层、传输层、网络层、数据链路层和物理层;第二步在七层模型的框架内详细和精确地描述抽象开放系统的功能,构成开放系统互连的服务和协议。ISO/OSI七层模型、协议和接口如图1-5所示。图1-5ISO/OSI七层参考模型、协议和接口

1.2.2ISO/OSI参考模型

1.分层的优点

OSI参考模型是按分层的原则制定的,分层的概念在一些已有的通信协议中采用,OSI继承了各种标准的这一特点,并把分层做得更加细致、合理。分层化的方法,为网络通信设计带来如下好处:

(1)简化了网络通信设计的复杂性。网络通信是非常复杂的一个过程,把整个过程划分为数个功能层次,这样一来使得整个结构功能完整,层间分工清晰,层内功能单一且易于实现,使整个系统的实现成为简单化的可行过程,方便了设计。

(2)根据所完成的处理或技术上明显的不同来划分层次,每一层的功能是固定的和具体的,要求也比较明确。不同的网络可以根据自己具体的条件,采用不同的方法去实现某一层的功能。虽然采用的方法各异,但只要符合协议标准要求,各系统或终端就可以连接起来进行通信。

(3)由于采用了分层技术,在结构、硬件或软件方面出现了某些新技术或新方法的时候,很容易对某一层进行更新,以新的方法,新的技术取代老的方法与技术,易于实现技术的更新换代。

2.分层的原则 在分层工作中必须解决把一个复杂的通信过程分成几层,如何分层以及把层次的边界定在什么地方等问题。为解决上述问题,为分层工作提出了一些原则:

(1)对技术或处理上有明显不同的控制功能,应建立独立的层次来完成。

(2)对每一层建立它与相邻上、下层的边界及连接的接口。

(3)建立层次边界的地方应该是需要将相应接口标准化且通过边界的交互信息量最少的地方。

(4)对容易局部化的功能建立一层,以便将来出现新技术、新方法时使得该层可以整体地重新设计,而不改变相邻层之间的关系。 (5)允许在一个层内改变功能和协议,而不影响其他层。

(6)把功能相似的集中到同一层。

(7)对过去已被经验证明是成功的层应保留。

(8)在同一层内,根据通信服务需要,可建立若干功能子层。

3.OSI模型各层功能

(1)物理层,用来实现网内两实体间的物理连接,按比特串行传送数据信息。

(2)数据链路层,用以建立相邻结点之间的数据链路,传送按一定格式组织起来的比特信息,即数据帧。

(3)网络层,接收来自源机的报文,把它转换成报文分组(具有地址标识和网络协议信息的格式化信息组),送到指定的目标机。

(4)传输层,提供一种独立于通信子网的数据传输服务,在网内两实体间建立通信信道,用以传输信息。

(5)会话层,在两个合作的实体之间建立通信关系,组织和同步它们的会话,并为管理它们的数据交换提供必要的手段。

(6)表示层,处理实体在通信时或者要传送时引用信息的表示、进行转换,以消除网内实体间的语义差异。

(7)应用层,是OSI参考模型的最高层,负责两个应用进程之间的通信,为网络用户间的通信提供专用程序包。

4.层与层之间的关系 层与层之间的关系是上下连接的关系。下层对上层提供服务,每一层都利用下一层所提供的服务实现本层的功能,并为上层提供服务。信息传输在发送过程中是从高层到低层逐层传递的,在接收过程中则是从低层向高层传送的。1.3网络协议

1.3.1网络协议层次 首先介绍两个概念:服务和协议。在层次模型的描述中,服务是指相邻层次间下层向上层提供的一组操作,它定义的是对上层实现的特定功能。协议是指两个对等实体间同层次上进行通信时使用的规则。从这两个定义可以看出,协议可以通过协商而改变,但服务是不能变的。正如我们日常邮寄的信件,信封上寄件人和收件人地址的格式是可以改变的,这就可以看作邮局同用户协商的一组规则,但投递的服务是不会改变的,这就可以看作邮局提供的服务。

根据OSI参考模型定义的网络层次,不同层上都定义了不同的协议,下面介绍几个重要的通信协议: ●TCP/IP:传输控制协议/互联网协议,通常被称为TCP/IP协议簇。它使用了OSI参考模型中的五层,其中包含的协议以及与OSI参考模型的对比如图1-6所示。图1-6TCP/IP与OSI参考模型的对比

● TCP:传输控制协议。它是面向连接的全双工协议。 ● IP:互联网协议。它是无连接的,负责数据包的发送。 ● UDP:用户数据报协议。提供非可靠数据报服务的无连接协议。 ● DNS:域名系统。它是用分布式数据库实现的命名系统。 ● NFS:网络文件系统。在不同的系统间达到文件共享的系统。 ● SNMP:简单网络管理协议。 ● TFTP:简单文件传输协议。 ● FTP:文件传输协议。 ● POP:邮局协议。 ● SMTP:简单邮件传输协议。它只是完成通过一条链路传递消息的工作。 ● Telnet:远程登录协议。 1.3.2TCP/IP协议簇

TCP/IP协议最初是用来支持计算机和ARPANET网络之间通信的。WorldWideWeb使用的也是TCP/IP协议。在UNIX系统中,首先带有网络功能的版本是4.3BSD。Linux系统的网络功能就是以UNIX4.3BSD为模型发展起来的,它支持BSD套接字和全部的TCP/IP功能。下面讨论一下Linux系统是如何支持TCP/IP协议的。 图1-7描述了TCP/IP协议簇中的TCP、UDP、IP、ICMP协议同应用程序之间的关系。我们从应用程序开发的角度出发,讨论这几个协议的特性,重点讨论TCP、UDP协议为应用程序提供的服务。图1-7TCP/IP协议 1.Internet协议(IP)

网际协议IP是TCP/IP的核心协议,也是网络层中最重要的协议。IP层接收由更低层(网络接口层,例如以太网设备驱动程序)发来的数据包,并把该数据包发送到TCP层或UDP层;同时,IP层也把从TCP或UDP层接收来的数据包传送到更低层。IP协议为高层提供了一种面向无连接的、不可靠的数据报传输服务,因为IP协议并没有采取任何措施确认数据包是否按顺序发送、有没有被破坏。IP数据包中含有发送它的主机的地址(源地址)和接收它的主机的地址(目的地址)。高层的TCP和UDP服务在接收数据包时,通常假设包中的源地址是有效的。IP地址是许多高层服务的认证基础,这些服务相信数据包是从一个有效的主机发送来的。 2.Internet消息控制协议(ICMP) ICMP与IP位于同一层,它被用来传送IP的控制信息。ICMP数据包被封装在IP数据包的数据部分中进行传输,如果发送IP数据包时发生错误,路由器使用ICMP协议来报告错误消息,同时也传送控制消息。PING是最常用的基于ICMP的服务。 如图1-8所示,一个完整的ICMP数据报文包括IP首部、ICMP类型、ICMP代码、ICMP校验和、ICMP数据内容。ICMP协议通过类型、代码的不同组合来表达不同的消息,表1-1显示了常用的数据报文的含义。图1-8ICMP数据报文格式

表1-1常用的ICMP数据报文

3.Internet组管理协议(IGMP)

多播路由器使用IGMP协议来查询多播组内有哪些主机,主机则在加入和退出多播组时使用IGMP协议向路由器发出通告,或者使用IGMP协议响应多播路由器的查询。 与ICMP协议类似,IGMP数据包也是嵌入在IP数据包内进行传输的。IGMP分为三个版本:IGMPv1、IGMPv2和IGMPv3,这几种版本的具体格式如图1-9和图1-10所示,括号内数字表示位数。 IGMPv1数据成员的含义分别是:版本,表示版本号;类型,为1时表明是由多播路由器发出的查询报文,为2时表明是主机发出的报告报文;校验和,与ICMP的校验和作用相同;组地址,为D类IP地址。在查询报文中组地址设置为0,在报告报文中组地址为要参加的组地址。IGMPv2将IGMPv1中的版本和类型合为一种数据成员,含义未变;最大响应时间只在查询报文中有效,默认值是10 s。图1-9IGMPv1和IGMPv2数据包格式

图1-10IGMPv3数据包格式

采用IGMPv1时,主机离开多播组时不发出信息,路由器使用基于超时机制去发现组成员的退出;采用IGMPv2时,主机离开多播组时可发出离开信息,路由器能够迅速发现组成成员终止的情况,这对于高带宽组播组或易变型组播组成员具有重要意义。

IGMPv3中的S位表示禁止路由器端处理,QRV表示查询者鲁棒性变量,与定时及重新发送次数有关,QQIC表示查询者的查询间隔代码。

与前两种版本相比,IGMPv3允许主机接收的特定主机的数据流,来自网络中其他主机的数据流可以被隔离。IGMPv3也支持主机阻止那些来自于非要求的主机发送的数据流。 对IGMP协议来说,存在两个特殊的IP地址:和,前者表示“所有主机”,后者表示“所有路由器”。路由器在查询组成员时使用,并将IGMP数据包的组地址设为零,然后发出查询数据包。如果有主机是某个组的成员,那么它收到查询数据包后,就会将一个主机成员资格报告反馈给“所有路由器()”。当某个进程加入了一个多播组后,也使用地址向本地网络的每个路由器都发出通告。

IGMP协议常用的几种数据类型及含义如表1-2所示。表1-2常用的IGMP协议数据类型 4.用户数据报协议(UDP) UDP与TCP位于同一层,UDP协议建立在IP协议的基础上,和IP协议一样,提供非面向连接的和不可靠的数据报服务。因此,UDP不被应用于那些使用虚电路的面向连接的服务,主要用于那些面向查询/应答的服务,例如NFS,这些服务需要交换的信息量较少,而建立连接的开销相对较大。

UDP协议是非面向连接的协议,因此,对服务器而言,每个客户机的请求都是独立的,服务器无法区分同一个客户机的连续两个请求的先后次序;同样,对客户机而言,每个服务器的应答都是独立的,客户机无法指望先提出的请求最先得到应答。

为了标识通信进程,UDP协议增加了端口号的概念,不同的进程使用不同的端口,每个端口有一个惟一的整数标识。端口号分为公认端口和自由端口号两种,一般地,服务器使用公认端口号来提供服务,客户机使用自由端口号与服务器通信。小于1024的端口号被用做保留端口号,常被用来提供公共服务。例如HTTP服务的标准端口号是80,FTP的标准端口号是21。 5.TCP协议

1)协议描述

TCP协议为互连网络提供虚电路服务,它面向连接,提供可靠、双向、有序、无重复的数据流服务。因此,TCP协议应能够解决网络通信中的数据丢失、重复、出错、无序等问题。在数据传输的过程中,TCP协议根据接收方所能接收信息的最大发送速度传输数据,并以接收方所能接受的最大发送长度把用户数据分段发送。

(1)通信之前,必须先建立一条连接;通信结束,应该断开连接。

(2)用确认和超时重传保证通信的可靠性。 (3)用序列号保持字节流的顺序;为每个要发送的字节数据分配一个序列号,并将起始序列号通知对方。

(4)提供流量控制,接收方总是把它能接收的数据量告诉对方,设置了一个大小可变的接收窗口。窗口大小在确认数据段中,通知对方,发送方据此发送数据。

(5)全双工信道。

(6) TCP不支持多点播送或广播。

TCP的数据段是以IP包的方式在Internet上传输的。TCP数据段由TCP的头部和应用层提供的待传输的数据构成。TCP的数据包格式如图1-11所示。图1-11TCP的数据包格式

其中: 源端口:标识发送TCP数据段的进程。 目的端口:标识接收TCP数据段的进程。 序列号:这个数据段所包含的数据字节的开始序列号。 确认序列号:发送这个数据段的进程期望接收的数据字节的开始序列号,即已经接收的数据字节的最大序列号加l。数据段首部长度(HLEN):这个长度以4字节(32位)为单位。TCP数据段首部包括固定和变长两部分,固定部分的长度为20字节,变长部分也含多个TCP选项,长度可变。 码位:不同的标识如下: ● URG(urgent)位:如果使用紧急数据指针,则将这一位设置成1。

● ACK(acknowledge)位:如果确认序列号有效,则将这一位设置成1。 ●PSH(push)位:表示“推”数据,如果这一位设置成1,则表示希望接收方在接收到这个数据段之后,立即将它传送给高层应用程序,而不是缓存起来。 ● RST(reset)位:表示请求重置连接。当TCP协议接收到一个不能处理的数据段时,向对方TCP协议发送这种数据段,表示这个数据段所标识的连接出现了某种错误,请求对方TCP协议将这个连接清除。

● SYN(synchronize)位:请求建立连接。TCP用这种数据段向对方TCP协议请求建立连接。在这个数据段中,TCP协议将它选择的初始序列号通知对方,并且与对方协议协商最大数据段的大小。SYN数据段的序列号为初始序列号,这个SYN数据段能够被确认。当协议接收到对方这个数据段的确认之后,建立TCP连接。 紧急指针:如果设置了紧急指针位(URG),这个域指出紧急数据相对于这个数据段的开始序列号的偏移量。TCP协议只提供一字节的紧急数据,但由于历史原因,紧急指针指向紧急数据的下一个字节位置。

选项:TCP协议可以提供其他功能。常用的选项有:①

最大数据段大小(MSS,MaximumSegmentSize)选项,在SYN数据段中,TCP协议可以指定它的最大数据段大小,在建立连接时,通信双方分别宣布他们的最大数据段大小,两者中的较小者为最后确定的最大数据段大小;②

窗口大小比例,默认情况下,窗口最大为65 535字节,对于高速网络,这个数值过小,影响传输性能,为了解决这个问题,TCP协议使用这个选项指定窗口大小的比例,当设置这个选项的值为N时,将窗口的大小扩大2N倍。 2)建立连接

TCP连接的建立需要连接的双方发送自己的同步SYN信息给对方,在SYN中也包含了末端初始的数据序号,并且需要收到对方对自身发出SYN的确认。一个典型的TCP连接建立的过程如下,A和B分别表示连接的双方:

(1)A→BSYNmysequencenumberisX。

(2)A←BACKyoursequencenumberisX。

(3)A←BSYNmysequencenumberisY。

(4)A→BACKyoursequencenumberisY。

通常是一端发出TCP连接请求,然后另一端做出响应。最后两端都收到对方的请求和对自身SYN的确认,连接就建立了。由于(2)和(3)可以使用数据回带技术,所以这个过程被称为“三次握手”,实际上这个过程传递了四个信息。图1-12和图1-13可以帮助我们更好地理解TCP连接的建立过程。其中,CR代表ConnectionRequest(连接请求),ACC代表ConnectionAccepted(接受连接)。图1-12TCP连接的建立

图1-13采用三次握手方法建立的三种情况正常操作;(b)重复的CR突然出现;(c)重复的CR和重复的ACK(确认) 3)标识一条连接 在多任务操作系统中,系统允许多个进程同时使用TCP协议进行通信,因此,仅用主机的IP地址来标识连接双方的进程是不够的。所以,不能够区分不同进程所对应的不同连接,TCP协议使用端口来区分这些不同的通信进程。

TCP协议中,使用四个信息完全标识一条连接:{本地IP地址、本地端口号、远地IP地址、远地端口号}。连接一端的IP地址和端口号组成了一个套接字(socket)的地址部分。连接双方的套接字组成一个套接字对,一个套接字对惟一地标识一条TCP连接。

图1-14给出了一个TCP连接的示意,一台客户机(IP地址为0)上的两个进程A和B,同时访问一台服务器(IP地址为)上的服务进程HTTP(端口号为80)。客户机上的两个进程的端口号分别为3526和3698,它们对应套接字的地址部分分别为0:3526和0:3698。这两个套接字的连接分别为:80::0:3526和:80::0:3698。可见这样IP地址加上端口号的表示方式可以将这两个连接区分开来。图1-14TCP连接标识1.4网络编程模式与编程接口

1.4.1客户机/服务器模式(C/S模式) 绝大多数网络应用的关系是属于客户/服务器(C/S,Client/Server)模型。这个模型包括三个部分:顾客、服务器和服务器提供的服务。 服务器是一个为应用提供服务的计算机。它一直等待着客户的请求以便为客户提供服务操作。客户机向服务器提出服务要求,并等待传回服务的结果。一般的服务有文件传送、电子邮件、远程登录以及把当天时间返回给客户进程等。 客户机/服务器的运行模式一般为服务器上的进程初始化,开始执行,并进入睡眠状态以等待客户进程的请求。在与网络服务器相连的系统上,某一客户进程正在执行。当需要服务器提供服务时,客户进程通过网络把服务请求送给服务器进程。服务器为客户服务,并回送结果。服务完之后,服务器又进入睡眠状态等待下一个客户请求。 服务器可以根据服务的方式分为两类: 第一类:重复服务器(iterativeserver),也称循环服务器,在同一个时刻只可以响应一个客户端的请求。这种服务器上的进程能够预知在短时间内可以处理完请求,便亲自处理它。例如,典型的服务是通报时间。

第二类:并发服务器(concurrentserver),在同一个时刻可以响应多个客户端的请求。这种服务器上的进程事先不能预知完成服务请求需要花多长时间,便以并发的方式处理它。并发服务器通过激活别的进程来完成服务请求,而本身转入睡眠状态以等待另一个请求的到来。典型的服务是处理文件信息,例如对文件的访问和打印文件。客户机与服务器不是永久不变的。当一台计算机提供文件传送服务时,这台计算机就是一个服务器;当一台计算机允许其用户访问另一台机器上提供的文件传送服务时,这台计算机就是一个客户机。

客户、服务器通信必须经过以下几个步骤:

(1)当客户提出服务请求时,必须为服务器提供传送地址。这就像打电话时,必须有对方的电话号码。

(2)在客户机想与服务器通信之前,服务器要能够获得确切的传送地址。 这里涉及两个概念,一个是传送地址,另一个是网络中数据的传送。为了获得传送地址,每个服务器均有一个名称,名称和传送地址有一个映射关系,有专用的名称到地址的映射机制,负责把服务器和服务的名称映射为服务器上服务处理程序的入口地址。

网络应用中数据的传递是由传送提供者完成的,传送提供者是一个能够接收网络信息并把它传送到远程机器上的软件。 在UNIX系统中,传送提供者是传输层协议的实现。UNIX系统有三种常用的传送提供者:TCP/IP、XNS以及OSI的传送协议。其中,最常用的是UNIX的TCP/IP。 1.4.2浏览器/服务器模式(B/S模式)

浏览器/服务器(B/S,Browser/Server)结构是随着Internet技术的兴起,对C/S结构的一种变化或者改进的结构。主要利用了不断成熟的WWW浏览器技术,结合浏览器的多种Script语言(VBScript、JavaScript等)和ActiveX技术,用通用浏览器就实现了原来需要复杂专用软件才能实现的强大功能,并节约了开发成本,是一种全新的软件系统构造技术。在这种结构下,用户界面完全通过WWW浏览器实现,主要事务逻辑在服务器端实现,一部分事务逻辑在前端实现。随着Windows98/Windows2000将浏览器技术植入操作系统内部,这种结构更成为当今应用软件的首选体系结构。显然,B/S结构应用程序相对于传统的C/S结构应用程序而言有着较大的进步。 B/S结构是真正的三层结构,它以访问Web数据库为中心,HTTP为传输协议,客户端通过浏览器(Browser)访问Web服务器和与其相连的后台数据库,我们称之为B/S模式。B/S模式三级结构组成如图1-15所示。图1-15B/S模式三级结构

图1-15中从左到右,分为三个层次: 第一层:客户端即浏览器,主要完成客户和后台的交互及最终查询结果的输出功能。在客户端向指定的Web服务器提出服务器请求,Web服务器用HTTP协议把所需文件资料传给用户,客户端接收并显示在WWW浏览器上。 第二层:Web服务器,是功能层,完成客户的应用功能,即Web服务器接受客户请求,并与后台数据库连接,进行申请处理,然后将处理结果返回Web服务器,再传至客户端; 第三层:数据库服务器,是数据层,数据库服务器应客户请求独立地进行各种处理。

与传统的C/S模式相比,B/S结构把处理功能全部移植到了服务器端,用户的请求通过浏览器发出,在使用和数据库维护上都比传统模式更加经济方便,而且使维护任务层次化:管理员负责服务器硬件的日常管理和维护,系统维护人员负责后台数据库的数据更新与维护。 由以上的比较分析可知,三层结构也可以理解为增加Web服务器的C/S模式。

不同于C/S模式,B/S模式具体有以下特点:

(1)硬件环境:B/S是建立在广域网之上的,不必是专门的网络硬件环境,例如电话上网,租用设备,信息自己管理,有比C/S更强的适应范围,一般只要有操作系统和浏览器即可。

(2)安全要求:B/S是建立在广域网之上的,对安全的控制能力相对较弱,面向的是不可知的用户群。 (3)程序架构:B/S对安全以及访问速度的多重考虑,建立在需要更加优化的基础之上。比C/S有更高的要求,B/S结构的程序架构是发展的趋势,从MS的.Net系列的BizTalk2000Exchange2000等全面支持网络的构件搭建的系统。SUN和IBM推出的JavaBean构件技术等,使B/S更加成熟。

(4)软件重用:B/S要求构件有相对独立的功能,能够被较好的重用。就如买来的餐桌可以再利用,而不是做在墙上的石头桌子。

(5)系统维护:B/S构件组成方面,在个别构件需要更换,实现系统的无缝升级时,用户从网上自己下载构件安装就可以实现升级,系统维护开销减到最小。

(6)处理问题:B/S建立在广域网上,面向不同的用户群,地域分散,这是C/S无法做到的,与操作系统平台关系最小。

(7)用户接口:B/S建立在浏览器上,

有更加丰富和生动的表现方式与用户交流,并且大部分难度减小,降低开发成本。

(8)信息流:B/S信息流向可变化,更像交易中心。采用B/S模式,突破传统的文件共享模式,为学科导航的设计提供新的解决方案。借助ASP的Web应用程序,用户通过Browser软件连接后台数据库并完成所做操作,将原有学科导航静态网页的形式升级到动态更新数据的方式。 B/S模式的学科导航,数据维护方便客户机无需专用的软件,有较好的网络扩展性,支持TCP/IP协议直接接入Internet。同时对于B/S模式而言,程序和数据的物理位置已经不再是那么重要了,访问者所关心的只是它们的URL。

(9)安全性能:防火墙技术可以保证后台数据库的安全性,如果结合Windows2000与InternetInformationServer的高度安全性,使用户可以实现系统的安全。 1.4.3编程接口 由于绝大多数计算机厂商,特别是工作站制造商如Sun等公司采用了BerkeleyUNIX,socket接口被广泛采用,以致于现在socket接口被广泛认可并成为了事实上的工业标准。目前的SYSV、BSD、OSF都将socket接口作为系统的一部分。当时,在设计如何支持TCP/IP协议时,有两种实现应用函数的方法,一种是直接支持TCP/IP协议的函数调用;另一种是支持一般网络协议的函数调用,而用参数来指定支持TCP/IP协议。Berkeley采用了后者,这样可以支持多协议簇,而将TCP/IP协议(PF_INET)作为协议簇之一。

关于应用程序接口(API),要对UNIX系统和Windows系统分别叙述。这两种操作系统的网络编程接口都叫做socket接口,但是,最早创造socket的是UNIX系统,Windows系统在UNIX的BSD基础上继承和发展了自己的socket,形成了Winsock。1.5服务方式

计算机网络是一个极为复杂的系统,为了减少设计的复杂程度,通常把计算机网络的功能分为若干层次,较高层次建立在较低层次的基础上,又为其更高层次提供服务功能。因此,每一层均向上一层提供服务。在这里主要介绍传输层给用户应用程序提供的服务。服务类型一般有面向连接、无连接、全双工及半双工、流控制、差错控制、字节流服务等。 1.面向连接的服务和无连接的服务

在网络中,主机与主机上的应用程序之间的通信一般有如下过程:源主机先与其通讯处理机通信,这个通讯处理机又和某个中间节点通信,再经过若干个中间节点,最后到达目的节点,目的节点再与目的主机通信。也就是说,由于通信子网的支持以及网络层向传输层提供的服务支持,主机才能够与主机通信。那么,什么样的服务来支持这种通信过程呢?一般有两种形式的服务类型:面向连接的服务及面向无连接的服务。 面向连接的服务要求在两个应用程序通信前,先建立两者之间的逻辑连接。对两个应用程序来说,数据的传输实际上是通过分组交换网络进行的,但在它们之间好像存在一条专用线路为之服务。面向连接的服务一般包括三个过程:建立连接、传输数据和断开连接。 面向无连接的服务也称数据报服务。数据报含有全称编址,独立地从一个系统传送到另一个系统,最终到达目的节点。这类服务不用事先建立逻辑连接,因此,也就不需要建立连接、传输数据和断开连接三个通信过程。

信息包在网络中传输,是否丢失用户是不知道的,而且,接收的顺序和发送的顺序不一定一样。所以,它提供不可靠的传输服务,由主机对信息包的传输提供差错、重复和丢失管理。这一点与信件投递服务相似。信件发出后,是独立投递的,收信人收到信件的顺序和发信人发信的顺序不一定一样。在投递的过程中是否丢失,邮局也无法知道。 2.全双工与半双工连接 半双工信道是指数据可以沿信道的两个方向传送,但在同一时刻,只能沿一个方向传送,如图1-16所示。全双工信道是指数据能沿信道的两个相反方向同时传输,如图1-17所示。半双工通信采用半双工信道,全双工通信采用全双工信道,例如TCP/IP协议是全双工通信。图1-16半双工通信

图1-17全双工通信

3.流控制 为了获得较高的信息传输速率,远距离的通信双方必须在收发数据的速度上保持一致,维持信息的发送方发送数据的速率与接收方处理数据的速率相协调,保证不丢失传送的数据,称为流控制。

4.差错控制

由于通信线路的固有特性,不可避免地要产生差错。差错控制保证接收方应用程序所收到的数据是无差错的。为了处理在网络中可能的数据丢失情况,发送方发送数据之后,启动计时器计数,如果在约定的时间段内还未收到接收方发回的应答信息,就认为该数据包已丢失,发送方重新发送该数据包。 5.字节流服务

字节流服务对数据流不提供任何记录边界划分,例如TCP/IP就是一个字节流协议。1.6编程基础

1.6.1Linux系统的基本术语

1.内核 内核就是操作系统,包括文件系统、存储管理、CPU调度以及I/O设备管理。一般内核直接同硬件打交道,但也可以通过另一个操作系统控制硬件。

2.进程

Linux操作系统是一个多任务操作系统,在其上设计的每一个程序,运行后都将成为一个独立的实体,称为进程。在UNIX中,产生一个新进程的途径是fork系统功能调用。进程的概念使得在同一时刻可以执行多个任务,一个程序也可以作为多个不同进程同时执行。进程由用户上下文、正文段、数据段、堆和内核上下文组成。 ●用户上下文:包含了用户模式下进程可访问的空间。

●正文段:包含了真正可执行的指令。

●数据段:指程序数据。

●堆:指可用来动态分配系统进程的数据空间。

●内核上下文:只能由内核维护和访问。它包含内核,跟踪进程运行以及挂起和重新唤醒进程所需要的信息。

3.系统调用

UNIX/Linux系统提供了多个可直接使用的内核服务入口。进程可以通过这些入口获得内核的服务,称这些入口的使用为系统调用。标准的

UNIX/LinuxC程序为每一个系统调用提供了一个接口,这样,对程序员来说,系统调用与普通的函数调用一样。 对于大多数函数调用来说,正确的系统功能调用返回大于等于0的值,出错调用返回-1。UNIX/Linux的C语言提供了一个整型的全局变量errno存放出错码。在<errno.h>头文件中保存了错误码值和错误名称。当系统调用出错时,通过errno查找出错类型,errno的值要在出错后才检查,因为成功通过的系统调用并不将它置为0值。 C系统调用和函数除了上述返回一个整型值表示调用成功与否外,还返回一个结构信息:如系统调用stat和fstate返回一个结构指针。 4.变元表

变元表是用来向执行的程序提供参数的,是一个指向字符串的指针数组。其长度可变,最大长度不应超过5120或10 240个字节。在C语言中变元表主要用argc,argv表示。

C语言的main函数格式为:

main(intargc,charargv[]) {

… }图1-18argv定义

其中,第一个变元argc指明有几个变元字符串,其值大于等于1,等于1是指这个程序的引用名。第二个变元argv是一个字符型的指针数组,它可以等价地定义为图1-18所示的结构。

argv的每一个指针指向一个变元字符串,argc指出argv的指针个数。main函数argc,argv参数根据需要可有可无。

变元表存放在进程的数据空间中,进程可以使用这些参数。当一个程序被激活时,通常把这些参数放进初始堆栈。下面说明它们的使用,程序名为example。

main(intargc,char*argv[ ]) { printf("argc:%d\n",argc);

printf("argv:%s",argv[0]);

}

运行结果:

argc:1 argv:example 5.环境表

在程序运行时,同接收变元表一样,也接收环境变量表。环境变量是指向字符串的指针阵列,其长度可变。由于环境变量表中的某几个元素未知,因此这个指针阵列由一个空指针结尾。环境变量表可以作为程序的第三个参数来访问。

main(intargc,char*argv[ ],char*envp[ ]) {

… }

下面的C程序给出所有环境字符的值。

main(intargc,char*argv[ ],char*envp[ ]) { intn;

printf("environmentparameters:\n");

for(n=0;envp[n]!=(char*)0;n++) printf("%s\n",envp[n]);

exit(0);

}

运行结果:

environmentparameters:

HOME=/usr1/xduser SHELL=/bin/csh TERM=att630 USER=xduser PATH=/usr1/xduser/bin:/usr/local/bin:/usr/ucb:/bin:/usr/bin EXINIT=setoptimizeredrawshell=/bin/csh

提供了一个外部变量environ,也可以用来访问环境表。用environ实现上述程序功能。 main(intargc,char*argv[]) { intn;

externchar**environ;

printf("environmentparameters:\n");

for(n=0;environ[n]!=(char*)0;n++) printf("%s\n",environ[n]);

exit(0);

}

除了main函数可以用于访问环境表,C库中的getenv函数也可以用来获取环境表中特定环境变量的指针值,当环境变量指针无定义时,返回空指针。例如,假定环境变量SHELL是有定义的,可以用下面的程序把它打印出来:

main( ) { char*str,*getenv( );

if((str=getenv("SHELL"))==(char*)0) printf("SHELLisnotdefined.\n");

else printf("SHELL=%s.\n",str);

exit(0);

}

环境变量指针与指针序列的值均存放在数据空间中,进程可以修改环境变量的值。当一个进程修改了它自己的环境后,对它的任何子进程都有影响,而对其父进程无影响。这是因为在该进程运行结束后,它的存储空间即被删除,操作系统只将其exit函数的八位参数传送给其父进程,与修改后的环境无关。

6.SHELL Linux提供了几种外壳程序以供选择。常用的有Bourne外壳(bsh)、C外壳(csh)和Korn外壳(ksh)。各个外壳都能提供基本的功能,又有其各自的特点。

SHELL也称外壳,是一个介于交互式用户和内核之间的程序。典型的SHELL是命令行翻译器,它从终端或文件中读入用户命令,解释并执行该命令。通常UNIXSHELL有三种形式:

(1) BourneSHELL:是使用最广泛的SHELL,以$为提示符,它的名字为sh。

(2) KornSHELL:是在BourneSHELL之上增加了一些新特性。

(3) CSHEL:是由加利福尼亚大学伯克利分校的BillJoy编写的。它能提供Bourne外壳所不能处理的用户交互特征,如命令补全、命令别名、历史命令替换等。C外壳的编程能力不如Bourne外壳,但它的语法和C语言类似,所以C程序员将会发现C外壳很顺手。tcsh是C外壳的增强版本,和C外壳完全兼容。 1.6.2标识符

1.进程标识(PID) Linux系统给每一个被创建的进程赋予一个标识符,该标识符为一个整数。进程可以通过系统调用getpid获得自己的进程标符pid:

intgetpid( ); 每个进程均有一个父进程,父进程也有相应的标识(PPID),进程标识是在子进程创建时由操作系统内核指定的。父进程标识可以通过

getppid系统调用获得: intgetppid( );

下列C程序可以打印出一个进程和它的父进程的标识:

main( ) { printf("processpid=%d,fatherprocesspid=%d\n",getpid( ), getppid( ));

exit(0);

}

运行结果:

processpid=2031,fatherprocesspid=345 Linux系统中的每一个进程都包括一个叫做task_struct的数据结构,而所有指向这些数据结构的指针组成系统中的一个进程向量数组。缺省情况下,系统的进程向量数组大小是512,这表示系统中同时最多容纳的进程为512个。每当一个新的进程创建时,一个新的task_struct结构将分配给该进程,并同时增加到进程向量数组中。系统还有一个当前进程指针,用来指向正在运行的进程。 2.用户标识符(ID)

每一个用户都有一个正整数作为它的标识,称为用户标识符。文件

/etc/passwd中存有每个注册用户的用户名以及与之对应的用户标识符。文件系统采用数值型的用户标识符来标识文件,即文件系统中用来记录文件的属主。进程利用getuid系统调用可以得到用户标识符。

unsignedshortgetuid( ); 每个进程还有一个有效用户标识符。它的值通常和用户标识符相同。但是,有的程序会在它执行时,把进程的有效用户标识符置为本文件主的用户标识符,这类程序被称为设置用户标识符程序。这样可以为用户提供一些权限。

通过系统调用geteuid可以获得进程的有效用户标识符:

unsignedshortgeteuid( );

3.组和组标识 组是用户的集合,几个用户在一起便构成了组,称这些用户为该组成员。每个组可以包含多个用户,而每个用户又可以属于多个组。通常,用户根据所需信息或执行的任务分组。 组的使用使得系统管理员便于管理网络。一个组具有某种文件的访问权限,该组中的所有用户都有这些权限。 1)用户组号(groupid)

每个进程均被指定一个正整数的小组号,称用户组号。它通常用来标识系统中属于同一管理部门或同一项目组的所有用户。属于同一管理部门或同一项目组的用户拥有相同的用户组号。在文件

/etc/group中保存有用户组名和用户组号之间的对应关系。 系统中的每个文件除拥有用户标识外,还记录文件主人的组号。进程可以利用系统调用getgid获得它的用户组号。利用用户标识和用户组号共同标识用户访问文件的权限:

unsignedshortgetgid( ); 2)有效用户组号

每个进程除拥有用户组号外,还有一个有效用户组号。一般有效用户组号的值与用户组号的值相同,但是,有的程序会在它执行时,把进程的有效用户组号置为本文件主的用户组号,这类程序称为“设置用户组号”程序,这样可以为用户提供一些权限。 通过系统调用getegid( )可以获得进程的有效用户组号:

unsignedshortgetegid( ); 4.进程组号

若干个进程可以属于同一进程组,进程组号就是用来标识这一组进程的。具有相同进程组号的进程被称为该进程组的成员。一个进程只有一个进程号,但它的进程组号可以不惟一。当一个进程的进程组号与其进程号相同时,则称该进程为进程组的组长。若进程组中没有这样的进程,则该组中任何进程可以是进程组长。进程组号的值为一正整数,可以通过系统调用

getpgrp获得:

intgetpgrp(intpid); 其中,pid为进程号。当pid为0时,返回当前进程的进程组号。

一个进程可以通过setpgrp系统调用来设置其进程组号,允许把进程组号设置为任意正整数值:

intsetpgrp(intpid,intpgrp); 其中,pid为进程号,pgrp为被设置的进程组号。当pid为0时,该命令作用于当前进程。

5.终端组号和控制终端

每个进程都可以是一个终端组成员,终端组号是一个正整数。终端组号是打开终端的进程组组长的进程号,通常情况下,该进程是注册进入UNIX系统的外壳进程,该进程被称为终端控制进程。每个终端只有一个控制进程。 终端组号用来标识一个进程组的控制终端。在控制终端按下某些键以及SHELL终止时发出信号。当一个既是终端组长又是终端控制进程的进程调用exit终止运行时,控制终端把挂起信号发送给进程组中的每个进程。控制终端可以被名为/dev/ftg的设备自动引用。若程序想要确定它是在读还是在写控制终端,而不管标准输入/输出怎样重定向,则它都可以打开和使用这个设备。 进程可以利用系统用

ioctl为它的控制终端设置或检查终端组号。 6.超级用户

Linux系统中的用户具有不同的权力范围,具有等级观念。用户标识为零的是超级用户,注册名一般是root,具有整个文件系统的访问权,并控制着整个系统的安全。

1.6.3文件

文件系统是一个网络的重要内容,网络操作是靠文件系统实现网络上各用户的数据共享、软件共享的。下面介绍它的有关定义和描述。 1.文件描述符

文件描述符是用来标识为I/O而打开的文件的,其值为一整数。一个进程能打开的文件数随系统而定,目前一个进程可打开20多个文件。许多UNIX系统指定标准输入、标准输出和标准差错,这三个文件的描述符为0、1和2。在系统调用open、create、duppipe和fcntl成功时,内核便为文件分配了文件描述符。

文件有多项属性,系统调用stat和fstat返回指定文件的各项属性,属性信息填在stat结构中。其调用格式为: #include<sys/types.h> #include<sys/stat.h> intstat(char*pathname,structstat*buf);

intfstat(intfildes,

structstat*buf); 如果系统设备调用成功,则返回0,否则返回-1。其中,stat的结构在文件<sys/stat.h>中定义为:

structstat { ushortst_mode;

/*

文件类型和文件访问允许权

*/ ino_tst_ino;

/* i_node号

*/ dev_tst_dev;

/*

含该文件入口路径的设备号

ID*/

shortst_nlink;

/*

链参数

*/ushortst_uid;

/*

用户标识

*/ushortst_gid;

/*

组号

*/dev_tst_rdev /*

设备号,用于字符或块文件

*/off_tst_size;

/*

文件的字节数

*/time_tst_atime;

/*

文件的最后访问时间

*/time_tst_mtime;

/*

文件的最后修改时间

*/time_tst_ctime;

/*

文件状态的最后更改时间

*/longst_blksize;/*

文件系统操作的最合适的块大小

*/longst_blocks;

/*

实际分配的块数

*/};

其中,st_mode域中包含了文件类型、文件的访问权限(9位)、设置用户标识(1位)、设置用户组号(1位)、粘着位(1位)。在st_mode中定义的标准文件类型有:

(1)普通文件:含有0到多个数据。

(2)目录:含其他文件的名字和i-节点号(i-节点号是一个含有文件在磁盘存储位置的数据结构)。

(3)特定字符文件和特定块文件:在UNIX系统中设备作为普通文件看待。对特定的设备用专门的文件处理方法。

(4)符号键:包含另一个文件路径名的文件,在4.3BSD中存在。

(5)管套:一种特殊文件类型。

在标题文件<sys/stat.h>中定义了下列码值来确定文件类型:

#defineS_IFMT 0170000 /*typeoffile*/ #defineS_IFDIR 0100000 /*regular*/ #defineS_IFCHR 0020000 /*characterspecial*/ #defineS_IFBLK 0060000

/*blockspecial*/ #defineS_IFLNK 0120000 /*symboliclinkBSDonly*/ #defineS_IFSOCK 0140000 /*socketBSDonly*/

下面程序根据命令行的参数打印出所确定的文件:

#include<sys/types.h> #include<sys/stat.h> main(argc,argv) intargc: char*argv[ ]:{

intn;

char*str;

structstatstatbuf;

for(n=1;n<argc;n++){printf("%s",argv[n]); /*

系统调用stat返回错误信息时调用了err_sgs函数。*/

if(stat(argv[n],&statbuf)<0) err_sys("fstaterror!");

switch(statbuf.st_mode&S_IFMT) { caseS_LFDIR:

str="directory";break;

caseS_IFCHR:

str="characterspecial";break;

caseS_LFBLK:

str="blocdspecial";break;

caseS_LFREG:

str="regular";break;

/*

区分文件类型

*/ #ifdefS_IFLNKcaseS_IFLNK:

str="symboliclink";break;

#endif #ifdefS_IFSOCKcaseS_IFSOCK:str="socket";break;

#endif#ifdefS_IFIFOcuseS_IFIFO:str="fifo";break;

#endifdefault:str="unknownmode";break;

}/*switch*/printf("%s\n",str);

}/*for*/exit(0);}

该程序分析命令行变元,打印出命令行变元所确定的文件类型。若将该程序编译链接成a.out文件,并按下列命令执行:

a.out/dev/tty/dev/raoa/usr/lib/etc/passwd

则输出结果为:

/dev/tty:characterspecial /dev/raoa:liockspecial /usr/lib:directory /ect/passwd:regular 2.文件的存取权限

一个进程具有四个标识符:用户标点符、有效用户标识符、用户组号和有效用户组号。

除此以外,每个文件还具有下列属性:

属主用户标识(16位整数);

属主用户组号(16位整数);

用户读允许(1位);

用户写允许(1位);

用户组读允许(1位);

用户组写允许(1位);

用户组执行允许(1位);

其他用户读允许(1位);

其他用户写允许(1位);

其他用户执行允许(1位);

设置用户标识(1位);

设置用户组号(1位)。

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论