文档库 最新最全的文档下载
当前位置:文档库 › 网络编程

网络编程

网络编程
网络编程

1.TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议)是一系列,或者说是一个协议族,它定义了数据传输如何通过因特网进行交换。它具有开放性的特点。

2.OSI/RM(Open System Interconnection/Reference Model,开放系统互连参考模型)将计算机网络通信定义为一个七层框架模型,如图1.1所示。

表1.1 OSI模型中各个层的功能

每一层负责的功能如下:

·链路层:有时被称作数据链路层或网络接口层,通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡,它们一起处理与电缆(或其他任何传输媒介)的物理接口细节。

·网络层:有时也被称为互联网层,负责分组在网络中的活动,包括IP(网际协议)、ICMP(Internet控制报文协议)以及IGMP(Internet组管理协议)。

传输层:该层主要为两台主机上的应用程序提供端到端的数据通信,它分为两个不同的协议——TCP(传输控制协议)和UDP(用户数据报协议)。TCP提供端到端的质量保证的数据传输,该层负责数据的分组、质量控制和超时重发等,对于应用层来说,就可以忽略这些工作。UDP则只负责简单地把数据报从一端发送到另一端,至于数据是否到达或按时到达、数据是否损坏都必须由应用层来做。这两种协议各有用途,前者可用于面向连接的应用,而后者则在及时性服务中有着重要的用途,如网络多媒体通信等。

·应用层:该层负责处理实际的应用程序细节,包括Telnet、HTTP、SMTP、FTP、DNS 和SNMP等协议和应用。

3.特殊的IP地址:

·网络地址:IP中主机地址为0的地址表示网络地址,如128.211.0.0。

·广播地址:网络号后跟一个所有位全是1的后缀,就是直接广播地址。

·回送地址:127.0.0.1用于测试。

(功能)域名系统:

一个系统的全域名由主机名、域名和扩展名三部分组成,各部分间使用“.”分隔,例如https://www.wendangku.net/doc/fa17281683.html,。在TCP/IP应用中,域名系统(DNS)是一个分布的数据库,由它来提供IP 地址和主机名之间的映射信息,可以通过在程序中调用标准库函数来编程实现域名与IP地址之间的相互转换。通过从域名地址到IP地址的映射,使得在日常的网络应用中可以使用域名这种便于记忆的网络地址表示形式。

所有的网络应用程序理论上都应该具有内嵌的域名解析机制。

数据包的封装和分用:

当应用程序用TCP传送数据时,数据被送入协议栈中,然后逐个通过每一层,直到被当作一串比特流送入网络。其中每一层对收到的数据都要增加一些首部信息(有时还要增加尾部信息),该过程如图1.5所示。TCP传给IP的数据单元称作TCP报文段或简称TCP段。IP传给网络接口层的数据单元称作IP数据报(IP Datagram)。通过以太网传输的比特流称作帧(Frame)。图1.5中帧头和帧尾下面所标注的数字是典型以太网帧首部的字节长度。以太网数据帧的长度必须在46~1518字节之间。

4.以太网数据链路层帧结构

IEEE 802.3定义了一种具有七个字段的帧(MAC):前导符、起始帧分界符、目标地址、源地址、PDU的长度/类型、数据以及CRC。以太网不提供任何对收到的帧进行确认的机制,确认在高层完成,这表明它是一种不可靠的介质。CSMA/CD中MAC帧的格式

前导符(Preamble):该字段长7个字节(56位),其中1和0交替出现,警告接收系统即将有数据帧到来,同时同步系统时序。

·起始帧分界符(SFD):该字段长1字节,为10101011,标志帧的开始。SFD通知接收方后面所有的内容都是数据。

·目标地址(Destination Address):该字段长6个字节,包含了数据帧的目的物理地址。一个系统的物理地址是一个在它的网络接口卡(NIC)上编码的比特模式。每一个NIC由一个独一无二的地址将它和其他所有的NIC区别开来。

·源地址(Source Address):该字段同样长6个字节,包含转发数据帧的最后一个设备的物理地址。该设备可以是发送站点,也可以是接收和转发数据包的最近路由器。

· PDU的长度/类型(Length/Type):该字段的两个字节指出PDU的长度或封装的数据类型。当PDU的长度固定时,这个字段可以用来表示数据类型,如IP(0x0800)、ARP(0x0806)、RARP(0x8035)等。在以太网中,如果高层协议采用TCP/IP协议族,则MAC帧的结构如图1.8所示(没有标出前导符和起始帧分界符)。

·数据:保存高层协议的数据(PDU)。

·CRC:IEEE 802.3MAC帧的最后一个字段是检错信息,通常为CRC-32。

5.IP

IP负责在TCP/IP主机之间提供数据报服务,进行数据封装及产生协议头。由于在以太网中帧的大小要受到限制,并且不同的帧可能由不同的网络路径传送,因此IP协议需要将较大的数据报文分割开来,并在目的主机处按正确顺序组合。另外,IP协议不负责包的校验,它是一种无连接、不可靠的传输。如果发生任何错误,IP协议则丢弃该数据报,然后发送ICMP消息报给信源端。IP协议还要负责寻找路由,因此它还需要配套一个确定的IP地址。在IP报文的包头中包含了源与目的IP地址。一般来说不会有应用程序直接访问IP协议。

