网络编程语言_第1页
网络编程语言_第2页
网络编程语言_第3页
网络编程语言_第4页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

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

文档简介

1、1网络编程语言网络编程语言2应用程序程序编程接口(套接字) 实现网络应用时,要从由网络输出的接口开始。既然大多数网络协议都是由软件实现的(特别是协议栈中的高层协议),而且几乎所有的计算机系统都将网络协议的实现作为操作系统的一部分,因而我们说“由网络输出的”接口时,通常指的是操作系统为它的网络子系统提供的接口。这个接口叫做网络的应用程序编程接口应用程序编程接口(A P I )。 虽然每个操作系统都可以自由地定义自己的A P I ,但随着时间的推移,有些A P I 已获得了广泛的支持;也就是说,除了它们原始的系统外,它们还被移植到操作系统中。3应用程序程序编程接口(套接字) 套接字接(socket

2、 interface )口:它最初是由加州大学伯克利分校的U n i x 小组开发,而现在几乎所有流行的操作系统都支持它。业界支持单一A P I 的优点是使得应用程序可以很简单地从一个操作系统移植到另一个操作系统。但是我们得记住一点,通常应用程序与操作系统许多部分相互作用,而不仅仅与网络相互作用。例如,读写文件,产生并行进程和输出图形显示。 每个协议提供了一系列服务(s e rv i c e ),A P I 则提供了特定操作系统中调用这些服务所用的语法(s y n t a x )。然后,实现的作用是把A P I 定义的具体操作和对象映射到协议定义的抽象服务集上。4应用程序程序编程接口(套接字)

3、 套接字接口的主要概念是套接字(s o c k e t )。理解套接字的好方法是把它看作本地应用进程与网络的接入点。接口定义了各种操作,包括创建套接字、将套接字连到网上、通过套接字发送/接收消息,关闭套接字。为了简化讨论,我们在此只讨论T C P 中如何使用套接字。 第一步是创建套接字,用如下操作实现: 该操作有三个参数是因为套接字接口被设计成通用的,定义支持任意的底层协议集。 5应用程序程序编程接口(套接字) 2.t y p e 参数表明通信的参数表明通信的语义。语义。 S O C K _ S T R E A M 说明是字节流。说明是字节流。 S O C K _ D G R A M则则表明是

