1、第第2 2讲讲 协议软件接口协议软件接口WindowsWindows网络编程基础网络编程基础1.1.协议的软件接口协议的软件接口1.TCP/IP协议软件接口的特点现象:TCP/IP标准没有规定应用软件与TCP/IP协议软件如何接口的细节,只建议了所需的功能集。操作系统操作系统应用程序应用程序TCP/IP实现实现?TCP/IP协议软件接口协议软件接口特点:不精确指明TCP/IP的设计者尽量避免使用任何一家厂商的内部数据表示。TCP/IP标准尽量避免让接口使用那些只在某一家厂商的操作系统中可用的特征目的:使得协议的兼容性强,可以运行在多厂商的环境之中。目前的一些协议软件接口Berkeley UNI
2、X:套接字接口(或socket)微软:Windows SocketAT&T UNIX(System V):TLI(Transport Layer Interface)1.TCP/IP协议软件接口的特点2.如何访问TCP/IP协议?两种基本方法:设计者发明一种新的系统调用,应用程序用它们来访问TCP/IP;列举出所有的概念性操作为每个操作指定一个名字和参数将每个操作实现为一个系统调用设计者使用一般的I/O调用访问TCP/IP扩充一般的I/O原语两种方法综合问题的引入Linux系统的I/O模型一般模式:打开打开读读/写写关闭关闭步骤:调用“打开”获得对文件或设备的使用权,并返回整型的文件描述符,此
3、后使用它对该文件或设备进行I/O操作;多次调用“读/写”传输数据;所有传输操作完成后,用户调用“关闭”,通知操作系统已经完成了对某个对象的使用。Linux中提供的基本I/O功能操作 含义open为输入或输出操作准备一个设备或文件close终止使用以前已经打开的设备或文件read从输入设备或文件中获得数据,将数据放到应用程序的存储器中write将数据从应用程序的存储器传导输出设备或文件lseek转到文件或设备中的某个指定位置ioctl控制设备或用于访问该设备软件(如:指明缓存的大小或改变字符集的映射)Linux中对文件操作打开一个文件读取一个文件关闭文件int desc;desc=open(“f
4、ilename”,O_RDWR,0);read(desc,buffer,128);close(desc);TCP/IP的角色:相当于一种新的I/O操作,但比普通应用程序与传统的I/O操作的相互作用复杂得多。网络应用程序要解决的问题:进行网络I/O操作的两个进程在不同机器上,如何建立它们之间的联系?网络协议有很多种,如何建立一种通用机制以支持多种协议?如何扩充一般的I/O原语?1.1.协议的软件接口协议的软件接口2.2.套接字套接字一个本地主机建立或拥有的应用程序一个本地主机建立或拥有的应用程序,在操作系在操作系统控制下的统控制下的,与其它与其它(远程远程)应用进程之间发送和接应用进程之间发送和
5、接收数据的接口。收数据的接口。socketsocketsocketsocket(套接字)(套接字)socket 是进行程序间通讯(IPC)的 BSD 方法。客户将插头插入一个服务器端口建立一个双向的连接管道客户端服务器插口(port)socket的抽象表示Berkeley套接字时间:20世纪80年代早期资助方:远景研究规划局(Advanced Research Projects Agency,ARPA)研究方:加利福尼亚大学伯克利分校产品:套接字接口(套接字API)方法:扩充已有的系统调用增加新的系统调用方法socket程序设计中的几个重要概念端口:为网络通信进程设置一些抽象的访问点,提供了多
6、路输出数据到指定应用程序的方法;端口数据管理:每一端口有一缓冲区来存放进入该端口的数据队列;OS提供机制,创建或唤醒相应进程来处理相应端口数据。半相关:三元组(协议,本地地址,本地端口号)唯一标识本地通信一方;全相关:五元组(协议,本地地址,本地端口号,远地地址,远地端口号),标识一个完整的网络通信。进行网络进行网络I/OI/O操作的两个进程在操作的两个进程在不同机器不同机器上,如何建上,如何建立它们之间的联系?立它们之间的联系?全相关在客户-服务器应用中的体现客户端:(主动一方)服务器的IP地址:知道向谁请求服务 客户机的IP地址:让服务器知道把数据传送给谁 服务器的端口号:知道服务器上究竟
7、是谁来提供服务 客户端的端口号:服务器知道最终把数据传送到哪 使用的传输层服务:要求可靠的传输,还是不可靠的传输?服务器:(被动方,与客户端类似)解决方法套接字类型 流式套接字(SOCK_STREAM):提供面向连接的、可靠的字节流服务,用于TCP。数据报套接字(SOCK_DGRAM):提供无连接的,不可靠的数据报服务,用于UDP。原始套接字(SOCK_RAW):允许对较低层的协议,如IP、ICMP直接访问。网络协议有很多种,如何建立一种网络协议有很多种,如何建立一种通用通用机制以支持机制以支持多种协议多种协议?将Linux中的 I/O用于TCP/IP扩展文件描述符集(+网络通信所使用的描述符
8、)扩展read和write这两个系统调用(+网络操作功能)其它考虑:指明地址(IP,PORT)指明通讯方式(TCP,UDP,IP)确定通讯角色(Client,Server)处理数据格式套接字描述符和文件描述符用于文件用于文件1的内部数据结构的内部数据结构用于文件用于文件0的内部数据结构的内部数据结构用于文件用于文件2的内部数据结构的内部数据结构用于文件用于文件3的内部数据结构的内部数据结构用于套接字用于套接字1的内部数据结构的内部数据结构3.2 套接字的抽象概念 文件描述符表文件描述符表(一个进程一张)(一个进程一张)0:1:2:3:4:5:针对套接字的系统数据结构 文件描述符表文件描述符表(
9、一个进程一张)(一个进程一张)0:1:2:3:4:5:用于文件的内部数据结构用于文件的内部数据结构Family:PF_INETService:SOCK_STREAMLocalIP:202.196.63.5RemoteIP:22.196.56.3Local Port:4000Remote Port:8000用于套接字的内部数据结构用于套接字的内部数据结构端点地址端点地址socket编程步骤 建立一个socket 配置socket 连接socket 通过socket发送数据 通过socket接收数据 关闭socketOSIOSI模型与套接口模型与套接口套套接接口口用户进程用户进程内核内核应用层细节
10、应用层细节通信细节通信细节思考考察一种提供消息传递的操作系统,你将如何扩展应用程序接口使其适用于网络通信?猜一宋词名句猜一宋词名句if(item)&(!people)everything=false;if(tears.setFlowing()try Speaker skr=new Speaker()catch IOException e;1.1.协议的软件接口协议的软件接口2.2.套接字套接字3.Winsock3.Winsock 1.1983年,加利弗尼亚大学Berkely学院推出了UNIX下的网络通信接口Socket。2.90年代初,Sun Microsystems、JSB Corporat
11、ion、FTP software、Microdyne和微软等公司共同参与制定了Windows Socket规范,试图使Windows下的Sockets程序设计标准化。3.1992年制定Windows Socket规范1.0版,将Socket从UNIX移植到DOS和Windows下。4.1993年1月,制定了Windows Socket 1.1版。5.1994年5月,WinSock小组启动WinSock2规范制定工作。6.1997年5月,WinSock2的正式规范版本2.2.1发布。l 发展历史6 Windows socket Windows Socket API是Windows的网络程序接口,
12、它包括一个标准的Berkeley Socket功能函数集合,和为Windows所作的扩充。扩充的功能都冠以WSA(Windows Socket Asynchronous)的前缀,表明它们都允许异步的I/O操作,并且采用了符合Windows消息机制的网络事件异步选择机制。WinSock API 开发组件 功能:供程序员开发Windows Socket应用程序 组成:a.介绍Windows Socket实现的文档 b.Windows Socket应用程序接口(API)导入库 c.一些头文件 其中WINSOCK.H:包括了WinSock实现所定义的宏、常数值、数据结构和函数调用接口原型;运行组件 W
13、INSOCK.DLL:Windows应用程序接口的动态链接库(DLL),应用程序在执行时通过装入它实现网络通信功能。两组运行必须的组件:第一版:winsock.h winsock.dll winsock.lib第二版:winsock2.h ws2_32.dll ws2_32.lib1.WinSock的组成 异步选择机制当使用它登记的网络事件发生时,Windows应用程序相应的窗口接收到一个消息,消息中指示了发生的网络事件,以及与事件相关的一些信息。异步请求函数增加了异步请求服务函数WSAAsyncGetXByY();允许应用程序采用异步方式获取请求信息,并在请求的服务完成时给应用程序的窗口发送
14、一个消息。阻塞处理方法当一个应用程序的套接字处于阻塞时,使其放弃CPU,让其它应用程序运行。2.对Berkeley Socket的扩充出错处理WSAGetLastError():获取最近错误号 WSASetLastError():设置最近错误号启动与终止在使用任何Windows Sockets API调用之前,必须先调用启动函数WSAStartup()来完成Windows Sockets DLL的初始化,协商版本支持,分配必要的资源。在应用程序完成了对Windows Sockets的使用之后,必须调用函数WSACleanup()从Windows Sockets实现中注销自己,并允许实现释放为其
15、分配的任何资源。2.对Berkeley Socket的扩充 套接字函数 数据库函数 Windows扩充的专有函数Windows Socket 1.1库函数第一类:套接字函数 功能:完成套接字的创建、关闭以及对套接字的命名和名字获取。一套接字函数第二类:网络连接函数功能:完成网络连接的建立与关闭。一套接字函数第三类:数据传输函数 功能:完成数据的发送与接收。一套接字函数第四类:字节顺序转换函数 功能:完成主机字节顺序和网络字节顺序之间的转换。一套接字函数第五类:地址转换函数 功能:完成IP地址的点分十进制形式和二进制整数形式之间的转换。一套接字函数第六类:套接字控制函数 功能:设置/获取套接字的
16、选项;控制/检测套接字的工作状态。一套接字函数获得一组套接字的状态,以实现异步获得一组套接字的状态,以实现异步I/O操作操作二.数据库函数第一类:启动与终止函数 三.Windows Socket专用的增设函数启动函数:WSAStartup()函数定义:int WSAStartup(WORD wVersionRequested,LPWSADATA lpWSAData)输入参数:wVersionRequested:用户使用的Windows Socket最高版本,低字节为主版本,高字节为次版本。lpWSAData:存放了Windows Socket实现的细节。返回值:成功返回0;失败返回错误码。终止
17、函数:WSACleanup()函数定义:int WSACleanup(void)说明说明:必须在所有的套接字函数之前调用:必须在所有的套接字函数之前调用说明说明:必须在:必须在套接字操作完成后调用该函数套接字操作完成后调用该函数第二类:异步服务函数 三.Windows Socket专用的增设函数第三类:基于消息机制的异步I/O函数 第四类:阻塞处理函数第四类:阻塞处理函数 三.Windows Socket专用的增设函数函数名功能WSAAsyncSelect()Berkeley套接字中的select在WinSock中的扩充,获得一组套接字的状态,以实现基于消息机制的异步I/O操作。第五类:错误处理函数 说明:说明:调试程序时非常有用;调试程序时非常有用;MSDN索引:索引:Win32 Error Codes和和Net Error Codes;例如:例如:1006010060(WSAETIMEDOUTWSAETIMEDOUT):连接超时):连接超时 三.Windows Socket专用的增设函数说明:扩充了新的内容,同时与Windows Sockets 1.1向后兼容。编 写 应 用 程 序 时 需 要 包 含 头 文 件:“Winsock2.h.”在32位Windows下应包含WS2_32.lib,使用WS2_32.DLL。四、Windows Socket 2 扩展