您好,欢迎访问三七文档
当前位置:首页 > 机械/制造/汽车 > 制造加工工艺 > 第3章_Socket编程基础
第三章套接字编程基础NetworkAdvancedProgramming主要内容网络编程基础Socket网络编程接口的产生与发展Socket工作原理WinSocket编程基础WinSock编程模型SocketI/O模型Winsock基本APINetworkAdvancedProgramming网络程序在网络体系结构中的位置从功能上,网络程序分为两部分:通信模块—分布式应用基础用户交互或后台处理模块NetworkAdvancedProgramming实现网间进程通信必须解决的问题进程间的标识如何与网络协议栈连接应用程序需要一个简单的方式与协议栈连接多重协议栈的识别多重协议栈:TCP/IP,IPX/SPX(NetWareOS),AppleTalk等不同的通信服务不同的网络应用有不同的通信服务要求NetworkAdvancedProgramming网间进程的标识IP地址--在网络中标识主机IP地址(网络号+主机号)传输层端口--标识进程端口是TCP/IP协议族中,应用层进程与传输层协议实体间的通信接口;从实现的角度讲,端口是一种抽象的软件机制,包括一些数据结构和I/O缓冲区;应用程序需要与端口建立绑定关系;每个端口都拥有一个叫作端口号(portnumber)的整数型标识符;NetworkAdvancedProgramming客户与服务器第一次通信NetworkAdvancedProgramming使用端口号来判断服务Webserver(port80)客户端202.5.7.8服务端128.2.194.242FTPserver(port21)Servicerequestfor128.2.194.242:80(i.e.,theWebserver)Webserver(port80)FTPserver(port21)Servicerequestfor128.2.194.242:21(i.e.,theFTPserver)TCP/IP协议栈TCP/IP协议栈ClientClientNetworkAdvancedProgramming标识网间进程TCP和UDP端口号分配端口0:不使用,或者作为特殊的使用;端口1-254:保留给特定的服务,TCP和UDP均规定,小于256的端口号才能分配给网上著名的服务;端口255-1023:保留给其他的服务,如路由;端口1024-4999:可以用作任意客户的端口;端口5000-65535:可以用作用户的服务器端口进程的网络地址的概念在因特网络中,用一个三元组可以在全局中唯一地标识一个应用层进程:应用层进程地址=(传输层协议,主机的IP地址,传输层的端口号)这样一个三元组,叫做一个半相关(halfassociation),它标识了因特网中,进程间通信的一个端点,也把它称为进程的网络地址。NetworkAdvancedProgramming网络中进程通信的标识一个完整的网间通信需要一个五元组在全局中唯一地来标识:(传输层协议,本地机IP地址,本地机传输层端口,远地机IP地址,远地机传输层端口)这个五元组称为一个全相关(association)。即两个协议相同的半相关才能组合成一个合适的全相关,或完全指定一对网间通信的进程。NetworkAdvancedProgrammingNetworkAdvancedProgramming网络协议的特征面向消息的协议vs.基于流的协议面向连接的服务vs.无连接的服务面向连接服务是电话系统服务模式的抽象,即每一次完整的数据传输都要经过建立连接,使用连接,终止连接的过程。无连接服务是邮政系统服务的抽象,每个分组都携带完整的目的地址,各分组在系统中独立传送可靠性vs.次序性NetworkAdvancedProgramming三类网络编程基于TCP/IP协议栈的网络编程基于TCP/IP协议栈的网络编程是最经典的网络编程方式,主要是使用各种编程语言,利用操作系统提供的套接字网络编程接口,直接开发各种网络应用程序。本书主要讲解这种网络编程的相关技术。基于应用的网络编程JAVA,HTML,ASP,PHP基于.NET框架的WebServices网络编程NetworkAdvancedProgrammingC/S模式Clientasks(request)–serverprovides(response)Typically:singleserver-multipleclientsTheserverdoesnotneedtoknowanythingabouttheclienteventhatitexistsTheclientshouldalwaysknowsomethingabouttheserveratleastwhereitislocatedClientprocessServerprocess1.Clientsendsrequest2.Serverhandlesrequest3.Serversendsresponse4.ClienthandlesresponseResourceNetworkAdvancedProgrammingC/S模式C/S模式,因特网上应用程序最常用的通信模式。客户方采取的是主动请求方式,其工作过程是:(1)打开一通信通道,并连接到服务器所在主机的特定监听端口。(2)向服务器发送请求报文,等待并接收应答;继续提出请求,与服务器的会话按照应用协议进行。(3)请求结束后,关闭通信通道并终止。NetworkAdvancedProgrammingC/S交互模式服务器的工作过程:(1)打开一通信通道,并告知服务器所在的主机,它愿意在某一公认的地址上(熟知端口,如FTP为21)接收客户请求。(2)等待客户的请求到达该端口。(3)服务器接收到服务请求,处理该请求并发送应答信号。(4)返回第二步,等待并处理另一客户请求。(5)在特定的情况下,关闭服务器。NetworkAdvancedProgramming服务器的工作方式若有多个客户端同时请求,服务器如何处理?循环方式(iterativemode)在计算机中一次只运行一个服务器进程。当有多个客户进程请求服务时,服务器进程就按请求的先后顺序依次做出响应。并发方式(concurrentmode)在计算机中同时运行多个服务器进程,而每一个服务器进程都对某个特定的客户进程做出响应。NetworkAdvancedProgramming服务端的并发性并发性是C/S模式的基础,并发允许多个客户获得同一种服务,而不必等待服务器完成对上一个请求的处理。这样才能很好地同时为多个客户提供服务。操作系统支持并发性程序开发Unix系统:fork(),创建新进程Windows系统:CreateThread(),创建新线程NetworkAdvancedProgramming服务器的设计方式服务器设计方式由采用的传输层协议和工作方式决定;(TCP/UDP)+(循环/并发)四种设计方式:面向连接的并发面向连接的循环无连接的并发无连接的循环NetworkAdvancedProgrammingTCPTCP客户临时端口临时端口TCP客户临时端口TCP客户临时端口主服务器TCP连接熟知端口仅用于接受服务请求创建从属服务器面向连接的并发服务器主服务器主要流程在周知端口上设置监听模式While(true){若在周知端口上有客户端的TCP连接请求;进行三次握手建立TCP连接;创建从属服务器(用临时端口与客户端进行通信);}NetworkAdvancedProgramming无连接循环服务器UDP服务器UDP客户临时端口熟知端口UDP客户临时端口UDP客户临时端口一次一个客户服务器只使用一个熟知端口。每一个客户则使用自己创建的临时端口(端口号自己设定)。TCP/IP网络程序框架面向连接的C/S程序工作流程无连接的C/S程序工作流程通俗解释socketsocket是网络编程的基础,用打电话来类比socket通信中建立TCP连接的过程。socket函数,表示你买了或者借了一部手机。bind函数,告诉别人你的手机号码,让他们给你打电话。listen函数,打开手机的铃声,而不是静音,这样有电话时可以立马反应。listen函数的第二个参数,最大连接数,表示最多有几个人可以同时拨打你的号码。不过我们的手机,最多只能有一个人打进来,要不然就提示占线。NetworkAdvancedProgramming通俗解释socketconnect函数,你的朋友知道了你的号码,通过这个号码来联系你。在他等待你回应的时候,不能做其他事情,所以connect函数是阻塞的。accept函数,你听到了电话铃声,接电话,acceptit!然后“喂”一声,你的朋友听到你的回应,知道电话已经打进去了。至此,一个TCP连接建立了。read/write函数,连接建立后,TCP的两端可以互相收发消息,这时候的连接是全双工的。对应打电话中的电话煲。NetworkAdvancedProgramming通俗解释socketclose函数,通话完毕,一方说“我挂了”,另一方回应你挂吧,然后将连接终止。实际的close(sockfd)有些不同,它不止是终止连接,还把手机也归还,不在占有这部手机,就当是公用电话吧。NetworkProgramming通俗解释socket注意到,上述连接是阻塞的,你一次只能响应一个用户的连接请求,但在实际网络编程中,一个服务器服务于多个客户,上述方案也就行不通了,怎么办?想一想1860,移动的声讯服务台,也是只有一个号码,它怎么能同时服务那么多人呢?可以这样理解,在你打电话到1860时,总服务台会让一个接线员来为你服务,而它自己却继续监听有没有新的电话接入。在网络编程中,这个过程类似于fork一个子进程,建立实际的通信连接,而主进程继续监听。1860的接线员是有限的,所以当连接的人数达到上线时,它会放首歌给你听,忙等待,直到有新的空闲接线员为止。NetworkProgramming面向连接的C/S程序工作流程(TCP)服务器端工作流程使用WSAStartup()函数检查系统协议栈安装情况使用socket()函数创建服务器端通信套接口使用bind()函数将创建的套接口与服务器地址绑定使用listen()函数使服务器套接口做好接收连接请求准备使用accept()接收来自客户端由connect()函数发出的连接请求根据连接请求建立连接后,使用send()函数发送数据,或者使用recv()函数接收数据使用closesocket()函数关闭套接口(可以先用shutdown()函数先关闭读写通道)最后调用WSACleanup()函数结束WinsockSocketsAPI面向连接的C/S程序工作流程(TCP)客户端程序工作流程使用WSAStartup()函数检查系统协议栈安装情况使用socket()函数创建客户端套接口使用connect()函数发出也服务器建立连接的请求(调用前可以不用bind()端口号,由系统自动完成)连接建立后使用send()函数发送数据,或使用recv()函数接收数据使用closesocet()函数关闭套接口最后调用WSACleanup()函数,结束WinsockSocketsAPI面向连接的C/S程序工作流程(TCP)服务器与客户端五元组的建立五元组协议本地IP地址,本地端口号远程IP地址,远程端口号服务器端五元组由socket()确定由服务器端调用bind()时确定由accept()确定客户端五元组由socket()确定由客户端的bind()调用确定。如果客户端没有进行bind()调用,或调用了bind()但没有指定具体地址或端口号,则由系统内核自动确定地址和端口由connect()确定面向连接的C/S程序工作流程图(TCP)WSAStartup()socket()bind()li
本文标题:第3章_Socket编程基础
链接地址:https://www.777doc.com/doc-2155558 .html