4、面向消息的服务,表明是面向消息的服务,像像U D P 提供的一样。提供的一样。3.p r o t o c o l 参数则指明将要用到的特定参数则指明将要用到的特定协议。协议。 s o c k e t 返回值是新创建套接字的句柄(句柄(h a n d l e ),即以后引用该套接字时使用的标识符。在套接字的其他操作中,它也将作为一个参数。1.d o m a i n 参数描述将使用的协议参数描述将使用的协议族族。 A F _ I N E T 用于表示因特网协议族。用于表示因特网协议族。 A F _ U N I X 用于表示用于表示U n i x 管道功能管道功能6客户客户/服务器模式服务器模式 在

5、在TCP/IP网络应用中,通信的两个进程间相互作用的主网络应用中,通信的两个进程间相互作用的主要模式是客户要模式是客户/服务器模式(服务器模式(Client/Server model),即客户),即客户向服务器发出服务请求,服务器接收到请求后,提供相应的向服务器发出服务请求,服务器接收到请求后,提供相应的服务。服务。 客户客户/ /服务器模式的建立基于以下两点:服务器模式的建立基于以下两点: 首先,建立网络的起因是网络中软硬件资源、运算能力首先,建立网络的起因是网络中软硬件资源、运算能力和信息不均等,需要共享,从而造就拥有众多资源的主机提和信息不均等,需要共享,从而造就拥有众多资源的主机提供服

6、务,资源较少的客户请求服务这一非对等作用。供服务,资源较少的客户请求服务这一非对等作用。 其次,网间进程通信完全是异步的,相互通信的进程间其次,网间进程通信完全是异步的,相互通信的进程间既不存在父子关系,又不共享内存缓冲区,因此需要一种机既不存在父子关系,又不共享内存缓冲区,因此需要一种机制为希望通信的进程间建立联系,为二者的数据交换提供同制为希望通信的进程间建立联系,为二者的数据交换提供同步,这就是基于客户步,这就是基于客户/ /服务器模式的服务器模式的TCP/IPTCP/IP。 7客户客户/服务器模式服务器模式 客户客户/服务器模式在操作过程中采取的是主动请求方式:服务器模式在操作过程中采

7、取的是主动请求方式: 首先服务器方要先启动,并根据请求提供相应服务:首先服务器方要先启动,并根据请求提供相应服务:1.打开一通信通道并告知本地主机,它愿意在某一公认地址上打开一通信通道并告知本地主机,它愿意在某一公认地址上(周知口,如(周知口,如FTP为为21)接收客户请求;)接收客户请求;2.等待客户请求到达该端口;等待客户请求到达该端口;3.接收到重复服务请求,处理该请求并发送应答信号。接收到接收到重复服务请求,处理该请求并发送应答信号。接收到并发服务请求,要激活一新进程来处理这个客户请求(如并发服务请求,要激活一新进程来处理这个客户请求(如UNIX系统中用系统中用fork、exec)。新

8、进程处理此客户请求,并不需)。新进程处理此客户请求,并不需要对其它请求作出应答。服务完成后,关闭此新进程与客户的要对其它请求作出应答。服务完成后,关闭此新进程与客户的通信链路,并终止。通信链路,并终止。4. 返回第二步,等待另一客户请求。返回第二步,等待另一客户请求。5. 关闭服务器关闭服务器8客户客户/服务器模式服务器模式客户方:客户方:1. 打开一通信通道,并连接到服务器所在主机的特定打开一通信通道,并连接到服务器所在主机的特定端口;端口;2. 向服务器发服务请求报文,等待并接收应答;继续向服务器发服务请求报文,等待并接收应答;继续提出请求提出请求.3. 请求结束后关闭通信通道并终止。请求

9、结束后关闭通信通道并终止。 从上面所描述过程可知:从上面所描述过程可知:1. 客户与服务器进程的作用是非对称的,因此编码不客户与服务器进程的作用是非对称的,因此编码不同。同。2. 服务进程一般是先于客户请求而启动的。只要系统服务进程一般是先于客户请求而启动的。只要系统运行,该服务进程一直存在,直到正常或强迫终止。运行,该服务进程一直存在,直到正常或强迫终止。 9应用程序程序编程接口(套接字) 下一步看你是客户还是服务器。 如果是服务器:在服务器主机上,应用进程执行一个被动的被动的打开,即服务器表明它已准备好接受连接,但并没有真正建立连接。服务器通过调用以下三个操作来完成打开: 10套接字类型套

10、接字类型 TCP/IP的socket提供下列三种类型套接字。(1)流式套接字()流式套接字(SOCK_STREAM)提供了一个面向连接、可靠的数据传输服务,数据无差错、无重复地发送,且按发送顺序接收。内设流量控制,避免数据流超限;数据被看作是字节流,无长度限制。文件传送协议(FTP)即使用流式套接字。 (2)数据报式套接字()数据报式套接字(SOCK_DGRAM)提供了一个无连接服务。数据包以独立包形式被发送,不提供无错保证,数据可能丢失或重复,并且接收顺序混乱。网络文件系统(NFS)使用数据报式套接字。 (3)原始式套接字()原始式套接字(SOCK_RAW)该接口允许对较低层协议,如IP、I

11、CMP直接访问。常用于检验新的协议实现或访问现有服务中配置的新设备。11典型套接字调用过程举例典型套接字调用过程举例如前所述,TCP/IP协议的应用一般采用客户/服务器模式,因此在实际应用中,必须有客户和服务器两个进程,并且首先启动服务器,其系统调用时序图如下。面向连接的协议面向连接的协议(如TCP)的套接字系统调用如下图所示:服务器必须首先启动,直到它执行完accept()调用,进入等待状态后,方能接收客户请求。假如客户在此前启动,则connect()将返回出错代码,连接不成功。 见下图见下图12 服务器方服务器方 客户方客户方 13Status of parent and child pr

12、ocesses with respect to the socket14典型套接字调用过程举例典型套接字调用过程举例无连接协议无连接协议的套接字调用如下图所示: 无连接服务器也必须先启动,否则客户请求传不到服务进程。无连接客户不调用connect()。因此在数据发送之前,客户与服务器之间尚未建立完全相关,但各自通过socket()和bind()建立了半相关。发送数据时,发送方除指定本地套接字号外,还需指定接收方套接字号,从而在数据收发过程中动态地建立了全相关。 见下图见下图15socket(),建立数据报式套接字,返回套接字号sbind(),将套接字s与本地地址相连recvfrom()/sen

13、dto(),通过套接字s读/写数据,直到数据交换完。closesocket(),关闭套接字s,结束服务socket(),建立数据报式套接字,返回套接字号sbind(),将套接字s与本地地址相连sendto ()/recvfrom(),通过套接字s交换数据closesocket(),关闭套接字,结束对话服务器方客户方16应用程序程序编程接口(套接字)1.b i n d 操作操作:如其名字一样,是将新创建的如其名字一样,是将新创建的s o c k e t 与与a d d r e s s 绑定。绑定。这是这是本地本地参与者(即服务器)的网络地址。参与者(即服务器)的网络地址。 注意,注意,a d d

14、 r e s s 在因特网协议中使用时是表示一个数据结构,其中包在因特网协议中使用时是表示一个数据结构,其中包括服务器的括服务器的I P 地址和地址和T C P 端口号。端口号通常是一些众所周知的、专门端口号。端口号通常是一些众所周知的、专门提供给服务的号吗;例如,提供给服务的号吗;例如,We b 服务器通常在端口服务器通常在端口8 0 上接受连接上接受连接。2.l i s t e n 操作操作:定义在指定的定义在指定的s o c k e t 上可以有多少个待处理的连接。上可以有多少个待处理的连接。3.a c c e p t 操作操作:完成被动打开。它是一个阻塞的操作,在远程参与者没完成被动打

15、开。它是一个阻塞的操作,在远程参与者没有建立起连接前,它不会返回任何参数,一旦连接成功,它将返回一个表有建立起连接前,它不会返回任何参数,一旦连接成功,它将返回一个表示这个新建连接的示这个新建连接的新的新的套接字,并且套接字,并且a d d r e s s 参数还包括了参数还包括了远程远程参与参与者的地址。者的地址。 注意,当注意,当a c c e p t 返回时,以前作为参数给定的原始套接字依然存在并返回时,以前作为参数给定的原始套接字依然存在并依然对应于被动打开;在以后调用依然对应于被动打开;在以后调用a c c e p t 时它仍作为参数。时它仍作为参数。17应用程序程序编程接口(套接字

16、) 在客户机上,应用程序执行主动主动打开;也就是,它通过调用如下的一个操作来表明它希望与谁通信: 该操作直至T C P 成功建立连接后才返回,此时应用程序就可以开始发送数据。a d d r e s s 中包括了远程参与者的地址。 实际上,客户机通常只描述远程参与者的地址,让系统自动填写本地信息。鉴于服务器通常在共知的端口监听消息,一般地,客户机并不关心它自己用哪个端口;操作系统简单地选一个未用端口即可。18应用程序程序编程接口(套接字) 一旦连接建立,应用进程将调用以下两个操作来发送和接收数据: 这个操作在指定的s o c k e t 上发送m e s s a g e 这个操作则是将从指定的s

17、 o c k e t 上收到的消息放入指定的b u ff e r 。它们都使用一系列f l a g s 来控制操作的特定细节。 19应用实例 现在,我们来看一个简单的客户机/服务器程序的实现,它用套接字接口在一个T C P 连接上发送消息。这个程序还用到了其他的U n i x 网络功能,我们将逐个介绍。我们的应用允许用户在一端的机器上输入并把文本发送给另一端机器的用户。它是U n i x 中t a l k 程序的一个简化版本,类似于We b 聊天室的核心程序。 20应用实例 1.客户端客户端 我们先从客户端开始,它用远端的机器名作为参数。它调用U n i x 程序g e t h o s t b

18、 y n a m e 把该名字翻译为远端主机的I P 地址。 下一步是构造套接字接口所需的地址数据结构(s i n )。 注意这个数据结构表明我们将一直用套接字与因特网连接(A F _ I N E T )。 在以下例子中,我们用T C P 端口号5 4 3 2 作为共知的服务器端口号;它恰好不是分配给其他因特网服务的端口号。 建立连接的最后一步是调用s o c k e t 和c o n n e c t 。一旦c o n n e c t 操作返回,建立起连接,客户机程序将进入主循环,不断从标准输入读取文本并通过套接字发送。21客户端程序22应用实例 2. 服务器服务器 服务器的实现也很简单。首先

19、,它填入自己的端服务器的实现也很简单。首先,它填入自己的端口号(口号(S E RV E R _ P O RT )构造地址数据结构。)构造地址数据结构。 其次,它并不指明其次,它并不指明I P地址,从而使应用程序可以地址,从而使应用程序可以接受来自本地任一接受来自本地任一I P 地址的连接。地址的连接。 然后,服务器执行与被动打开有关的初始步骤:然后,服务器执行与被动打开有关的初始步骤: 创建一个套接字,将它绑定到本地地址。创建一个套接字,将它绑定到本地地址。 然后设置允许同时连接的最大数。然后设置允许同时连接的最大数。 最后,主循环等待远端主机与它连接,当远端有一最后,主循环等待远端主机与它连

20、接,当远端有一台主机试图与它连接时,它就接收并输出连接上送来台主机试图与它连接时,它就接收并输出连接上送来的字符。的字符。23服务器程序24协议实现的问题协议实现的问题 应用程序与底层网络交互的方式类似于高层协议与低层协应用程序与底层网络交互的方式类似于高层协议与低层协议交互的方式。例如,议交互的方式。例如,T C P 需要一个接口向需要一个接口向I P 发送消息发送消息,同同时也需要时也需要I P 能向能向T C P 传送消息。这就是服务接口。传送消息。这就是服务接口。 既然我们已经有了网络的既然我们已经有了网络的A P I (如套接字),或许我们可(如套接字),或许我们可以在协议栈的每一对

21、协议间使用同样的接口。尽管这只是一种以在协议栈的每一对协议间使用同样的接口。尽管这只是一种选择,但在实际中我们并不这样使用套接字接口。原因在于套选择,但在实际中我们并不这样使用套接字接口。原因在于套接字接口在协议实现方面的低效是协议实现者所不能忍受的。接字接口在协议实现方面的低效是协议实现者所不能忍受的。应用编程人员之所以能忍受是因为它应用编程人员之所以能忍受是因为它简化了编程工作,而且毕简化了编程工作,而且毕竟他对低效只需忍受一次就够了,而协议实现者却要常常被它竟他对低效只需忍受一次就够了,而协议实现者却要常常被它们的性能所困扰,总担心穿过几层协议是否能得到一条消息。们的性能所困扰,总担心穿

22、过几层协议是否能得到一条消息。 本节的其余部分将讨论网络本节的其余部分将讨论网络A P I 和位于协议图下方的协议和位于协议图下方的协议到协议接口的两点主要不同。同时介绍协议实现常用到的库例到协议接口的两点主要不同。同时介绍协议实现常用到的库例程。程。 25协议实现的问题协议实现的问题 1. 进程模型进程模型 大多数操作系统都提供一种抽象概念叫大多数操作系统都提供一种抽象概念叫进程(进程(p ro c e s s ),或叫或叫线程(线程(t h re a d )。每个进程的运行很大程度上独立于其。每个进程的运行很大程度上独立于其他进程,操作系统负责确保给所有当前的进程分配如地址空间他进程,操作

23、系统负责确保给所有当前的进程分配如地址空间和和C P U 周期这样的资源。周期这样的资源。 进程这一抽象概念使得在一台机器上并发运行多个事件变进程这一抽象概念使得在一台机器上并发运行多个事件变得相当简单;例如,每个用户的应用程序可以在自己的进程中得相当简单;例如,每个用户的应用程序可以在自己的进程中执行,操作系统中的各种事件可以作为其他进程执行。执行,操作系统中的各种事件可以作为其他进程执行。 操作系统将正在操作系统将正在C P U 上运行的进程停止并启动另一进程时,上运行的进程停止并启动另一进程时,我们称这一转换为我们称这一转换为上下文切换(上下文切换(context switch )。26

24、协议实现的问题协议实现的问题 在设计一个网络子系统时,首先要回答的问题在设计一个网络子系统时,首先要回答的问题之一是,之一是,“进程在哪儿?进程在哪儿?”基本上有两种选择,基本上有两种选择,如图所示。如图所示。 第一种选择,我们称为第一种选择,我们称为进程进程/协议协议(p ro c e s s - p e r- p ro t o c o l )模型,每个协议由一个独立)模型,每个协议由一个独立的进程实现。这就意味着当一条消息向协议栈的的进程实现。这就意味着当一条消息向协议栈的上方或下方移动时,它被从一个进程上方或下方移动时,它被从一个进程/协议传送到协议传送到另一个进程另一个进程/协议,即实

25、现协议协议,即实现协议i 的进程处理这个的进程处理这个消息,然后把它传给协议消息,然后把它传给协议i -1 ,以此类推。一个,以此类推。一个进程进程/协议如何向下一个进程协议如何向下一个进程/协议传递消息依赖协议传递消息依赖于主机操作系统提供的进程间通信的支持。通常于主机操作系统提供的进程间通信的支持。通常有一个简单的机制把消息与进程排队。然而,重有一个简单的机制把消息与进程排队。然而,重要的一点是,协议图的每一层都要求上下文切换,要的一点是,协议图的每一层都要求上下文切换,这是一个典型的耗时操作。这是一个典型的耗时操作。27协议实现的问题协议实现的问题 我们把另一种称为我们把另一种称为进程进

26、程/消息消息(p ro c e s s - p e r-me s s a g e )模型,它把每个协)模型,它把每个协议当做一段静态编码并把进程同消息联系议当做一段静态编码并把进程同消息联系起来。也就是说,当网络送来一条消息时,起来。也就是说,当网络送来一条消息时,操作系统调度一个进程,使之负责消息在操作系统调度一个进程,使之负责消息在协议图中向上移动。在每一层,调用实现协议图中向上移动。在每一层,调用实现该协议的过程,然后调用实现下一个协议该协议的过程,然后调用实现下一个协议的过程,以此类推。对于输出的消息,应的过程,以此类推。对于输出的消息,应用程序调用必要的过程,直到消息被送入用程序调用

27、必要的过程,直到消息被送入网络。在两个方向中,协议图都被一系列网络。在两个方向中,协议图都被一系列过程调用一遍。过程调用一遍。28协议实现的问题协议实现的问题 结论:结论: 虽然有时感觉进程虽然有时感觉进程/协议模型比较容易,即我在我的协议模型比较容易,即我在我的进程中实现我的协议,而你在你的进程中实现你的协进程中实现我的协议,而你在你的进程中实现你的协议。议。 但由于一个简单的原因,进程但由于一个简单的原因,进程/消息模型通常更有效:消息模型通常更有效:即在大多数计算机上,过程调用的效率比上下文切换即在大多数计算机上,过程调用的效率比上下文切换高一个数量级。高一个数量级。 第一种模型要求每一层有一个上下文切换,而第二第一种模型要求每一层有一个上下文切换,而第二种模型只要求每一层有一个进程调用。种模型只要求每一层有一个进程调用。29协议实现的问题协议实现的问题 大多数协议实现用大多数协议实现用d e l i v e r 操作代替操作代替r

温馨提示

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

评论

0/150

提交评论