IP数据报是Internet上数据通信的基本单元,这些数据报不超过1000字节长,当人们打开Web页、下载文件或者发送E-mail时,这些数据报就在世界各地来回传输。IP数据报的报文格式如图所示

· IP数据报头的最小长度是5个字(word,1字=4字节),如果有其他选项,报头可能会更长。IPv4数据报中的数据(包括报头中的数据)以32位(4字节)的方式来组织。IPv4中包含至少12个不同字段,且在没有选项时长度为20个字节,但在包含选项时可达60个字节。·版本(VERS):指定IP协议的版本号,对于IPv4来说,版本为4。

·报头长度(HLENS):指定IP报头的长度,以字为单位,范围为5~15个字。

·服务类型(ToS,Type of Service):表示数据报的服务类型,即处理的优先级,包括延时、吞吐量、可靠性或代价,它在IPv4中的应用并不广泛。

·报文总长度(Total Length):以字节为单位指定数据报的总长度,IP数据报的长度最大为65 535字节,网络主机可以使用数据报长度来确定一个数据报的结束和下一个数据报的开

始;当传送长度超过65 535字节的IP数据报时,大多数的链路层都会分片。主机一般要求接收的数据报不超过576字节。由于TCP把用户数据分成若干片,因此,一般来说这个限制不会影响TCP。

·标识符(ID):该16位标识符由产生它的主机唯一指定给数据报,分段后的数据报共享同一个数据报ID,有助于接收主机对分段的数据报重装。

·标志(FLG):包括3个1位标志,标识报文是否允许被分段和是否使用了这些域。第一位保留并设为0;第二位标识报文能否被分段,其中0表示报文可以被分段,1表示报文不能被分段;第三位只有在第二位为0时才有意义,这一位标识此报文是否是这一系列分段的最后一个,或者接收应用程序是否还希望有更多的段,0指示报文是最后一个。

·分段偏移量(Fragment Offset):指定分段在整个数据报中的位置。接收主机同时使用标志位和分段偏移,以重组被分段的数据报。这个值以64位为单位递增。

生命周期(TTL,Time To Live):代表数据报在被丢弃前能够穿越的最大主机跳数。TTL的初始值由源主机设置,其理论最大值为255,每经过一个处理节点减1。当该字段的值为0时,报文就被认为是不可转发的,之后产生一个ICMP报文发回源主机,并丢弃该不可转发的报文。

·协议(Protocol):指明数据报中携带的载荷类型,主要标识所使用的协议,一般是指TCP 协议、UDP协议、ICMP报文和IGMP报文。

·头校验和(Header Checksum):目的是保证报头的正确性,目的机、网络中的每个网关都要重新计算报头的校验和,如果计算出的校验和与报文所含的校验和不同,则丢弃该报文·源IP地址(Source IP Address):指明数据报的发送方地址。

·目的IP地址(Destination IP Address):指明数据报的接收方地址。

·选项(Options):在IPv4中,主要用于网络测试和调试。

·填充区(Padding):为了保证IP头长度是32位的整数倍,要填充额外的0。

IP协议是TCP与UDP的基础。TCP和UDP的每组数据都通过端系统和每个中间路由器中的IP层在互联网中进行传输。ICMP作为IP协议的附属协议,用来与其他主机或路由器交换错误报文和其他重要信息。IP层协议的另一个附属协议是IGMP(Internet组管理协议),它用来把一个UDP数据报多播或组播到多个主机。

6.TCP提供一个可靠连接的方式是通过三次握手(Three-way Handshake)来完成的。三次握手是指通信双方彼此交换三次信息。三次握手是在存在包丢失、重复和延迟的情况下,确保通信双方信息交换确定性的充分必要条件。三次握手的操作过程如图所示

(1) 请求端(通常称为客户)发送一个SYN段,指明客户打算连接的服务器的端口以及初始序号(SEQ)。这个SYN段为报文段1。

(2) 服务器发回包含服务器的初始序号的SYN报文段(报文段2)作为应答。同时,将确认序号设置为客户的ISN加1,用以对客户的SYN报文段进行确认。一个SYN占用一个序号。

(3) 客户必须将确认序号设置为服务器的ISN加1,用以对服务器的SYN报文段进行确认(报文段3)。

上述三个过程依次完成,即表明建立了TCP连接。建立一个TCP连接需要三次握手,而正常终止一个连接要经过四次握手,这是由TCP的半关闭(half-close)特性造成的。由于TCP 是全双工连接,每个方向的连接必须单独关闭,因此当一方完成数据发送任务后必须发送一个FIN标志来终止这个方向的连接。当一端收到一个FIN后,必须通知应用层另一端已经终止了该方向的数据传送。发送FIN通常是应用层关闭连接的结果。

TCP连接收到一个FIN标志只意味着对方已不再发送数据,但己方仍能发送数据,这是半关闭型应用。正常关闭过程如下图所示。

下图中的报文段1发起终止连接,TCP客户端发送一个FIN,用来关闭从客户机到服务器的数据传送。当服务器收到这个FIN时,它发回一个ACK,确认序号为收到的序号加1(报文段2)。和SYN一样,一个FIN占用一个序号,同时TCP服务器还向应用程序传送一个文件结束符。接着这个服务器程序就关闭它的连接,TCP端发送一个FIN(报文段3),客户必须发回一个确认,并将确认序号设置为收到的序号加1(报文段4)。

