第3章WinSock基础第3章WinSock基础3.1基本概念3.2WinSock编程原理3.3WinSockI/O模型3.4WinSock2的扩展特性3.5套接字选项和I/O控制命令习题与思考题第3章WinSock基础3.1基本概念在Windows下的各种网络编程接口中,WindowsSockets(简称WinSock)已经成为标准,这是因为WindowsSockets规范是一套开放的、支持多协议的Windows下的网络编程接口。WindowsSocketsAPI是MicrosoftWindows的网络程序接口,它包括一个标准的BerkeleySockets功能调用的集合,以及为Windows所做的重要扩充。扩充的功能调用都用WSA(WindowsSocketsAsynchronous)做前缀,表明它们允许异步的I/O操作,并采用了符合Windows消息机制的网络事件异步选择机制。这些扩充有利于应用程序开发者更好地利用Windows的消息驱动特性,设计出高性能的网络程序。第3章WinSock基础消息是windows运行机制中一个基本而又重要的概念。消息是一个报告事件发生的通知,某条消息可被视为某个事件的发生,比如点击鼠标。事件即可以由用户引发,也可以由应用程序产生,当然Windows本身也能发出消息。Windows应用程序的消息来源有4种:输入消息、控制消息、系统消息和用户消息。消息驱动是围绕消息的产生与处理展开的,并依靠消息循环机制来实现。第3章WinSock基础例如:当你单击file菜单的时候,首先这个动作被windows所捕获,而不是应用程序。经分析windows知道该动作该由哪个应用程序处理,然后windows就发送消息给该应用程序,它告诉应用程序,你单击了file菜单。应用程序得知这一消息后,便采取相应的动作来响应它,进行“消息处理”。Windows为每个线程维护了相应的消息队列,应用程序的任务就是不停地从特定的消息队列中获取消息、分析消息并处理消息,直到消息处理完为止。这个过程的程序结构称为“消息循环”。第3章WinSock基础Windows操作系统、应用程序和计算机硬件之间的相互关系应用程序操作系统I/O设备消息队列①②③④⑤第3章WinSock基础WindowsSockets实现一般都由两部分组成:开发组件和运行组件。开发组件是供程序员开发WindowsSockets应用程序使用的,包括介绍WindowsSockets实现的文档、WindowsSockets应用程序接口(API)引入库和一些头文件。头文件WINSOCK.H是WindowsSockets最重要的头文件,包括WindowsSockets实现所定义的宏、常数值、数据结构和函数调用接口原型。运行组件是WindowsSockets应用程序接口的动态链接库(DLL),文件名为Winsock.dll,应用程序在执行时通过装入它实现网络通信功能。第3章WinSock基础3.1.1套接字及类型套接字(socket)是网络通信的基本构件,是可以被命名和寻址的通信端点,当应用程序使用套接字函数产生一个套接字后,还返回该套接字的文件描述符。使用中的每一个套接字都有其类型和与之相连的进程。我们可以把支持虚电路服务的信道看做电话线,套接字就像一个电话;我们可以把提供数据报服务的信道看做邮局系统,套接字就像一个邮箱。第3章WinSock基础套接字支持四种通信协议(通信区域或协议族):(1)UNIXDomain(AF_UNIX)(2)Internet(AF_INET)(3)XeroxNS(AF_NS)(4)IMP链路层协议(AF_IMPLINK)WindowsSockets只支持Internet(AF_INET)。第3章WinSock基础套接字具有不同类型,是根据用户可见的通信特征进行分类的。应用程序被假定为只在同一类型的套接字间通信,不过只要通信协议支持,也可在不同类型的套接字间通信。TCP/IP的socket提供三种类型的套接字:*流式套接字(SOCK_STREAM):提供一个面向连接的、可靠的数据传输服务,数据无差错、无重复地发送,且按发送顺序接收。内设流量控制,避免数据流超限;数据被看作是字节流,无长度限制。文件传输协议(FTP)即使用流式套接字。第3章WinSock基础*数据报式套接字(SOCK_DGRAM):提供一个无连接服务。数据报以独立包形式被发送,不提供无错保证,数据可能丢失或重复,且接收顺序混乱。网络文件系统(NFS)使用数据报式套接字。*原始式套接字(SOCK_RAW):该接口允许对较低层协议,如IP、ICMP直接访问。常用于检验新的协议实现或访问现有服务中配置的新设备。第3章WinSock基础3.1.2网间进程通信网间进程通信要解决的是不同主机进程间的相互通信问题。首先要解决的是网间进程标识问题;其次操作系统支持的网络协议众多,不同协议的工作方式不同,地址格式也不同,因此网间进程通信要解决多重协议的标识问题。为解决上述问题,TCP/IP协议引入了下列概念。第3章WinSock基础1.端口网络中可以被命名和寻址的通信端口是操作系统可分配的一种资源。按照OSI协议的描述,传输层与网络层在功能上的最大区别是传输层提供进程通信,从这个意义上讲,网络通信的最终地址不仅仅是主机地址,还包括可以描述进程的某种标识符。为此,TCP/IP协议提出了协议端口(protocolport,简称端口)的概念,用于标识通信的进程。第3章WinSock基础端口是一种抽象的软件结构(包括一些数据结构和I/O缓冲区)。应用程序(进程)通过系统调用与某端口建立连接(binding)后,传输层传给该端口的数据都被相应进程所接收,相应进程发给传输层的数据都通过该端口输出。类似于文件描述符,每个端口都拥有一个叫端口号(portnumber)的整数型标识符,用于区别不同的端口。由于TCP/IP传输层的两个协议TCP和UDP是完全独立的两个软件模块,因此各自的端口号也相互独立。第3章WinSock基础端口号的分配是个重要问题,有两种基本分配方式:全局分配和本地分配。全局分配是一种集中控制方式,由一个公认的中央机构根据用户需要进行统一分配,并将结果公布于众。本地分配又称动态连接,即进程需要访问传输层服务时,向本地操作系统提出申请,操作系统返回一个本地唯一的端口号,进程再通过合适的系统调用,将自己与该端口号联系起来。第3章WinSock基础TCP/IP中端口号的分配综合了上述两种方式。TCP/IP将端口号分为两部分,少量的作为保留端口,以全局方式分配给服务进程,因此每个标准服务器都拥有一个全局公认的端口即周知口(well-knownport),即使在不同机器上,其端口号也相同。剩余的为自由端口,以本地方式进行分配。TCP和UDP均规定,小于1024的端口号才能作保留端口号。第3章WinSock基础2.地址网络通信中通信的两个进程在不同的机器上。这两个机器可能位于不同的网络,这些网络通过网络互联设备(网关、网桥、路由器等)连接。因此需要如下三级寻址:*某一主机与多个网络相连,必须指定一特定网络地址;*网络上每一主机应有唯一的地址;*每一主机上的每一进程应有在该主机上的唯一标识符。通常主机地址由网络ID和主机ID组成,在TCP/IP协议中用32位整数值表示;TCP和UDP均使用16位端口号标识用户进程。第3章WinSock基础3.网络字节顺序不同计算机存放多字节值的顺序不同,为保证数据的正确性,在网络协议中需要指定网络字节顺序。TCP/IP协议使用16位整数和32位整数的高位先存格式,它们均含在协议头文件中。例如:inti=10;假设内存是从低---高增长的。在低位优先的硬件里面,内存布局如下:00001010000000000000000000000000而在高位优先的内存中:00000000000000000000000000001010第3章WinSock基础4.连接两个进程间的通信链路称为连接。连接在内部表现为一些缓冲区和一组协议机制,在外部表现出比无连接更高的可靠性。第3章WinSock基础5.半相关综上所述,网络中用一个三元组(协议,本地地址,本地端口号)可以在全局唯一标志一个进程,这个三元组叫半相关(half-association),它指定连接的每半部分。6.全相关一个完整的网间进程通信需要由两个进程组成,且只能使用同一种高层协议。即不可能通信的一端用TCP协议,另一端用UDP协议。因此一个完整的网间通信需要用一个五元组(协议,本地地址,本地端口号,远地地址,远地端口号)来标识,这个五元组叫全相关(association),即两个协议相同的半相关才能组成一个合适的相关,或完全指定组成一连接。第3章WinSock基础3.1.3服务方式1.面向连接(虚电路)或无连接面向连接服务是电话系统服务模式的抽象,每一次完整的数据传输都要经过建立连接、使用连接、终止连接的过程。在数据传输过程中,各数据分组并不携带目的地址,而使用连接号(connectID)。本质上,连接是一个管道,收发数据不但顺序一致,而且内容相同。TCP协议提供面向连接的虚电路(会话通信)。无连接服务是邮政系统服务的抽象,每个分组都携带完整的目的地址,各分组在系统中独立传送。无连接服务不能保证分组的先后顺序,不进行分组出错的恢复和重传,不保证传输的可靠性。UDP协议提供无连接的数据报服务(数据报通信)。第3章WinSock基础2.顺序在网络传输中,两个连续报文在端到端通信中可能经过不同的路径,这样到达目的地址时的顺序可能与发送时不同。“顺序”是指接收数据顺序与发送数据顺序相同。TCP协议提供这项服务。3.差错控制差错控制是保证应用程序接收的数据无差错的一种机制。检查差错的方法一般是采用检验“校验和”(Checksum)的方法,而保证传输无差错的方法是双方采用确认应答技术。TCP协议提供这项服务(通过三次握手来连接)。第3章WinSock基础4.流控制流控制是在数据传输过程中控制数据传输速率的一种机制,以保证数据不丢失。TCP协议提供这项服务(调整窗口大小)。5.字节流字节流方式是指仅把传输中的报文看作是一个字节序列,不提供数据流的任何边界。TCP协议提供这项服务。6.报文接收方要保存发送方的报文边界。UDP协议提供这项服务。第3章WinSock基础7.全双工/半双工全双工/半双工是指端与端之间的数据同时向两个方向或一个方向传送。8.缓存/带外数据在字节流服务中,由于没有报文边界,用户进程在某一时刻可以读/写任意数量的字节。为保证传输正确或采用有流控制的协议,都要进行缓存。但对某些特殊的需求,如交互式应用程序,又会要求取消这种缓存。在数据传输过程中,希望不通过常规传输方式传送给用户以便及时处理的某一类信息称为带外数据。为了将互操作中的问题减到最小,应用程序编写者除非与现有服务互操作时要求带外数据外,最好不要使用它。第3章WinSock基础3.1.4客户机/服务器模式在TCP/IP网络应用中,通信的两个进程间相互作用的主要模式是客户机/服务器模式(Client/ServerModel),即客户机向服务器发出服务请求,服务器接收到请求后,提供相应的服务。客户机/服务器模式的建立基于以下两点:首先,建立网络的起因是网络中软/硬件资源、运算能力和信息不均等,需要共享,从而形成拥有众多资源的主机提供服务,资源较少的客户请求服务这一非对称的情况。第3章WinSock基础其次,网间进程通信完全是异步的,相互通信的进程间既不存在父子关系,又不共享内存缓冲区,因此需要一种机制为希望通信的进程间建立联系,为二者的数据交换提供同步。这就是基于客户机/服务器模式的TCP/IP网络。第3章WinSock基础客户机/服务器模式在操作过程中采取主动请求方式:(1)服务器方启动,并根据请求提供相应的服务:*打开一通信通道并告知本地主机,它愿意在某公认的端口(如FTP:21)上接收客户请求。*等待客户请求到达该端口。*接收到服务请求,处理该请求并发送