基于Socket的网络编程Socket又称为套接字,是采用客户/服务器模型设计的网络通信接口。Socket接口最早使用在Unix系统中,Windows提供的Socket通信称为WinSock,目前存在v1.1版本(被封装在WinSock.dll动态链接库文件中)和v2.0版本(被封装在WS2_32.dll动态链接库文件中)。v1.1版本是针对Internet而设计的,在v2.0版本中已经不再局限于TCP/IP协议,而是根据Microsoft提出的Windows开放系统架构(WindowsOpenSystemArchitecture,WOSA)模型,定义了一个标准服务提供接口(StandardServiceProviderInterface,SPI)。通过SPI编程接口,WinSock的应用范围扩大到绝大部分的网络和协议。.NETFramework在System.Net.Sockets名空间提供了对WinSock的托管封装,提供Socket、TcpListener、TcpClient、UdpClient以及NetworkStream等类来实现Socket网络通信。类说明Socket对WinSock的封装和扩展TcpListener封装使用TCP协议进行网络侦听的SocketTcpClient封装使用TCP协议进行网络通信的SocketUdpClient封装使用UDP协议进行网络通信的SocketNetworkStream使用流的概念封装网络通信的数据在这些类中,Socket类为核心类,它提供了使用WinSock进行网络通信的基本功能。一、网络编程概念网络中主机间的通信是通过网络协议实现的。目前,存在两种网络通信协议模型:开放系统互连(OpenSystemInterconnection,OSI)参考模型和TCP/IP模型。1、OSI参考模型OSI参考模型是一个多层通信协议模型,所谓开放是指允许任意两个具有不同基本体系结构的系统进行通信的一套协议族。OSI参考模型最初是由国际化标准组织(InternationalStandardOrganization,ISO)开发,1983年成为国际标准。OSI参考模型将网络划分成7层,从上之下分别是:应用层(ApplicationLayer)、表示层(PresentationLayer)、会话层(SessionLayer)、传输层(TransportLayer)、网络层(NetworkLayer)、数据链路层(DataLinkLayer)和物理层(PhysicalLayer)。其中,每一层只与其上下两层直接通信,高层协议偏重于处理用户服务和各种应用请求,底层协议注重于处理实际的信息传输。分层的目的是在于将各种特定的功能分离,并使其实现对其他层来说是透明且相互独立的。下图描述了一个包含通信子网的OSI网络通信模型。(1)物理层物理层定义了与物理介质的连接机制,而不是物理介质本身。按照OSI模型,物理层在物理介质之上,它提供以比特(Bit)为单位形成比特流来传送来自数据链路层的数据,而不理会数据的格式和含义,同样,当接受数据(比特流)时也不加分析直接传送到数据链路层。即对二进制数据(比特)进行编码(发送到物理介质上)和解码(从物理介质上接受)。如:以太网的曼切斯特编码,光纤分布式接口(FiberDistributedDataInterface,FDDI)的4B5B编码。物理层也负责通知数据链路层何时访问介质,如以太网的载波监听功能。此外,在某种程度上,物理层也包含连接策略,主要有:电路交换、报文交换和分组交换。(2)数据链路层数据链路层也称为链路控制层(DataLinkControlLayer,DLC),负责管理数据格式、链路的管理、相邻网络节点的信息流动以及流量控制。在数据链路层中,数据常以帧(Frame)为单位进行传输,帧通常是由包含起始标志的报头或报头位、寻址信息、循环冗余码(CyclicRedundancyCheck,CRC)组成。循环冗余码用来保证帧在传输过程中的完整性,将无错的帧发送到网络层。OSI模型中的数据链路层与电气与电子工程师协会(InstituteofElectricalandElectronicEngineers,IEEE)定义的有所不同。IEEE定义的数据链路层包含逻辑链路控制(LogicalLinkControlLayer,LLC)和介质访问控制(MediaAccessControlLayer,MAC)。MAC层基本对应OSI模型中的数据链路层,LLC层主要提供可靠的面向连接服务与无连接的数据报服务,ISO在这之上提供了两种网络层服务,即面向连接的网络服务和无连接的网络服务。(3)网络层网络层提供跨越多个网络的路由和寻址功能,使两个终端系统能够以最佳路径进行互连,并具有一定的堵塞控制和流量控制能力。在网络层中,通常以数据包(Packet)为单位传输数据。在数据包中可以包含一个16位的校验和,但这个校验和可能只能保证网络层包头的信息,而不能保证数据包信息。如:IP协议(InternetProtocol)。网络层的端到端寻址独立于数据链路层,网络层的寻址由网络标识附加主机标识组成。主机标识指明网络或子网中的一个节点;网络标识可能是子网化的IP,单调的IPX(InternetPacketExchange),也可能是层次化的DECnet(DigitalEquipmentCorporation'snet)。路由信息协议(RoutingInformationProtocol,RIP),或开放式最短路径优先(OpenShortestPathFirst,OSPF)这些协议将有关网络标识的信息广播到其他路由器,以便可以转发相应的数据包。在网络维护中,所使用的Ping指令是在应用层直接使用网络层的ICMP协议(InternetControlMessageProtocol)的服务指令。(4)传输层传输层是一个过渡性层次,在其下3层主要处理网络通信,发送方和接收方之间的每个节点都必须执行下3层的协议,确保数据被准确有效地传输;在传输层及其上3层主要为用户提供服务,工作于发送节点和接受节点之上,确保数据被正确接受,并答复发送节点。传输层在两个通信系统之间建立一条通信链路,允许其上3层不受实际网络结构的约束执行各自的任务,同时依靠其下3层控制实际的网络操作,监督数据从源节点出发,最终到达目标节点。传输层还处理一些由网络层引起的错误,如包丢失、重复包等等,同时还可以对包进行重新排序、分段(用于传输大的报文)和重装,这有助于在网络发生拥塞时降低发送数据的速率。此外,传输层还包括多路复用、连接管理等。(5)会话层会话层提供命名服务,实现逻辑名到网络地址的映射;允许不同主机上的应用程序进行会话或建立虚连接;为丢失的连接事件提供检查。会话层使用逻辑名或别名建立会话,通常在会话建立之后在数据报中嵌入会话标志。不同系列的协议都提供查找与地址相关逻辑名的方法,如:TCP/IP协议族使用域名服务系统(DomainNameSystem,DNS),IPX/SPX采用NetWare服务广播协议(ServiceAdvertisingProtocol,SAP)。会话层协议还包括NetBIOS(NetworkBasicInputandOutputService)、远程过程调用(RemoteProcedureCall,RPC)等。(6)表示层表示层用于解决信息与数据的区别。数据是信息的载体,信息是人为赋予的含义,在计算机中表示的比特位不能表达其内容,并且不同计算机表示相同信息的方式各不相同。表示层管理抽象的数据结构,定义数据的语法和语义,提供数据压缩、解压、加密、解密等服务,在必要时可以对应用层的数据进行转换。(7)应用层应用层直接与用户或应用程序通信,它通过Shell或转向器(Redirector)机制来支持本地操作系统。它将文件、打印和消息服务的API(ApplicationProgrammingInterface,应用程序接口)转换成通用语言,如:Windows系统中的服务器消息块(ServerMessageBlock,SMB),实现对不同操作系统的支持。典型的网络应用有服务、电子邮件、文件传输、虚拟终端、分布式系统等。在使用OSI的7层模型进行数据传递过程中,每一层都对网络数据流都加上报头进行重新封装或重组,其传递过程可用下图描述:2、TCP/IP模型OSI参考模型常作为理论模型,实际应用中使用的是TCP/IP模型。TCP/IP模型是事实上的工业标准模型。TCP/IP代表一套工业标准协议套件,TCP协议和IP协议是其中最著名的协议,1969年由美国国防部高级研究计划局(DepartmentofDefenseAdvancedResearchProjectAgency,DARPA)开发,最早应用在ARPNET上,现已形成广为人知的Internet。TCP/IP模型将网络划分成4个层次,与OSI参考模型之间的关系可用下图说明:(1)网络接口层网络接口层相当于OSI模型中的数据链路层和物理层。通常包含在操作系统的设备驱动程序和网络接口设备中,它们一起处理与物理介质的物理接口细节。(2)网际层(IP层)网际层相当于OSI模型中的网络层,负责寻址、打包以及包转发机制。网络层协议主要包含互联网协议(InternetProtocol,IP)、互联网控制报文协议(InternetControlMessageProtocol,ICMP)和互联网组管理协议(InternetGroupManagementProtocol,IGMP)。IP协议是TCP/IP协议族中核心协议,所有的TCP、UDP、ICMP以及IGMP数据都是以IP数据包格式传输,它提供不可靠、无连接的数据包传送服务。这里的“不可靠”是指IP协议不能保证IP数据包能成功地传送到目标主机,IP仅提供最好的传输服务,当发生传输错误时,IP丢弃该数据包,发送ICMP消息报给发送数据的信源端;“无连接”是指IP并不维护任何有关后续数据包的状态信息,每个数据包的处理是相对独立的,这也说明,IP数据包可以不按发送顺序接受。ICMP协议是面向连接的协议,用于在IP主机、路由器间传送出错报告控制消息。提供诊断功能,报告由于IP数据包投递失败而导致的错误。IGMP协议是用于组播的协议,负责管理IP组播,将UDP数据报发送给同组主机。这两个协议实际上应用到TCP层协议的内容。在有些情况下,将地址解析协议(AddressResolutionProtocol,ARP)和反向地址解析协议(ReverseAddressResolutionProtocol,RARP)也认为是网际层的一部分。这是因为这两个协议使用到网际层的功能。ARP协议通过广播方式将IP地址翻译成对应的MAC地址,与之对应的是RARP协议,它实现将MAC地址翻译成对应的IP地址。(3)主机到主机的传输层(TCP层)主机到主机的传输层相当于OSI模型中的传输层和部分会话层功能,它提供给应用层会话和数据报通信服务,其核心协议为传输控制协议(TransmissionControlProtocol,TCP)和用户数据报协议(UserDatagramProtocol,UPD)。TCP协议提供点到点的、面向连接的可靠通信服务,负责建立TCP连接,对发送包进行编号和应答,并恢复在传输过程间丢失的包。UPD协议提供点到点或点到对点、无连接的不可靠通信服务,通常用于传输少量数据。(4)应用层应用层负责处理特定的应用程序细节,为应用程序提供访问其他层的能力,定义应用程序用于交换数据的协议。常用的协议有:a)域名系统(DomainNameSystem,DNS),用于将主机名解析成IP地址。b)路由选择信息协议(RoutingInformationProtocol,RIP),用于路由器在IP网络上交换路由选择信息。c)简单网络管理协议(SimpleNetworkManagementProtocol,SNMP),用于在网络管理控制台和网络设备(路