7.UDP

UDP(User Datagram Protocol)即用户数据报协议,它属于面向无连接、不可靠传输的类型。该协议只负责接收和传送由上层协议传递的消息,它本身不做任何检测、修改与应答,上层协议需要自己处理这些事务。

UDP的报头格式较简单,主要是地址信息、包的长度和校验信息。TCP包的头信息有10多个域。因此,UDP的网络开销一般要小于TCP。由于UDP在传送数据过程中没有建立连接,亦不进行检查,因此在良好的网络环境中,其工作效率较TCP要高。由于UDP的这种特点,因此它也是进行网络广播的首选协议。UDP的报头格式如图所示。

·源端口(Source Port):16位的源端口是发送端上的连接端口,它和IP首部中的源IP 地址的作用是标识发送UDP报文的计算机及应用程序。

·目的端口(Destination Port):16位的目的端口是接收端上的连接端口,它和IP 首部中的目的IP地址的作用是标识接收报文的计算机及应用程序。

·报文长度(Total Length):报文长度字段为16位,存储UDP首部和UDP数据的字节长度,最小值为8字节。

·校验和(Checksum):16位的校验和字段存储基于报文的内容计算得到的错误检查信息。接收端执行和发送端相同的数学计算,若两个计算值不同则表明报文在传输过程中

出现了错误。

8.ARP/RARP

ARP(Address Resolution Protocol,地址解析协议)和RARP(Reverse Address Resolution Protocol,逆向地址解析协议)是某些网络接口(如以太网和令牌环网)使用的特殊协议,用来转换IP层和网络接口层使用的地址。

每一块网卡(NIC,Network Interface Card)都有一个唯一的硬件地址(是由网卡的生产厂商设置的,需要使用特殊的方式才可以修改)。这个硬件地址称为MAC(Medium Access Control,媒体访问控制)。

一块网卡依据数据帧的包头信息中是否写有它的MAC地址来决定是否接受并上传该帧。分配给主机使用的IP地址和它固有的MAC地址是互不相干的。IP地址只对TCP/IP有效,MAC地址只对网络访问层有意义。在物理网络上的数据帧交换依赖于MAC地址,ARP 实现了从IP地址到MAC地址的映射,而RARP负责根据NIC硬件地址去查询对应的IP地址。

ARP要求网络接口有一个硬件地址。在硬件上进行的数据帧交换必须有正确的接口地址。

ARP中规定了两种信息的基本类型:请求(Request)和应答(Response)。

9.ICMP

ICMP全称为Internet Control Message Protocol,即Internet控制报文协议。ICMP是IP的附属协议,IP用它来与其他主机或路由器交换错误报文和其他一些网络情况。

在ICMP包中携带了控制信息和故障恢复信息,这些信息可以用于以下几方面:源抑制,路径重定向,主机不可到达,应答请求与回复。

路径重定向:由网关向请求其提供服务的主机发送,用于通知该主机在网络中还有其他距离目的主机更近的网关(是服务器,具有一定的连接服务,属于四到七层的连接。例如:防火墙网关在连接上增加了防火墙的功能。)。

10. FTP协议(了解)

FTP(File Transfer Protocol)即文件传输协议。在该协议中,要求使用者是经过授权的用户,从而使文件的访问具有一定的安全限制。由于FTP口令在网络上是以明文传输的,因此一旦被监听泄密就会威胁到系统安全。许多站点也提供匿名FTP服务(Anonymous FTP),在这类站点上,通常的登录用户名为Anonymous(匿名的),口令按照惯例是Guest,也可以是用户的E-mail地址。

HTTP协议

HTTP(Hyper Text Transfer Protocol,超文本传输协议)是WWW服务程序所用的协议,也是目前在Internet中使用最广泛的协议。HTTP客户端包括Internet Explorer、Netscape Navigator、Opera、Mozilla等。

通过WWW方式,可以进行信息查询、文件下载、访问WWW方式的E-mail、在线聊天等,功能非常强大。

11.服务类型的选择

从通信的角度看,网络协议栈中的各层所提供的服务可以分为两大类:面向连接(connection-oriented)服务和无连接(connectionless)服务。

1)面向连接服务

所谓连接,是指两个对等实体为进行数据通信而进行的一种结合。面向连接服务要求在数据交换之前先建立连接;当数据交换结束后终止该连接。

一般来说,面向连接服务过程分为三个阶段:连接建立、数据传输和连接释放。在传送数据时是按序传送的。这点和电路交换的许多特性很相似,因此面向连接服务又称为“虚电路服务”。面向连接服务比较适合于在一段时间间隔内要向同一目的地发送许多报文的情况。对于发送很短的零星报文,则连接建立和释放的开销过大。

2)无连接服务

无连接服务指两个实体之间的通信不需要先建立好一条连接,其所需的下层资源在数据传输时动态地进行分配。

无连接服务的另一个特征是它不需要通信的两个实体同时是活跃的。只有发送端的实体正在进行发送时,它才必须是活跃的。而接收端的实体只有在进行接收操作时才必须是活跃的。

