《第1章 网络基础.ppt》由会员分享,可在线阅读,更多相关《第1章 网络基础.ppt(73页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Windows网络程序设计网络程序设计第1章 网 络 基 础第第1章章 网网 络络 基基 础础n1.1 TCP/IP简介简介n1.2 网络编程应考虑的问题网络编程应考虑的问题 n习题与思考题习题与思考题 1.1 TCP/IP简介简介n1.1.1 OSI模型与模型与TCP/IP结构结构OSI/RM(Open System Interconnection/Reference Model,开放系统互连参考模型)将计算机网络通信定义为一个七层框架模型,如图1.1所示。图1.1OSI模型与通信流程表表1.1 OSI模型中各个层的功能模型中各个层的功能 图1.2TCP/IP族的体系结构TCP/IP每层的功
2、能n链路层:有时被称作数据链路层或网络接口层,通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡,它们一起处理与电缆(或其他任何传输媒介)的物理接口细节。n网络层:有时也被称为互联网层,负责分组在网络中的活动,包括IP(网际协议)、ICMP(Internet控制报文协议)以及IGMP(Internet组管理协议)。n传输层:该层主要为两台主机上的应用程序提供端到端的数据通信,它分为两个不同的协议TCP(传输控制协议)和UDP(用户数据报协议)。TCP提供端到端的质量保证的数据传输,该层负责数据的分组、质量控制和超时重发等,对于应用层来说,就可以忽略这些工作。UDP则只负责简单地把数据报
3、从一端发送到另一端,至于数据是否到达或按时到达、数据是否损坏都必须由应用层来做。n应用层:该层负责处理实际的应用程序细节,包括Telnet、HTTP、SMTP、FTP、DNS和SNMP等协议和应用。TCP/IP连接实例连接实例n对于不同网络结构的两台主机,可通过路对于不同网络结构的两台主机,可通过路由器互相连接。路由器可以把以太网、令由器互相连接。路由器可以把以太网、令牌点对点链接和牌点对点链接和FDDI(光纤分布式数据接口光纤分布式数据接口)等不同的网络连接在一起。等不同的网络连接在一起。图1.3通过TCP/IP和路由器连接的两台主机1.1.2 TCP/IP基本概念基本概念n1.IP地址与子
4、网掩码地址与子网掩码网络互联的目的是提供一个无缝的通信系统。网络互联的目的是提供一个无缝的通信系统。为此,必须用互联网协议屏蔽物理网络的具体为此,必须用互联网协议屏蔽物理网络的具体细节,并提供一个虚拟网络的功能。在细节,并提供一个虚拟网络的功能。在TCP/IP栈中,编址由栈中,编址由IP协议规定,协议规定,IPv4标准分配给每标准分配给每台主机一个台主机一个32位的二进制数作为该主机的位的二进制数作为该主机的IP地地址,址,IPv6中中IP地址为地址为128位。位。每个每个IP地址被分割成前缀和后缀两部分。前缀地址被分割成前缀和后缀两部分。前缀为网络地址,用于确定计算机从属的物理网络;为网络地
5、址,用于确定计算机从属的物理网络;后缀为主机地址,用于确定网络上一台单独的后缀为主机地址,用于确定网络上一台单独的计算机。计算机。IP地址共分五类:地址共分五类:A类、类、B类、类、C类、类、D类和类和E类。其中类。其中A类、类、B类和类和C类为基本类。类为基本类。IP地址一般采用点分十进地址一般采用点分十进制的表示方法,例如:制的表示方法,例如:10000001 00110100 00000110 00000000129.52.6.0 表表1.2 各类各类IP地址的范围地址的范围 类型范围A类0.0.0.0127.255.255.255B类128.0.0.0191.255.255.255C类
6、192.0.0.0223.255.255.255D类224.0.0.0239.255.255.255E类240.0.0.0247.255.255.255此外,需要特别注意以下几个特殊的此外,需要特别注意以下几个特殊的IP地址:地址:n网络地址:网络地址:IP中主机地址为中主机地址为0的地址表示网的地址表示网络地址,如络地址,如128.211.0.0。n广播地址:网络号后跟一个所有位全是广播地址:网络号后跟一个所有位全是1的的后缀,就是直接广播地址。后缀,就是直接广播地址。n回送地址:回送地址:127.0.0.1用于测试。用于测试。现在所有的主机都要求支持子网编址现在所有的主机都要求支持子网编址
7、(RFC950,J.Mogul and J.Postel,1985),该功能要求不仅把,该功能要求不仅把IP地址看成由单纯的一个网络号和一个主机号组成,而地址看成由单纯的一个网络号和一个主机号组成,而且要把主机号再分成一个子网号和一个主机号。例如,且要把主机号再分成一个子网号和一个主机号。例如,这里有一个这里有一个B类网络地址类网络地址(140.252.0.0),在剩下的,在剩下的16位中,位中,8位用于子网号,位用于子网号,8位用于主机号,其格式如图位用于主机号,其格式如图1.4所示。这样就允许有所示。这样就允许有254个子网,每个子网可以有个子网,每个子网可以有254台主机。台主机。图1.
8、4B类地址的子网编址举例子网掩码:子网掩码:n除了地址以外,主机还需要知道有多少位用除了地址以外,主机还需要知道有多少位用于子网号及多少位用于主机号。这是通过子于子网号及多少位用于主机号。这是通过子网掩码来确定的,子网掩码是一个网掩码来确定的,子网掩码是一个32位的值,位的值,其中值为其中值为1的位留给网络号和子网号,为的位留给网络号和子网号,为0的的位留给主机号。在上面的例子中,主机号占位留给主机号。在上面的例子中,主机号占8位,子网掩码就是位,子网掩码就是255.255.255.0。n2.地址解析地址解析地址解析地址解析(Address Resolution)就是将计算机就是将计算机中的协
9、议地址翻译成物理地址中的协议地址翻译成物理地址(或称或称MAC地址,地址,即媒体映射地址即媒体映射地址)。地址解析只能在本地网内进。地址解析只能在本地网内进行。行。地址解析技术可分为如下三种:地址解析技术可分为如下三种:n(1)表查询表查询(Table-Lookup)。n(2)相近形式计算(Close Form-Computation)。n(3)信息交换(Message-Exchange)。n3.域名系统域名系统一个系统的全域名由主机名、域名和扩展名三一个系统的全域名由主机名、域名和扩展名三部分组成,各部分间使用部分组成,各部分间使用“”分隔,例如分隔,例如。在。在TCP/IP应用中,域名系统
10、应用中,域名系统(DNS)是一个分布的数据库,由它来提供是一个分布的数据库,由它来提供IP地址地址和主机名之间的映射信息,可以通过在程序中和主机名之间的映射信息,可以通过在程序中调用标准库函数来编程实现域名与调用标准库函数来编程实现域名与IP地址之间地址之间的相互转换。的相互转换。n4.数据包的封装和分用数据包的封装和分用当应用程序用当应用程序用TCP传送数据时,数据被送入协议栈中,传送数据时,数据被送入协议栈中,然后逐个通过每一层,直到被当作一串比特流送入网然后逐个通过每一层,直到被当作一串比特流送入网络。其中每一层对收到的数据都要增加一些首部信息络。其中每一层对收到的数据都要增加一些首部信
11、息(有时还要增加尾部信息有时还要增加尾部信息),该过程如图,该过程如图1.5所示。所示。由于由于TCP、UDP、ICMP和和IGMP都要向都要向IP传送数据,传送数据,因此因此IP必须在生成的必须在生成的IP首部中加入某种标识,以表明数首部中加入某种标识,以表明数据属于哪一层。为此,据属于哪一层。为此,IP在首部中存入一个长度为在首部中存入一个长度为8 bit的数据,称作的数据,称作协议域协议域。1表示表示ICMP,2表示表示IGMP,6表示表示TCP,17表示表示UDP。图1.5数据包的封装过程示意图应用程序可以使用TCP或UDP来传送数据。因此传输层协议在生成报文首部时要存入一个应用程序的
12、标识符。TCP和UDP都用一个16位的端口号来表示不同的应用程序。TCP和UDP把源端口号和目的端口号分别存入报文首部中。网络接口分别要发送和接收IP、ARP和RARP数据,因此也必须在以太网的帧首部中加入某种形式的标识,以指明生成数据的网络层协议。为此,以太网的帧首部也有一个16 bit的帧类型域。当目的主机收到一个以太网数据帧时,数据就开始从协议栈中由当目的主机收到一个以太网数据帧时,数据就开始从协议栈中由底向上升,同时去掉各层协议加上的报文首部。每层协议盒都要底向上升,同时去掉各层协议加上的报文首部。每层协议盒都要去检查报文首部中的协议标识,以确定接收数据的上层协议。这去检查报文首部中的
13、协议标识,以确定接收数据的上层协议。这个过程称作分用个过程称作分用(Demultiplexing)。n5.端口号端口号TCP和和UDP采用端口号来识别应用程序。例如,采用端口号来识别应用程序。例如,服务器提供的服务一般都是通过通用端口号来服务器提供的服务一般都是通过通用端口号来识别的。识别的。任何任何TCP/IP实现所提供的服务都使用通用端口实现所提供的服务都使用通用端口号号11023。大多数大多数TCP/IP实现给临时端口分配实现给临时端口分配10245000之间的端口号。之间的端口号。1.1.3 常用协议常用协议n1.以太网数据链路层帧结构以太网数据链路层帧结构IEEE 802.3定义了一
14、种具有七个字段的帧定义了一种具有七个字段的帧(MAC):前导:前导符、起始帧分界符、目标地址、源地址、符、起始帧分界符、目标地址、源地址、PDU的长度的长度/类型、数据以及类型、数据以及CRC。以太网不提供任何对收到的帧。以太网不提供任何对收到的帧进行确认的机制,确认在高层完成,这表明它是一种进行确认的机制,确认在高层完成,这表明它是一种不可靠的介质。不可靠的介质。图1.7IEEE802.3MAC帧结构图1.8采用TCP/IP协议族的MAC帧结构示意typedef struct _ETHeader /14字节的以太头 UCHAR dhost6;/目的MAC地址 UCHAR shost6;/源M
15、AC地址 USHORT type;/下层协议类型,如IP(ETHERTYPE_IP)、ARP(ETHERTYPE_ARP)等 ETHeader,*PETHeader;n2.IPIP负责在负责在TCP/IP主机之间提供数据报服务,进行数据主机之间提供数据报服务,进行数据封装及产生协议头。另外,封装及产生协议头。另外,IP协议不负责包的校验,它协议不负责包的校验,它是一种无连接、不可靠的传输。是一种无连接、不可靠的传输。IP协议还要负责寻找路由,因此它还需要配套一个确定协议还要负责寻找路由,因此它还需要配套一个确定的的IP地址。在地址。在IP报文的包头中包含了源与目的报文的包头中包含了源与目的IP
16、地址。地址。一般来说不会有应用程序直接访问一般来说不会有应用程序直接访问IP协议。协议。IP数据报是数据报是Internet上数据通信的基本单元,这些数据上数据通信的基本单元,这些数据报不超过报不超过1000字节长,当人们打开字节长,当人们打开Web页、下载文件页、下载文件或者发送或者发送E-mail时,这些数据报就在世界各地来回传时,这些数据报就在世界各地来回传输。输。IP数据报的报文格式如图数据报的报文格式如图1.9所示。所示。图1.9IP数据报格式typedef struct _IPHeader/20字节的IP头 UCHAR iphVerLen;/版本号和头长度(各占4位)UCHAR i
17、pTOS;/服务类型 USHORT ipLength;/封包总长度,即整个IP报的长度 USHORT ipID;/封包标识,惟一标识发送的每一个数据报 USHORT ipFlags;/标志 UCHAR ipTTL;/生存时间,就是TTL UCHAR ipProtocol;/协议,可能是TCP、UDP、ICMP USHORT ipChecksum;/校验和 ULONG ipSource;/源IP地址 ULONG ipDestination;/目标IP地址 IPHeader,*PIPHeader;IP协议是协议是TCP与与UDP的基础。的基础。TCP和和UDP的每的每组数据都通过端系统和每个中间路
18、由器中的组数据都通过端系统和每个中间路由器中的IP层在互联网中进行传输。层在互联网中进行传输。ICMP作为作为IP协议的附协议的附属协议,用来与其他主机或路由器交换错误报属协议,用来与其他主机或路由器交换错误报文和其他重要信息。文和其他重要信息。IP层协议的另一个附属协层协议的另一个附属协议是议是IGMP(Internet组管理协议组管理协议),它用来把一,它用来把一个个UDP数据报多播或组播到多个主机。数据报多播或组播到多个主机。n3.TCPTCP使用使用IP作为网络层协议。作为网络层协议。TCP的全称是的全称是Transmission Control Protocol,即传输控,即传输控制
19、协议。在网络通信传输机制中,它属于面向制协议。在网络通信传输机制中,它属于面向连接、可靠传输的类型。这种方法需要的网络连接、可靠传输的类型。这种方法需要的网络开销较大,但数据传输的可靠性可以保证。虽开销较大,但数据传输的可靠性可以保证。虽然然TCP使用不可靠的使用不可靠的IP服务,但它却提供了一服务,但它却提供了一种可靠的传输层服务。种可靠的传输层服务。图1.10TCP段格式typedef struct _TCPHeader/20字节的TCP头USHORTsourcePort;/16位源端口号USHORTdestinationPort;/16位目的端口号ULONGsequenceNumber;
20、/32位序列号ULONGacknowledgeNumber;/32位确认号UCHARdataoffset;/高4位表示数据偏移UCHARflags;/6位标志位/FIN-0 x01,SYN-0 x02,RST-0 x04,PUSH-0 x08,ACK-0 x10,URG-0 x20,ACE-0 x40,CWR-0 x80USHORTwindows;/16位窗口大小USHORTchecksum;/16位校验和USHORTurgentPointer;/16位紧急数据偏移量 TCPHeader,*PTCPHeader;(1)面向数据流:数据流(stream)就是两个应用程序间传输的数据。(2)电路连
21、接:包括连接的建立、通信的开始及连接的结束都要求所建立的连接是可靠的,连接的结束要完美(在连接终止前传送的所有数据均为可靠的)。(3)带缓冲的传送。(4)无结构的数据流,即不考虑数据内容。(5)全双工连接:包含两个独立且方向相反的连接。TCP提供一个可靠连接的方式是通过三次握手提供一个可靠连接的方式是通过三次握手(Three-way Handshake)来完成的。三次握手来完成的。三次握手是指通信双方彼此交换三次信息。三次握手是是指通信双方彼此交换三次信息。三次握手是在存在包丢失、重复和延迟的情况下,确保通在存在包丢失、重复和延迟的情况下,确保通信双方信息交换确定性的充分必要条件。信双方信息交
22、换确定性的充分必要条件。正常终止一个连接要经过四次握手,这是由TCP的半关闭(half-close)特性造成的。图1.11建立连接的三次握手机制图1.12终止连接的四次握手机制n4.UDPUDP(User Datagram Protocol)即用户数据报即用户数据报协议,它属于面向无连接、不可靠传输的类型。协议,它属于面向无连接、不可靠传输的类型。该协议只负责接收和传送由上层协议传递的消该协议只负责接收和传送由上层协议传递的消息,它本身不做任何检测、修改与应答,上层息,它本身不做任何检测、修改与应答,上层协议需要自己处理这些事务。协议需要自己处理这些事务。UDP的报头格式较简单,主要是地址信息
23、、包的报头格式较简单,主要是地址信息、包的长度和校验信息。与此对应,的长度和校验信息。与此对应,TCP包的头信包的头信息有息有10多个域。因此,多个域。因此,UDP的网络开销一般要的网络开销一般要小于小于TCP。图1.13UDP数据报首部typedef struct _UDPHeaderUSHORTsourcePort;/源端口号USHORTdestinationPort;/目的端口号USHORTlen;/封包长度USHORTchecksum;/校验和 UDPHeader,*PUDPHeader;n5.ARP/RARPARP(Address Resolution Protocol,地址解,地址
24、解析协议析协议)和和RARP(Reverse Address Resolution Protocol,逆向地址解析协议,逆向地址解析协议)是是某些网络接口某些网络接口(如以太网和令牌环网如以太网和令牌环网)使用的特使用的特殊协议,用来转换殊协议,用来转换IP层和网络接口层使用的地层和网络接口层使用的地址。址。图1.14以太网传输的ARP请求和应答分组格式typedef struct _ARPHeader/28字节的ARP头USHORThrd;/硬件地址空间,以太网中为ARPHRD_ETHERUSHORTeth_type;/以太网类型,ETHERTYPE_IP?UCHARmaclen;/MAC地
25、址的长度,为6UCHARiplen;/IP地址的长度,为4USHORTopcode;/操作代码,ARPOP_REQUEST为请求,ARPOP_REPLY为响应UCHARsmac6;/源MAC地址UCHARsaddr4;/源IP地址UCHARdmac6;/目的MAC地址UCHARdaddr4;/目的IP地址 ARPHeader,*PARPHeader;n6.ICMPICMP全称为全称为Internet Control Message Protocol,即,即Internet控制报文协议。控制报文协议。ICMP是是IP的附属协议,的附属协议,IP用它来与其他主机或路由器用它来与其他主机或路由器交换
26、错误报文和其他一些网络情况。在交换错误报文和其他一些网络情况。在ICMP包包中携带了控制信息和故障恢复信息。中携带了控制信息和故障恢复信息。图1.15ICMP数据在IP数据报中的封装typedef struct icmp_hdr unsigned char icmp_type;/消息类型 unsigned char icmp_code;/代码 unsigned short icmp_checksum;/校验和/下面是回显头 unsigned short icmp_id;/用来惟一标识此请求的ID号,通常设置为进程ID unsigned short icmp_sequence;/序列号 unsi
27、gned long icmp_timestamp;/时间戳 ICMP_HDR,*PICMP_HDR;n为了防止由于为了防止由于ICMP差错报文响应所引发的广播风差错报文响应所引发的广播风暴,协议规定当接收端收到下列报文时不会产生暴,协议规定当接收端收到下列报文时不会产生ICMP差错报文:差错报文:(1)ICMP差错报文差错报文(但但ICMP查询报文可能会产生查询报文可能会产生ICMP差错报文差错报文)。(2)目的地址是广播地址或多播地址的目的地址是广播地址或多播地址的IP数据报。数据报。(3)作为链路层广播的数据报。作为链路层广播的数据报。(4)不是不是IP数据报第一个分片的数据报。数据报第一
28、个分片的数据报。(5)源地址不是单个主机的数据报。这就是说,源地址源地址不是单个主机的数据报。这就是说,源地址不能为零地址、环回地址、广播地址或多播地址。不能为零地址、环回地址、广播地址或多播地址。下面介绍原始套接字编程中常用的三类ICMP报文。回应请求和回应应答报文。回应请求和回应应答报文经常用来判断一个特定的主机是否处于活动状态,并且是否可以通过网络访问到。回应请求和回应应答报文的格式如图1.16所示。图1.16回应请求和回应应答报文ICMP地址掩码请求和应答报文。ICMP地址掩码请求用于无盘系统在引导过程中获取自己的子网掩码并系统广播它的ICMP请求报文。ICMP地址掩码请求和应答报文的
29、格式如图1.17所示。图1.17ICMP地址掩码请求和应答报文ICMP时间戳请求和应答报文。ICMP时间戳请求允许系统向另一个系统查询当前的时间。返回的建议值是自午夜开始计算的毫秒数。这种ICMP报文的好处是它提供了毫秒级的分辨率,而利用其他方法从别的主机获取的时间只能提供秒级的分辨率。由于返回的时间是从午夜开始计算的,因此调用者必须通过其他方法获知当时的日期。ICMP时间戳请求和应答报文的格式如图1.18所示。图1.18ICMP时间戳请求和应答报文1.1.4 进程进程/应用层协议应用层协议1.Telnet协议协议Telnet是网络虚拟终端协议的一个典型例子,该协议允许用户通过Internet
30、登录到远程计算机中。客户程序需要自己实现Telnet协议,同时在某些键以及显示的特性上,不同的终端类型定义是不一样的,目前的大多数终端支持DEC的VT100终端类型。在进行Telnet协议的实现时,工作量最大的还在于使自己的客户程序适应不同的终端类型上。2.FTP协议协议FTP(FileTransferProtocol)即文件传输协议。在该协议中,要求使用者是经过授权的用户,从而使文件的访问具有一定的安全限制。由于FTP口令在网络上是以明文传输的,因此一旦被监听泄密就会威胁到系统安全。许多站点也提供匿名FTP服务(AnonymousFTP),在这类站点上,通常的登录用户名为Anonymous,
31、口令按照惯例是Guest,也可以是用户的E-mail地址。3.HTTP协议协议HTTP(HyperTextTransferProtocol,超文本传输协议)是WWW服务程序所用的协议,也是目前在Internet中使用最广泛的协议。HTTP客户端包括InternetExplorer、NetscapeNavigator、Opera、Mozilla等。通过WWW方式,可以进行信息查询、文件下载、访问WWW方式的E-mail、在线聊天等,功能非常强大。4.SMTP与与POP3协议协议SMTP是SimpleMailTransferProtocol的缩写,即简单邮件传输协议。POP3是PostOffice
32、Protocol3的缩写,即邮局协议。通过这两个协议就可以实现E-mail的收发功能。5.DNSDNS(DomainNameService,域名服务)实现了由主机名到IP地址的映射功能。1.2 网络编程应考虑的问题网络编程应考虑的问题 1.2.1 并发环境下的网络编程并发环境下的网络编程单进程应用与多进程或多线程应用程序的编程有着很大的区别。在多进程或多线程应用程序中,涉及到资源共享、进程或线程间的同步,因而要复杂得多。在多进程或多线程应用中,使用的系统调用或函数必须是可重入的。不同系统中可重入的系统调用或系统函数是不同的,一般都会有详细的说明。对于那些不可重入的调用或函数,系统如果不提供多线
33、程安全的版本,则应用编程人员需要避免使用或自己编写相应的函数。在多线程应用中,对调用或函数的使用有很多限制。例如在Solaris2.5中,在Solaris线程中访问定界数据会导致总线错误。在Solaris操作系统中,在一个线程中关闭另一个线程正在使用的网络端口会导致应用程序“死掉”,而这种情况在DigitalUNIX(后称为Tru64UNIX)中则不会出现。因此,在多进程或多线程应用中,需要仔细考虑这些限制。1.2.2 异构环境下的网络编程异构环境下的网络编程 1.字节顺序字节顺序不同的平台以不同的方式存放一个二进制数。最常见的有两种格式:大数在前(big-endian)的字节顺序和小数在前(
34、little-endian)的字节顺序。大数在前的字节顺序是指将一个多字节数的高序字节存储在内存的起始地址;而小数在前的字节顺序则相反,将低序字节存储在内存的起始地址。在操作系统中,IBMAIX、SunOS、HPUNIX、Solaris采用大数在前的字节顺序;而DigitalUNIX、Linux、BSDi、System4、DOS、Windows9x/2000/NT则采用的是小数在前的字节顺序。同一数值在具有不同字节顺序的平台上的表示刚好相反。因此,作为网络编程人员,必须清楚各种字节顺序间的区别,并采用相应的措施来解决因这种差别所带来的问题。2.字的长度字的长度不同的实现对于相同的数据类型可能有
35、不同的表示长度。例如32位和64位操作系统中,类型longint的长度是不一样的。在DigitalUNIX中的longint的长度为8字节,而在Solaris中则为4字节。对shortint或int等数据类型的大小也没有确定的规定。3.字节定界问题字节定界问题不同的平台上为结构体(struct)或共同体(union)打包的方式也是不同的,这取决于所有数据类型的位数及机器的定界限制。一般情况下,操作系统在分配内存时,数据结构以4字节定界。例如,在很多系统中,默认情况下结构体structchara;intb的长度为8而不是5,只有在1字节定界的情况下其长度才为5。为解决该问题,对于具有相同字节顺序
36、的平台,可以令通信双方均以单字节定界。另一种解决该问题的方法是将需要发送的信息的结构在发送前变换成一种统一的格式(转换成一个字符数组),到达接收方后再执行相反的过程。对于数据结构中有比特变量的情况,处理起来更加复杂,因此,在实际网络编程中尽量不要使用比特变量。在很多网络协议的设计中,常常需要填充一些无用的字节以满足四字节定界,从而简化协议的实现。1.2.3 阻塞与非阻塞通信阻塞与非阻塞通信通信包括阻塞和非阻塞两种模式。在网络编程时,选择通信模式是一件很重要的事情。对于不同的协议,阻塞通信和非阻塞通信有不同的表现。以插口为例,在阻塞模式下,利用TCP协议发送一个报文时,如果低层协议没有可用空间来
37、存放用户数据,则应用进程将阻塞等待直到协议有可用的空间。而在非阻塞模式下,调用将直接返回而不需等待。在应用进程调用接收函数接收报文时,如果是在阻塞模式下,若没有到达的数据,则调用将一直阻塞直到有数据到达或出错;而在非阻塞模式下,将直接返回而不需等待。对于UDP协议而言,由于UDP没有发送缓存,因此所有UDP协议即使在阻塞模式下也不会发生阻塞。对于面向连接的协议,在连接建立阶段,阻塞与非阻塞也表现不一。在阻塞模式下,如果没有连接请求到达,则等待连接调用将阻塞直到有连接请求到达;但在非阻塞模式下,如果没有连接请求到达,等待连接调用将直接返回。在连接建立阶段,不管是阻塞模式还是非阻塞模式,发起连接请
38、求的一方总是会使调用它的进程阻塞,阻塞间隔最少等于到达服务器的一次往返时间。不同操作系统下,在非阻塞模式下,不能完成的I/O操作返回的错误代码也是不一样的。例如,System返回EAGAIN错误,而源自Berkeley的实现返回EWOULDBLOCK错误。更混乱的是,Posix.1指定使用EAGAIN,而Posix.1g指定使用EWOULDBLOCK。大多数系统(包括SVR4和4.3BSD)将这两个错误代码定义为相同的值。通信模式对应用程序的设计方法也有直接的影响。在非阻塞模式下,应用程序必须不断地轮询是否有数据到达或有连接请求到达。这种轮询的方式耗费的CPU资源较大,要尽可能避免使用,或采用
39、多路复用技术(调用select或poll函数)来解决这一问题。而在阻塞模式下则不存在这一问题,但其缺点是进程或线程在执行I/O操作时将被阻塞而不能执行其他的工作,因此在单进程或单线程应用中不能使用这种模式。在多线程应用中比较适合采用阻塞模式,一个线程被阻塞不影响其他线程的工作。1.2.4 服务类型的选择服务类型的选择 1.面向连接服务面向连接服务所谓连接,是指两个对等实体为进行数据通信而进行的一种结合。面向连接服务要求在数据交换之前先建立连接;当数据交换结束后终止该连接。一般来说,面向连接服务过程分为三个阶段:连接建立、数据传输和连接释放。在传送数据时是按序传送的。这点和电路交换的许多特性很相
40、似,因此面向连接服务又称为“虚电路服务”。面向连接服务比较适合于在一段时间间隔内要向同一目的地发送许多报文的情况。对于发送很短的零星报文,则连接建立和释放的开销过大。2.无连接服务无连接服务无连接服务指两个实体之间的通信不需要先建立好一条连接,其所需的下层资源在数据传输时动态地进行分配。无连接服务的另一个特征是它不需要通信的两个实体同时是活跃的。只有发送端的实体正在进行发送时,它才必须是活跃的。而接收端的实体只有在进行接收操作时才必须是活跃的。无连接服务的优点是灵活方便和效率高;但它不能防止报文的丢失、重复或失序,该问题必须由应用程序根据需要自行解决。无连接服务特别适合于传送少量零星的报文。无
41、连接服务又可分为以下三种类型:数据报(datagram):它的特点是不需要接收端做任何响应,因而是一种不可靠的服务。数据报常被描述为“尽最大努力交付”(besteffortdelivery)。在TCP/IP协议栈中,由UDP协议提供数据报服务。证实交付(confirmeddelivery):又被称为可靠的数据报。这种服务对每一个报文由提供服务的协议层产生一个证实给发方,这种证实只能保证报文已经发送给远端目的站了,但并不能保证目的站用户已收到这个报文。请求应答(request-reply):这种类型的数据报是接收端的用户每收到一个报文,就向发送端的用户发送一个应答报文。与“证实交付”的主要区别在
42、于应答是由接收端的用户而不是提供服务的协议层发出的。事务处理(transaction)中的“一问一答”方式的短报文以及数据库中的查询,都很适合使用这种类型的服务。3.两种服务的比较两种服务的比较表1.5列出了面向连接服务与无连接服务的主要区别。这些区别为网络应用编程选择何种类型的服务提供了依据。表表1.5 面向连接服务与无连接服务的比较面向连接服务与无连接服务的比较 1.2.5 差错处理差错处理任何应用程序均需进行差错处理,即检查函数返回的调用结果的正确性并做出相应的处理。网络应用编程接口提供差错处理的基本设施,更高一级的差错处理需要应用程序来实现。在UNIX系统中,有一个全局变量errno,
43、每当一个Unix函数(不仅仅是网络应用编程接口中的函数)中出现差错时,errno将被置成一个指示错误类型的正数,而函数本身则通常返回1。errno的值在函数发生错误时设置。如果函数正确返回,则errno的值就无定义。在UNIX系统中,所有的错误代码都是常数值,在头文件sys/errno.h中定义。在一个进程中共享所有全局变量的多线程编程不适宜采用把错误代码保存在全局变量errno中的方法。因此,在多线程环境中,每个线程必须有自己的errno变量。通常情况下,当编译时的程序指定为可重入时,即有编译选项为-D_REENTRANT,编译器缺省将errno.h头文件中的errno宏扩展为一个函数,由该函数访问errno变量局限于某个线程的副本,提供一个局限于线程的errno变量的隐式请求。在有些UNIX系统中,如DigitalUNIX,还有一个与错误处理有关的全局变量sys_errlist,它是一个二维字符串数组,用错误代码作为数组的下标即可得到该错误代码对应的错误报文。习题与思考题习题与思考题 1.描述IEEE802.3MAC帧的结构。不同的高层协议在帧的类型字段中的代码是什么?2.简述TCP/IP协议族的不同层中的各种协议及其作用。3.简述IP数据报中各字段的含义。4.简述并比较MAC地址、IP地址和端口的作用。5.试举例说明网络编程时可能遇到的问题,并提出相应的比较合理的解决方案。
限制150内