《《计算机网络与因特网》.ppt》由会员分享,可在线阅读,更多相关《《计算机网络与因特网》.ppt(73页珍藏版)》请在三一办公上搜索。
1、Computer Networks and Internets计算机网络与因特网课件,PART IV Network Applications,Chapter 27 The Socket Interface Socket 接口,27.1 Introduction,The interface between an application and protocol software.How an application uses protocol software to communication.Set of procedures that an application uses to beco
2、me a client or a server,to contact a remote destination,or to transfer data.,27.2 Application Program Interface,Client and server application use transport protocols to communicate.The interface an application uses when it interacts with transport protocol software is known as an Application Program
3、 Interface(API).An API defines a set of operations that an application can perform when interacting with protocol software,the API determines the functionality that is available.,27.3 The Socket API,Although protocol standards allow operating system designers to choose an API,many have adopted the S
4、ocket API.The Socket API is available for many operating systems.The Socket API originated as part of the BSD Unix operating system.The Socket API is a de facto standard.,27.4 Sockets And Socket Libraries,In BSD Unix and the system derived from it,socket functions are part of the operating system it
5、self.In many cases,instead of modifying their basic operating system,vendors created a socket library that provides the Socket API.,A socket library can provide applications with a socket API on a computer system that does not provide native sockets.When an application calls one of the socket proced
6、ures,control passes to a library routine that makes one or more calls to the underlying operating system to implement the socket function.,27.5 Socket Communication And Unix I/O,An application communicates through a socket similar to the way the application transfers data to or from a file.Unix uses
7、 an open-read-write-close paradigm for all I/o,补充:1.Socket API与Unix,Unix是一个通用的交互式多用户分时操作系统。Unix由AT&T 公司Bell实验室于1969年开发。Unix 有两个主要的流派:System V 和 BSDSystem V 由最初的AT&T Unix 演化而来。BSD Unix 是由加州大学伯克利(Berkeley)分校开发,其目标是提供一个具有复杂网络支持的开放系统。TCP/IP 协议族也与Unix 的发展有很密切关系。Socket API与Unix 操作系统关系非常密切。,UNIX系统的I/O命令集,其
8、模式为打开一读/写一关闭(open-write-read-close)。在一个用户进程进行I/O操作时,它首先调用“打开”获得对指定文件或设备的使用权,并返回称为文件描述符的整型数,以描述用户在打开的文件或设备上进行I/O操作的进程。然后这个用户进程多次调用“读/写”以传输数据。当所有的传输操作完成后,用户进程关闭调用,通知操作系统已经完成了对某对象的使用。,TCP/IP协议被集成到UNIX内核中时,相当于在UNIX系统引入了一种新型的I/O操作。UNIX用户进程与网络协议的交互作用比用户进程与传统的I/O设备相互作用复杂得多。首先,进行网络操作的两个进程可能在不同主机上,如何建立它们之间的联
9、系?其次,存在多种网络协议,如何建立一种通用机制以支持多种协议?这些都是网络应用编程所要解决的问题。,进程通信的概念最初来源于单机系统。由于每个进程都在自己的地址范围内运行,为保证两个相互通信的进程之间既互不干扰又协调一致工作,操作系统为进程通信提供了相应设施:如UNIXBSD中的管道(pipe)、命名管道(namedpipe)和软中断信号(signal),UNIXsystemV的消息(message)、共享存储区(sharedmemory)和信号量(semaphore)等,但都仅限于用在本机进程之间通信。,2 进程间通信,3 网间进程通信,网间进程通信要解决的是不同主机进程间的相互通信问题。
10、可以把同机进程通信看作是其中的特例。为此,首先要解决的是网间进程标识问题。同一主机上,不同进程可用进程号(processID)唯一标识。但在网络环境下,各主机独立分配的进程号不能唯一标识该进程。,其次,操作系统支持的网络协议众多,不同协议的工作方式不同,地址格式也不同。因此,网间进程通信还要解决多重协议的识别问题。,27.6 Sockets,Descriptors,And network I/O,Socket communication also uses the descriptor approach.Before an application can use protocols to co
11、mmunicate,the application must request the operating system to create a socket that will be used for communication.The system returns a small integer descriptor that identifies the socket.,In a Unix implementation,sockets are completely integrated with other I/o.A single application can be written t
12、hat transfers data to an arbitrary location.,4.协议端口,网络中可以被命名和寻址的通信端口,是操作系统可分配的一种资源。传输层与网络层在功能上的最大区别是传输层提供进程通信能力。因此,网络通信的最终地址就不仅仅是主机地址了,还包括可以描述进程的某种标识符。为此,TCP/IP协议提出了协议端口(protocolport,简称端口)的概念,用于标识通信的进程。,端口是一种抽象的软件结构(包括一些数据结构和I/O缓冲区)。应用程序(即进程)通过系统调用与某端口建立连接(binding)后,传输层传给该端口的数据都被相应进程所接收,相应进程发给传输层的数据
13、都通过该端口输出。在TCP/IP协议的实现中,端口间的操作类似于一般的I/O操作,进程获取一个端口,相当于获取本地唯一的I/O文件,可以用一般的读写原语访问之。,类似于文件描述符,每个端口都拥有一个叫端口号(portnumber)的整数型标识符,用于区别不同端口。由于TCP/IP传输层的两个协议TCP和UDP是完全独立的两个软件模块,因此各自的端口号也相互独立,如TCP有一个255号端口,UDP也可以有一个255号端口,二者并不冲突。,半相关,网络中用一个三元组可以在全局唯一标志一个进程:(协议,本地地址,本地端口号)这样一个三元组,叫做一个半相关(half-association),它指定连
14、接的每半部分。,全相关,一个完整的网间进程通信需要由两个进程组成,并且只能使用同一种高层协议。一个完整的网间通信需要一个五元组来标识:(协议,本地地址,本地端口号,远程地址,远程端口号)这样一个五元组,叫做一个相关(association),即两个协议相同的半相关才能组合成一个合适的相关,或完全指定组成一连接。,Socket接口应用程序的基本网络接口由操作系统提供;进程的通信端点一个socket的信息含义协议类型本地地址本地端口号远端地址远端端口号,27.7 Parameters And The Socket API,Socket programming differs from conven
15、tional I/o.Because an application must specify many details to use a socket.To accommodate all the details,each socket has many parameters and options.To avoid having a single socket function with separate parameters for each option,designers of the socket API chose to define many function.,插口结构,Cli
16、ent-Server执行模式,Client-Server端执行模式,Server,Client,注意:上面这些Socket的意思与指IP地址和TCP端口号的组合的Socket不同,27.8 Procedures that Implement The Socket API,27.8.1 The Socket Procedure.,descriptor=socket(protofamily,type,protocol)Return a socket descriptor if successful;-1 if error.,The Socket Procedure:The socket proce
17、dure creates a socket and returns an integer descriptor.It sets values for only the first three fields of the socket structure.The other fields are set by the other functions or by the operating system.,Argument Protofamily:,1:AF-INET4 IPv4协议2:AF-INET6 IPv6协议3:AF-LOCAL Unix域协议4:AF-ROUTE 路由插口,Argumen
18、t type specifies the type of communication the socket will use.,TCP/IP的socket提供下列三种类型插口。1.SOCK_STREAM(字节流插口)提供了一个面向连接、可靠的数据传输服务,数据无差错、无重复地发送,且按发送顺序接收。内设流量控制,避免数据流超限;数据被看作是字节流,无长度限制。文件传送协议(FTP)即使用流式插口。,2.SOCK_DGRAM(数据报插口)提供了一个无连接服务。数据包以独立包形式被发送,不提供无错保证,数据可能丢失或重复,并且接收顺序混乱。网络文件系统(NFS)使用数据报式插口。,3.SOCK_R
19、AW(原始插口)该接口允许对较低层协议,如IP、ICMP直接访问。常用于检验新的协议实现或访问现有服务中配置的新设备。,Family 与 type 的组合,Argument protocol,一般情况将其设置为0,除非用在原始插口上。Protocol的常量在头文件中定义,常量名以IPPROTO_开头。例如:IPPROTO_IGMPIPPROTO_IPIPPROTO_ICMP,The Bind Procedure,The bind function binds a socket to a local socket address by adding the local socket addres
20、s to an already created socket.其调用格式如下:bind(socket,localaddr,addrlen)Returns 0 if successful;-1 if error.,当一个socket用socket()创建后,存在一个名字空间(地址族),但它没有被命名。bind()将socket地址(包括本地主机地址和本地端口地址)与所创建的socket号联系起来,即将名字赋予socket,以指定本地半相关。,对于服务器而言,需要将插口绑定到一个已知的端口上,因为只有这样,客户端才知道该往何处发起连接。为此,需要调用bind()函数,并设置其参数。,设置插口地址结
21、构的几种常见方式,“通配地址”通常由常量INADDR_ANY指定,地址在建立socket通信过程中起着重要作用,作为一个网络应用程序设计者对socket地址结构必须有明确认识。例如,UNIXBSD有一组描述socket地址的数据结构.,T C P/I P协议使用s o c k a d d r _ i n来定义地址,struct sockaddr_in u_char sin_len;/*地址总长*/u_char sin_family;/*地址族AF_INET*/u_short sin_port;/*协议端口号*/*16位端口号,网络字节顺序*/struct in_addr sin_addr;/*
22、计算机IP地址*/*32位IP地址,网络字节顺序*/char sin_zero8;/*保留,未用(置为0)*/;,其中:,Struct in_addr u_long s_addr;/*将IP地址作为一个32位的二进制数来保存*/;,插口地址结构,网络字节顺序,不同的计算机存放多字节值的顺序不同,有的机器在起始地址存放低位字节(小数在前),有的存高位字节(大数在前)。为保证数据的正确性,在网络协议中须指定网络字节顺序。TCP/IP协议使用16位整数和32位整数的大数在前格式,它们均含在协议头文件中。,大数在前的字节顺序(Big-endian byte order),主机中的字节顺序(1),小数在
23、前的字节顺序(Little-endian byte order),主机中的字节顺序(2),TCP/IP协议族选择的是大数在前的字节顺序,The Listen Procedure,The listen function is called only by the TCP server.It creates a passive socket from an unconnected socket.Before calling the listen function,the socket must already be created and the local socket address fiel
24、ds set.This function informs the operating system that the server is ready to accept connection through this socket.,监听连接listen()此调用用于面向连接服务器,表明它愿意接收连接。listen()需在accept()之前调用,其调用格式如下:listen(socket,queuesize)参数Socket:表示socket的描述符,标识一个本地已建立、尚未连接的插口号,服务器愿意从它上面接收请求.Queuesize:表示该socket的请求队列的长度。用于限制排队请求的个
25、数,目前允许的最大值为5。Returns 0 if successful;-1 if error.,调用listen()是服务器接收一个连接请求的四个步骤中的第三步。它在调用socket()分配一个流插口,且调用bind()给它赋于一个名字之后调用,而且一定要在accept()之前调用。,The Accept Procedure,The accept function is called by a TCP server to remove the first connection request from the corresponding queue.If there are no requ
26、ests(the queue is empty),the accept function is put to sleep.a c c e p t调用的形式为:newsock=accept(socket,caddress,caddresslen),参数s o c k e t是服务器已经创建并绑定于指定协议端口的插口描述符。参数c a d d r e s s是s o c k a d d r类型结构的地址c a d d r e s s l e n则是一个指向整型的指针。a c c e p t为该连接创建一个新的插口,并将这个新的插口描述符返回给调用者。服务器使用这个新的插口与客户进行通信,然后在结束
27、后关闭该插口。同时,服务器原始的插口保持不变在服务器结束与一个客户的通信后,它使用这个原始的插口来接收下一个客户的连接。,The Connect Procedure,The connect function is used by a process(usually a client)to establish an active connection to a remote process(normally a server).调用形式为:connect(socket,saddress,saddresslen)Returns 0 if successful;-1 if error,参数s o c
28、 k e t是客户端计算机上用于该连接的插口的描述符。参数s a d d r e s s是一个s o c k a d d r结构,说明服务器地址与协议端口号(I P地址和协议端口号合在一起有时被称作端地址,即endpoint address)。参数s a d d r e s s l e n是以字节形式说明的服务器地址的长度。,四个函数调用,socket()、bind()、connect()、accept(),可以完成一个完全五元相关的建立。socket()指定五元组中的协议元,它的用法与是否为客户或服务器、是否面向连接无关。bind()指定五元组中的本地二元,即本地主机地址和端口号,其用法与是
29、否面向连接有关:在服务器方,无论是否面向连接,均要调用bind();在客户方,若采用面向连接,则可以不调用bind(),而通过connect()自动完成。若采用无连接,客户方必须使用bind()以获得一个唯一的地址。,建立socket连接:connect()与accept()这两个函数调用用于完成一个完整相关的建立:connect()用于由客户方发起建立连接。accept()用于使服务器等待来自某客户进程的实际连接。,数据传输,数据传输send()与recv()当一个连接建立以后,就可以传输数据了。常用的调用有send()和recv()。send()调用输出数据,格式如下:send(socke
30、t,data,length,flag),参数s o c k e t是使用的插口的描述符。参数d a t a是待发送数据在内存中的地址,参数l e n g t h是一个整型数,表示数据的字节数,参数f l a g则包含了请求特殊选项的位(许多选项是为系统调试设计的,并不能被普通的客户和服务器程序使用)。,recv()调用用于接收输入数据,格式如下:recv(socket,buffer,length,flags),参数s o c k e t是从中接收数据的插口的描述符。参数b u ff e r表示用来存放接收到的数据的内存地址,参数l e n g t h则表示这个缓冲区的大小。参数f l a g允
31、许调用者控制一些细节(例如,允许应用在不将信息从插口中移出的情况下提取它的一个副本等)。,无连接服务,面向连接服务,Relationship between the client and the server,重复服务器在一个时间只能和一个客户程序建立连接,它对多个客户程序的处理是采用循环的方式重复进行,因此叫重复服务器。并发服务器和重复服务器各有利弊:并发服务器可以改善客户程序的响应速度,但它增加了系统调度的开销;重复服务器正好与其相反,因此用户在决定是使用并发服务器还是重复服务器时,要根据应用的实际情况来定。,附录,1.Memset:将一个指明的字节数设置为一个值,第一个变量是指针,它指向
32、目的地,第二个变量是它的值,第三个变量是字节数。例如:memset(&x,0,sizeof(x),字节操纵函数,2.Memcpy:将一个字段的值复制到另一个字段,第一个变量是指向目的地的指针,第二个变量是指向源的指针,第三个变量是字节数。例如:memcpy(&x,&y,sizeof(x),3.Memcmp:比较两个字段,第一个变量是指向第一个字段的指针,第二个变量是第二个字段的指针,第三个变量是要比较的字节数。例如:memcmp(&x,&y,10),地址转换函数,atoi(),网络信息查询函数,Gethostbyname(),关于主机的信息,地址长度,WinSock,Socket接口是网络编程
33、(通常是TCP/IP协议,也可以是其他协议)的API。最早的Socket接口是Berkeley接口,在Unxi操作系统中实现。WinSock也是一个基于Socket模型的API,在Microsoft Windows操作系统类中使用。它在Berkeley接口函数的基础之上,还增加了基于消息驱动机制的Windows扩展函数。Winscok1.1只支持TCP/IP网络,WinSock2.0增加了对更多协议的支持。,一、WSAStartup函数 int WSAStartup(WORD wVersionRequested,LPWSADATA lpWSAData);例:假如一个程序要使用2.1版本的Soc
34、ket,那么程序代码如下 wVersionRequested=MAKEWORD(2,1);err=WSAStartup(wVersionRequested,使用Socket的程序在使用Socket之前必须调用WSAStartup函数。该函数的第一个参数指明程序请求使用的Socket版本,其中高位字节指明副版本、低位字节指明主版本;操作系统利用第二个参数返回请求的Socket的版本信息。当一个应用程序调用WSAStartup函数时,操作系统根据请求的Socket版本来搜索相应的Socket库,然后绑定找到的Socket库到该应用程序中。以后应用程序就可以调用所请求的Socket库中的其它Socket函数了。该函数执行成功后返回0。,Client-Server模式的产生原因及其功能Socket接口及其在Client-Server模式中的执行模式,作业,