无连接服务的优点是灵活方便和效率高;但它不能防止报文的丢失、重复或失序,该问题必须由应用程序根据需要自行解决。无连接服务特别适合于传送少量零星的报文。

无连接服务又可分为以下三种类型:

·数据报(datagram):它的特点是不需要接收端做任何响应,因而是一种不可靠的服务。数据报常被描述为“尽最大努力交付”(best effort delivery)。在TCP/IP协议栈中,由UDP协议提供数据报服务。

·证实交付(confirmed delivery):又被称为可靠的数据报。这种服务对每一个报文由提供服务的协议层产生一个证实给发方,这种证实只能保证报文已经发送给远端目的站了,但并不能保证目的站用户已收到这个报文。

·请求应答(request-reply):这种类型的数据报是接收端的用户每收到一个报文,就向发送端的用户发送一个应答报文。与“证实交付”的主要区别在于应答是由接收端的用户而不是提供服务的协议层发出的。事务处理(transaction)中的“一问一答”方式的短报文以及数据库中的查询,都很适合使用这种类型的服务。

https://www.wendangku.net/doc/fa17281683.html,BIOS是1983年IBM为PC-Network开发的一套网络标准,并于1984年8月首次出现在由Sytek公司为IBM设计的IBM PC NetBIOS LAN网络适配器(LANA, LAN Adapter)上。

在网络层次中,NetBIOS工作于国际标准化组织(ISO)开放系统互连(OSI)的参考模型中的表示层与会话层之间,处于参考模型的高层。NetBIOS程序的网络通信功能主要是通过四种NetBIOS应用服务实现的,这四种应用服务是:

(1) 名字支持:名字的作用是标识计算机中希望在网络中可见的实体,NetBIOS名字支持服务功能允许加入一个名字、加入一个组名或删除一个名字。

(2) 数据报支持:NetBIOS使用数据报支持服务可以方便地在网络中发送、接收数据报,以及进行广播功能。

(3) 会话支持:会话支持服务是NetBIOS最复杂的功能,其中呼叫功能用于建立一条与被呼叫的主机之间的连接。一旦建立了连接,就有了一条虚电路,双方就可以在这条链路上进行通信。会话支持还有一些其他服务提供了各种不同类型报文的发送和接收,以及结束一个会话等功能。

(4) 一般命令:这组服务允许对网络接口适配器进行复位,以及获得其状态等其他功能。https://www.wendangku.net/doc/fa17281683.html,BIOS数据报

数据报是一种短信息,它的大小可由NetBIOS的执行程序改变。数据报服务可以将数据发送到特定的地点或组中所有成员,也可广播到整个局域网。 NetBIOS数据报通信是无连接、非可靠的一种通信方式。

数据报通信有广播式数据报和普通数据报两种。

1)广播式数据报(广播型)

广播式数据报是用NetBIOS的发送广播数据报命令所发送的。任何适配器(包括发送适配器),如果事前发送过NetBIOS接收广播数据报命令,它也可以接收到这个广播数据报。广播数据报有可能导致进程间数据收发的混乱,应当谨慎使用。

2)普通数据报(定向型)

普通数据报是用NetBIOS的发送数据报命令发送的。与NetBIOS发送广播数据报命令不同的是,应用程序要用发送数据报命令指出接收者的名字。包括发送适配器在内的任何适配器,都可接收到数据报。普通数据报可被传送给把名字作为唯一名使用的适配器,或传送给共享一组名的一组适配器。

数据报通信的主要优点是它所消耗的工作资源比会话通信少,省去了建立连接所需的开销。但这种类型的服务不提供任何保障,对因目标接收机退出网络、掉电、数据丢失等多种原因导致的数据传输失败,都不会提供任何错误提示。

14NetBIOS会话

NetBIOS会话连接是在两个应用程序之间建立一个可靠的虚电路,应用程序可以驻留在同一个工作站(本地会话)或不同的工作站(远程会话)中,每一个应用程序构成会话的一边。 NetBIOS会话服务提供给用户程序一种面向连接的、可靠的、全双工的连接服务。NetBIOS会话的建立需要双方预定的合作,会话过程需要一个是客户端程序,一个是服务器端程序。

在这种服务中,服务器通常将自己注册到一个已知的名字下。客户机会搜寻这个名字,以便建立与服务器的通信。 NetBIOS服务器进程会针对想和它建立通信的每一个LANA编号,将自己的名字加入与其对应的名字表。而对于其它机器上的客户来说,就可将一个服务名解析成机器名,然后要求同服务器进程建立连接。

通常,会话过程包括建立会话、接收命令、发送命令及结束会话。

1)建立会话

当应用程序发出NetBIOS监听命令以访问NetBIOS名字表中的某个名字时,会话就产生了。监听命令也可指出一个远程名,申请对话的应用程序把它看作会话伙伴。第二个应用程序接着发出一条NetBIOS调用命令,去访问NetBIOS名字表中的名字,而这个名字正是第一个应用所期望的伙伴的名字。该调用命令还访问它在NetBIOS名字表中的第一个应用程序的名字,两个名字完全相匹配就会满足两个应用程序建立会话的标准,所进行的监听及调用命令也随之完成。

2)接收命令

会话建立以后,在会话过程中双方可以使用NetBIOS的Send和Receive命令操作来传输数据。如果用一个名字产生几个会话,则应用程序也可发出NetBIOS“指定数据任意接收”命令,该命令就提供与这个指定名有关的任何会话数据。更一般的情况是,应用程序可以发出“任意名的任意接收”命令,提供适配器所建立的任何会话中的数据。

3)发送命令

应用程序发出NetBIOS Send命令把数据发送给其他应用程序。该命令允许应用程序发送的信息范围是0~64 KB;数据必须处于连续的内存中。应用程序也可以调用NetBIOS的CHAIN类发送命令(NCBCHAINSEND和NCBCHAINSENDNA),该命令允许数据驻留在两个区域的缓冲区中。

4)结束会话

在会话最后,会话的一边或两边发出NetBIOS Hang up命令就可终止会话,各程序将执

行挂起命令。在以后发出这样的命令时,其他应用程序也会得到会话结束的通知。应用程序也可发出NetBIOS会话状态命令,以指出会话的状态。

会话通信的优点体现为,在保证通信具有极高可靠性的同时,数据包的收发顺序正确无误。但是,会话是一种“以消息为基础”的服务,建立会话、维护会话及适配器之间数据包应答的开销保证了其可靠性。需引起注意的是:NetBIOS假定局域网足够快,能够传输需要的数据,因而没有为会话服务设计流控制。

15. Ncb/Mcb

Ncb也叫信息控制块(Message control block,Mcb),实际上就是一个数据结构。

Ncb/Mcb域

在Win32环境VC++6.0编译器中,Ncb的结构在nb30.h文件中定义。下面是Ncb结构的定义。Ncb有64个字节,分为14个域(或称为字段)和一个10字节的保留域,表2.1显示了Ncb和它的域。

Ncb的各域名解释:

调用(远程)名(ncb_callname[NCBNAMSZ])

调用(远程)名是一个由应用程序设置的16字节域,其值是远程处理的逻辑名。应用程序设置一个连接或向远程处理发送一个数据包时,将相应设置该字段。在远程驱动程序连接正期待着接收连接呼叫的本地处理时,NetBIOS将填写该字段。因此,接收呼叫的处理能够找出远程呼叫方的名。第一个字节为“*”代表任意远程名。

本地名(ncb_name[NCBNAMSZ])

本地名是由应用程序设置的16字节字段(所有的字节均有用),其值是本地处理的逻辑名。应用程序设置一个连接或向远程处理发送一个数据表包时,将相应设置该字段。该字段

的第一个字节不能是二进制0或星号;另外,IBM保留了头三个字节,所以头三个字节不能是IBM。最后,第16个字节不能是00h~1Fh之间的值。在局域网管理器环境下,最后一个字符(即第16个字节)有特殊的含义,具体如下表:

接收超时(ncb_rto)

当期望从一个或数个远程处理接收到一个数据包时,应用程序可在接收超时(接收时间限制)字段中指定等待的最大时间数值(以1/2 s为间隔单位)。若超过了指定时间仍未接收到包,则NetBIOS驱动程序将在接收超时字段中返回错误。若接收超时字段值为00h,则表示阻止执行,直到本地处理接收到一个数据包。

发送超时(ncb_sto)

发送超时(发送时间限制)字段类似于接收超时字段,但它指定的是等待NetBIOS连接式命令Send完成的时间。若超过了指定时间,则将返回错误。若发送超时字段值为00h,则表示不为发送操作指定时间限制。此时,命令将阻止执行,直到要么成功地发送了一个数据包,要么NetBIOS层停止了重试。

16.

会话通信是NetBIOS应用通信中的第二种形式,它支持一个可靠的可以在两个应用程序之间创建的双向数据通信连接(虚电路),并能保持较长时间。相互通信的应用程序可以留在同一台计算机上或驻留在不同的计算机上。会话通信相对于数据报通信有以下优点:对于每个被发送的信息,发送前能得知对方的接收准备情况,而数据报通信只提供信息的发送状态。会话通信模型

会话通信通常建立在服务器与客户端之间,因而会话程序一般分为服务器端程序和客户端程序。服务器端程序提供被动的连接操作,等待客户端的连接请求,而客户端采取主动的连接操作,直接向所要连接的服务器发出请求,通常二者都采用异步模式(ASYNCH)。服务器端与客户端建立成功的会话条件是:二者使用的LANA端口基于相同的NetBIOS协议,且应答无误。

第三章

1.套接字(socket)是网络通信的基本构件,是可以被命名和寻址的通信端点,当应用程序使用套接字函数产生一个套接字后,还返回该套接字的文件描述符。

TCP/IP的socket提供三种类型的套接字:

* 流式套接字(SOCK_STREAM):提供一个面向连接的、可靠的数据传输服务,数据无差错、无重复地发送,且按发送顺序接收。内设流量控制,避免数据流超限;数据被看作是字节流,无长度限制。文件传输协议(FTP)即使用流式套接字。

* 数据报式套接字(SOCK_DGRAM):提供一个无连接服务。数据报以独立包形式被发送,不提供无错保证,数据可能丢失或重复,且接收顺序混乱。网络文件系统(NFS)使用数据报式套接字。

* 原始式套接字(SOCK_RAW):该接口允许对较低层协议,如IP、ICMP直接访问。常用于检验新的协议实现或访问现有服务中配置的新设备。

2.网络中可以被命名和寻址的通信端口是操作系统可分配的一种资源。端口是一种抽象的软件结构(包括一些数据结构和I/O缓冲区)。

3.

4.区分两者

半相关

综上所述,网络中用一个三元组(协议,本地地址,本地端口号)可以在全局唯一标志一个

进程,这个三元组叫半相关(half-association),它指定连接的每半部分。

全相关

一个完整的网间进程通信需要由两个进程组成,且只能使用同一种高层协议。即不可能通信的一端用TCP协议,另一端用UDP协议。因此一个完整的网间通信需要用一个五元组(协议,本地地址,本地端口号,远地地址,远地端口号)来标识,这个五元组叫全相关(association),即两个协议相同的半相关才能组成一个合适的相关,或完全指定组成一连接。

5.面向连接服务是电话系统服务模式的抽象,每一次完整的数据传输都要经过建立连接、使用连接、终止连接的过程。在数据传输过程中,各数据分组并不携带目的地址,而使用连接号(connect ID)。本质上,连接是一个管道,收发数据不但顺序一致,而且内容相同。TCP 协议提供面向连接的虚电路(会话通信)。

无连接服务是邮政系统服务的抽象,每个分组都携带完整的目的地址,各分组在系统中独立传送。无连接服务不能保证分组的先后顺序,不进行分组出错的恢复和重传,不保证传输的可靠性。UDP协议提供无连接的数据报服务(数据报通信)。

6. 全双工/半双工

全双工/半双工是指端与端之间的数据同时向两个方向或一个方向传送。

7.在数据传输过程中,希望不通过常规传输方式传送给用户以便及时处理的某一类信息称为带外数据。

8.流套接字编程模型

流套接字的服务进程和客户进程在通信前必须创建各自的套接字并建立连接,然后才能对相应的套接字进行读/写操作,实现数据的传输。流套接字编程时序如图3.1所示。

具体步骤如下:

通过socket()函数建立套接字。

(2)通过bind()函数将指定协议的套接字绑定到它已知的名字上,这个名字就是本地的IP 地址和端口号。

(3) 服务进程调用listen()函数来实现监听状态,等待任意数量的客户端连接,以便为它们的请求提供服务。

(4)服务进程调用函数accept()或WSAAccept()准备接收来自客户端的连接。如果一个客户端用connect函数试图建立连接,服务进程就可以接受连接,并为这个连接建立一个新的套接字用来与对方通信,把他的描述符作为返回值。新建的套接字与原来的套接字有相同的特性,包括端口号,而原来的套接字被释放,用于继续等待其它的连接请求。

(5) 建立连接后,服务器和客户端之间就可以使用send()和recv()函数进行通信。注意默认情况recv()函数处于阻塞模式,在接收到数据前,程序不向下执行。

(6) 通信结束后,调用closesocket()函数关闭套接字。

注意:在此编程过程中,服务器必须首先启动,直到执行完accept()调用,进入等待状态后,方能接收客户请求,如客户在此之前启动,则connect()将返回出错代码,连接不成功。

9.数据报套接字编程模型

具体步骤如下:

(1) 服务器和客户端都建立一个数据报套接字。

(2) 服务器调用bind()函数给套接字分配一个公认的指定的端口。客户端同样需要对套接字进行绑定。

(3) 客户端和服务器都可以使用sendto()函数发送数据,使用recvfrom()函数接收数据,完成数据报传递。默认情况recvfrom()函数处于阻塞模式,在接收到数据前,程序不向下执行。

(4) 通信结束后,调用closesocket()函数关闭套接字。

注意:无连接服务器也必须先启动,否则客户请求传不到服务进程。无连接客户不调用connect(),因此在数据发送之前,客户与服务器之间尚未建立完全相关,但各自通过socket()和bind()建立了半相关。发送数据时,发送方除指定本地套接字号外,还需指定接收方套接字号,从而在数据收发过程中动态地建立全相关。

5) 建立连接后,服务器和客户端之间就可以使用send()和recv()函数进行通信。注意默认情况recv()函数处于阻塞模式,在接收到数据前,程序不向下执行。

(6) 通信结束后,调用closesocket()函数关闭套接字。

注意:在此编程过程中,服务器必须首先启动,直到执行完accept()调用,进入等待状态后,方能接收客户请求,如客户在此之前启动,则connect()将返回出错代码,连接不成功。

10.重叠I/O模型(概念)

WinSock 2引入了重叠I/O的概念并且要求所有的传输协议提供者都支持这一功能。重叠I/O模型与WinSock 1.1中其他模型相比可以使应用程序达到最佳的性能。

它的基本原理是让应用程序使用一个重叠的数据结构,一次投递一个或多个WinSock I/O请求,针对那些提交的请求,应用程序可以产生多个进程同时处理这些I/O请求。在它们完成之后,应用程序会收到通知,于是就可以通过自己另外的代码来处理这些数据了。应用程序可通过ReadFile和WriteFile两个函数执行I/O操作。

重叠I/O仅能在由WSASocket函数创建的套接字上使用(使用WSA_FLAG_OVERLAPPED标记)。

11.服务质量(QoS)实际上是一系列组件,允许对网络上的数据进行不同的处理,并可为其分配不同的优先级。

12.WinSock 2中QoS的使用模型如下:

(1) 对基于连接的传输服务,应用程序可以很方便地在使用WSAConnect函数提出连接请求时规定它所要求的服务质量(QoS)。

(2) 无连接的套接字也可以使用WSAConnect函数为一个指定的通信规定特定的QoS级别,WSAIoctl函数也可用来规定初始的QoS要求,或者用于今后的QoS协商。

13.WinSock 2推荐的流规格把Qo S特性划分为如下几个方面:

* 源通信描述:应用程序的通信数据以什么方式被送入网络。

* 延时性:最大延时和可接受的延时变化。

* 需要保证的服务级别:应用程序是否要求对服务质量的绝对保证。

* 费用:为将来可以决定有意义的费用时保留的。

* 服务提供者特定的参数:流规格可以根据具体的提供者进行扩展。

14.套接字具有很多套接字选项,这些选项代表套接字在不同需要下的行为,通过setsockopt函数和getsockopt函数可以灵活地设置和获取某个套接字的某个选项。

setsockopt函数的原型为:

int setsockopt( SOCKET s, int level, int optname, const char* optval, int optlen );

(1)参数s标识一个套接字的描述字;

(2)参数level用于指定套接字选项的级别,大多数选项都是一种特定的协议和套接字类型专有的,而其他选项适用于所有类型的套接字;按照参数选项级别level值的不同,套接字选项大致可以分为3类:通用套接字选项、IP选项、TCP选项。

(3)参数optname表示需要设置的选项;

(4)参数optval为指向存放选项值缓冲区的指针;

(5)参数optlen为optval缓冲区的长度。

函数getsockopt的原型为:

int getsockopt( SOCKET s, int level,int optname, const char* optval, int optlen );

该函数的参数与setsockopt函数的参数意义基本相同,不同的是optval和optlen的形式,在此函数中是将它们的值传出,而在setsockopt函数中是将它们的值传入。

15.套接字选项可以分为两种:一种是布尔型选项,允许或禁止一种特性;另一种是整形或结构选项。

16. I/O控制命令

17. WinSock提供了一系列套接字I/O控制函数控制套接字的I/O行为,并获取套接字I/O操作的有关信息。其中最常用的是ioctlsocket函数,它可用于任一状态的任一套接字,而与具体协议或通信子系统无关。其原型为:

int ioctlsocket( SOCKET s, long cmd, u_long FAR* argp );

其中:

(1)参数s是一个标识套接字的描述字;

(2)参数cmd用于指定对套接字s的操作命令,标准的I/O控制命令如表3.3所示;(3)参数argp是指向cmd命令所带参数的指针。

第四章函数

1.函数gethostname

该函数的原型为:

int gethostname(char *name, int namelen);

其中,参数name是一个指向将要存放主机名的缓冲区指针。namelen用于指定缓冲区的长度。该函数把本地主机名存入由name参数指定的缓冲区中,返回的主机名是一个以NULL 结束的字符串。主机名的形式取决于WinSock实现,它可能是一个简单的主机名,或者是一个域名。然而,返回的名字必定可以在gethostbyname()和WSAAsyncGetHostByName()中使用。如果没有错误发生,gethostname()返回0;否则它返回SOCKET_ERROR。

2.函数gethostbyname

该函数的原型为

struct hostent *gethostbyname(const char *name);

其中name为指向主机名的指针,它一般由函数gethost-name返回。函数返回对应于给定主机名的包含主机名字和地址信息的hostent结构指针,该结构格式如下:struct hostent

{

char FAR* h_name;

char FAR FAR** h_aliases;

short h_addrtype;

short h_length;

char FAR FAR** h_addr_list;

};

3.两者之间的转换

(1)IP地址202.119.115.78的二进制值为:

11001010.01110111.01110011.01001110。

(2) 子网掩码255.255.255.0的二进制值为:

11111111.11111111.11111111.00000000。

4.函数GetAdaptersInfo可获得本地计算机的网络信息,从而获得该计算机的网卡名、网卡驱动程序、IP地址、子网掩码、物理地址、是否启用了DHCP(了解)、是否启用了WINS等网络信息。注意该函数在头文件IpHlpApi.h中声明,库文件为IpHlpApi.lib。函数原型为:DWORD GetAdaptersInfo( PIP_ADAPTER_INFO pAdapterInfo,

PULONG pOutBufLen );

参数pAdapterInfo指向IP_ADAPTER_INFO结构链表缓冲区的指针;

参数pOutBufLen指向一个ULONG变量的指针,该ULONG变量表示指向pAdapterInfo结构的大小。

5.获取计算机安装的协议实现原理

针对指定的工作站上安装哪种协议和各种协议特性的返回问题,WinSock 2提供了一种解决方法。如果一个协议支持多种行为,则每类行为在系统中都有各自的目录条目。比如,如果在自己的系统中安装了TCP/IP,系统中就会有两个IP条目:一个条目针对TCP,是可靠的面向连接的,另一个针对IP,是不可靠且无连接的。

要想获得系统中安装的网络协议的相关信息,可调用WSAENumProtocols函数,其原型为:int WSAENumProtocols( LPINT lpiProtocols,

LPWSAPROTOCOL_INFO lpProtocolBuffer,

LPDWORD lpdwBufferLength );

其中:

参数lpiProtocols是一个以NULL结尾的协议标识号数组,该参数可选,如果lpiProtocols为NULL,则返回所有可用协议的信息,否则返回数组中所列的协议信息;

参数lpProtocolBuffer是一个用PROTOCOL_INFO结构填充的缓冲区,该结构用来存取和获得给定协议的完整信息;

参数lpdwBufferLength在输入时,用于保存传递给WSAENumProtocols()函数的lpProtocolBuffer缓冲区长度;在输出时,存有获取所有请求信息需传递给WSAENumProtocols()函数的最小缓冲区长度。

若无错误发生,WSAENumProtocols函数返回协议的数目,否则,返回INVALID_SOCKET 错误,应用程序可通过WSAGetLastError()函数来获取相应的错误代码。

第五章

1. ICMP实现

Ping程序的实现方法是,主机向远程计算机发出ICMP回应请求以后,远程计算机会处理这个请求,然后生成一条回应应答消息,再通过网络传回给发送主机;假如由于某些原因,不能抵达目标主机,就会生成对应的ICMP错误消息(比如“目标主机不可到达”),由那个路径上某处的一个路由器返回。假定与远程主机的物理性连接并不存在问题,但远程主机已经关机或没有设置对网络事件作出响应,便需由自己的程序来执行超时检查,来检测这样的情况。

Ping示例在程序中采取如下步骤:

(1) 创建类型为SOCK_RAW的一个套接字,同时设定协议IPPRO TO_ICMP。

(2) 创建并初始化ICMP头。

(3) 调用sendto或WSASendto,将ICMP请求发给远程主机。

(4) 调用recvfrom或WSARecvfrom,以接收任何ICMP响应。

2.Tracert(实现方法和基本原理)

对IP网络来说,另一个非常有用的工具是Tracert(路由追踪)。在Windows操作系统中,一般可以直接运行tracert.exe来调用这个工具。利用它可侦测出为抵达网络内任何一个指定的主机,中途需经过哪些路由器,以及它们的IP地址是什么。Tracert的设计原理是令其向目的地发送一个数据包,并重复递增IP的“存活时间”(TTL)值。刚开始的时候,TTL等于1;也就是说,一旦它抵达路途中的第一个路由器,TTL首先会超时(变成0),这样便会造成路由器生成一个ICMP“超时”数据包。随后,最初的TTL值递增1,以便UDP 包能继续传到下一个路由器,而生成的ICMP超时包会自第一个路由器返回。只需将返回的每一条ICMP消息都收集下来,便能为中途经过的路由器IP地址勾勒出一个清晰的轮廓,直到最终的目标主机。

3.网卡有如下接收模式:

(1)广播模式:能够接收网络中的广播信息。

(2)组播模式:能够接收组播数据。

(3)直接模式:只有目的网卡才能接收该数据。

(4)混杂模式:能够接收通过它的一切数据,而不管该数据是否时传给它的。

目前有两种方法可以从网络中获得数据包,一种是采用专用硬件,另一种是利用计算机的网络接口(网络适配器),由软件来完成数据帧的获得,这种方法的前提是将本地NIC 工作状态设成混杂模式,扑捉与其连接的物理媒体上传输的所有数据。

4.数据包捕获驱动器结构

Windows下的数据包捕获驱动程序提供了一个高性能、灵活且与UNIX系统环境中的BPF兼容的网络工具。它的主要功能如下:

* 捕获网络中原始的网络流量,并交由高层应用程序进行处理。

* 过滤收到的数据包。

* 在应用进程忙碌时,把数据包保存在缓存区中。

* 给收到的数据包打包,并加上时戳、包长和偏移量。

* 构造数据包,并注入到网络中。

* 统计网络流量。

5.驱动器结构

向上的箭头表示从网络到应用程序的数据流,在内核缓存区与应用程序之间的箭头表示一次读系统调用可以传送多个数据包。向下的箭头表示从应用程序到网络之间传送的数据包。图5.2只是简单的结构描述,实际的系统结构要复杂得多。

6. 数据包过滤(filter)处理 (了解)

Winpcap的基本过滤机制来源于UNIX环境中的BPF过滤器,需要过滤数据包的应用程序可以建立一个标准的BPF的过滤程序(调用函数pcap_compile),并把它传送到驱动程序,此后,过滤进程将在系统内核中进行数据包过滤。

如果建立了过滤器,捕获驱动程序将会检查每个到达的数据包,不满足过滤条件的数据包将被丢弃。满足过滤条件的包则被复制到应用程序。如果没有定义过滤器,捕获驱动程序则接收所有的数据包。对数据包的过滤处理是当数据包仍在网络接口驱动程序的存储空间中时进行的,不用把数据包复制到捕获驱动程序中。

7.统计模式(Statistics mode)(概念)

当驱动程序处于统计模式时,驱动程序不捕获任何数据包,而只是计算满足用户定义的BPF过滤器的数据包的数量,这些数据定期传送到应用进程。统计模式占用的系统资源很少,因为对每个数据包只进行BPF过滤,而不拷贝

相关文档