TCP/IP协议技术应用知识汇总

来源:互联网 发布:噪声计算软件 编辑:程序博客网 时间:2024/05/04 08:59

OSI网络分层参考模型

网络协议设计者不应当设计一个单一、巨大的协议来为所有形式的通信规定完整的细节,而应把通信问题划分成多个小问题,然后为每一个小问题设计一个单独的协议。这样做使得每个协议的设计、分析、时限和测试比较容易。协议划分的一个主要原则是确保目标系统有效且效率高。为了提高效率,每个协议只应该注意没有被其他协议处理过的那部分通信问题;为了主协议的实现更加有效,协议之间应该能够共享特定的数据结构;同时这些协议的组合应该能处理所有可能的硬件错误以及其它异常情况。为了保证这些协议工作的协同性,应当将协议设计和开发成完整的、协作的协议系列(即协议族),而不是孤立地开发每个协议。

在网络历史的早期,国际标准化组织(ISO)和国际电报电话咨询委员会(CCITT)共同出版了开放系统互联的七层参考模型。一台计算机操作系统中的网络过程包括从应用请求(在协议栈的顶部)到网络介质(底部) ,OSI参考模型把功能分成七个分立的层次。图2.1表示了OSI分层模型。

 

  ┌─────┐

  │ 应用层 │←第七层

  ├─────┤

  │ 表示层 │

  ├─────┤

  │ 会话层 │

  ├─────┤

  │ 传输层 │

  ├─────┤

  │ 网络层 │

  ├─────┤

  │数据链路层│

  ├─────┤

  │ 物理层 │←第一层

  └─────┘

  图2.1 OSI七层参考模型

 

OSI模型的七层分别进行以下的操作:

第一层——物理层

第一层负责最后将信息编码成电流脉冲或其它信号用于网上传输。它由计算机和网络介质之间的实际界面组成,可定义电气信号、符号、线的状态和时钟要求、数据编码和数据传输用的连接器。如最常用的RS-232规范、10BASE-T的曼彻斯特编码以及RJ-45就属于第一层。所有比物理层高的层都通过事先定义好的接口而与它通话。如以太网的附属单元接口(AUI),一个DB-15连接器可被用来连接层一和层二。

第二层——数据链路层

数据链路层通过物理网络链路提供可靠的数据传输。不同的数据链路层定义了不同的网络和协议特征,其中包括物理编址、网络拓扑结构、错误校验、帧序列以及流控。物理编址(相对应的是网络编址)定义了设备在数据链路层的编址方式;网络拓扑结构定义了设备的物理连接方式,如总线拓扑结构和环拓扑结构;错误校验向发生传输错误的上层协议告警;数据帧序列重新整理并传输除序列以外的帧;流控可能延缓数据的传输,以使接收设备不会因为在某一时刻接收到超过其处理能力的信息流而崩溃。数据链路层实际上由两个独立的部分组成,介质存取控制(Media Access Control,MAC)和逻辑链路控制层(Logical Link Control,LLC)。MAC描述在共享介质环境中如何进行站的调度、发生和接收数据。MAC确保信息跨链路的可靠传输,对数据传输进行同步,识别错误和控制数据的流向。一般地讲,MAC只在共享介质环境中才是重要的,只有在共享介质环境中多个节点才能连接到同一传输介质上。IEEE MAC规则定义了地址,以标识数据链路层中的多个设备。逻辑链路控制子层管理单一网络链路上的设备间的通信,IEEE 802.2标准定义了LLC。LLC支持无连接服务和面向连接的服务。在数据链路层的信息帧中定义了许多域。这些域使得多种高层协议可以共享一个物理数据链路。

第三层——网络层

网络层负责在源和终点之间建立连接。它一般包括网络寻径,还可能包括流量控制、错误检查等。相同MAC标准的不同网段之间的数据传输一般只涉及到数据链路层,而不同的MAC标准之间的数据传输都涉及到网络层。例如IP路由器工作在网络层,因而可以实现多种网络间的互联。

第四层——传输层

传输层向高层提供可靠的端到端的网络数据流服务。传输层的功能一般包括流控、多路传输、虚电路管理及差错校验和恢复。流控管理设备之间的数据传输,确保传输设备不发送比接收设备处理能力大的数据;多路传输使得多个应用程序的数据可以传输到一个物理链路上;虚电路由传输层建立、维护和终止;差错校验包括为检测传输错误而建立的各种不同结构;而差错恢复包括所采取的行动(如请求数据重发),以便解决发生的任何错误。传输控制协议(TCP)是提供可靠数据传输的TCP/IP协议族中的传输层协议。

第五层——会话层

会话层建立、管理和终止表示层与实体之间的通信会话。通信会话包括发生在不同网络应用层之间的服务请求和服务应答,这些请求与应答通过会话层的协议实现。它还包括创建检查点,使通信发生中断的时候可以返回到以前的一个状态。

第六层——表示层

表示层提供多种功能用于应用层数据编码和转化,以确保以一个系统应用层发送的信息可以被另一个系统应用层识别。表示层的编码和转化模式包括公用数据表示格式、性能转化表示格式、公用数据压缩模式和公用数据加密模式。

公用数据表示格式就是标准的图像、声音和视频格式。通过使用这些标准格式,不同类型的计算机系统可以相互交换数据;转化模式通过使用不同的文本和数据表示,在系统间交换信息,例如ASCII(American Standard Code for Information Interchange,美国标准信息交换码);标准数据压缩模式确保原始设备上被压缩的数据可以在目标设备上正确的解压;加密模式确保原始设备上加密的数据可以在目标设备上正确地解密。

表示层协议一般不与特殊的协议栈关联,如QuickTime是Applet计算机的视频和音频的标准,MPEG是ISO的视频压缩与编码标准。常见的图形图像格式PCX、GIF、JPEG是不同的静态图像压缩和编码标准。

第七层——应用层

应用层是最接近终端用户的OSI层,这就意味着OSI应用层与用户之间是通过应用软件直接相互作用的。注意,应用层并非由计算机上运行的实际应用软件组成,而是由向应用程序提供访问网络资源的API(Application Program Interface,应用程序接口)组成,这类应用软件程序超出了OSI模型的范畴。应用层的功能一般包括标识通信伙伴、定义资源的可用性和同步通信。因为可能丢失通信伙伴,应用层必须为传输数据的应用子程序定义通信伙伴的标识和可用性。定义资源可用性时,应用层为了请求通信而必须判定是否有足够的网络资源。在同步通信中,所有应用程序之间的通信都需要应用层的协同操作。

OSI的应用层协议包括文件的传输、访问及管理协议(FTAM) ,以及文件虚拟终端协议(VIP)和公用管理系统信息(CMIP)等。

2.2 TCP/IP分层模型

TCP/IP分层模型(TCP/IP Layening Model)被称作因特网分层模型(Internet Layering Model)、因特网参考模型(Internet Reference Model)。图2.2表示了TCP/IP分层模型的四层。













 

  ┌────────┐┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐

  │        ││D│F│W│F│H│G│T│I│S│U│ │

  │        ││N│I│H│T│T│O│E│R│M│S│其│

  │第四层,应用层 ││S│N│O│P│T│P│L│C│T│E│ │

  │        ││ │G│I│ │P│H│N│ │P│N│ │

  │        ││ │E│S│ │ │E│E│ │ │E│它│

  │        ││ │R│ │ │ │R│T│ │ │T│ │

  └────────┘└─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘

  ┌────────┐┌─────────┬───────────┐

  │第三层,传输层 ││   TCP   │    UDP    │

  └────────┘└─────────┴───────────┘

  ┌────────┐┌─────┬────┬──────────┐

  │        ││     │ICMP│          │

  │第二层,网间层 ││     └────┘          │

  │        ││       IP            │

  └────────┘└─────────────────────┘

  ┌────────┐┌─────────┬───────────┐

  │第一层,网络接口││ARP/RARP │    其它     │

  └────────┘└─────────┴───────────┘

      图2.2 TCP/IP四层参考模型

TCP/IP协议被组织成四个概念层,其中有三层对应于ISO参考模型中的相应层。ICP/IP协议族并不包含物理层和数据链路层,因此它不能独立完成整个计算机网络系统的功能,必须与许多其他的协议协同工作。

TCP/IP分层模型的四个协议层分别完成以下的功能:

第一层——网络接口层

网络接口层包括用于协作IP数据在已有网络介质上传输的协议。实际上TCP/IP标准并不定义与ISO数据链路层和物理层相对应的功能。相反,它定义像地址解析协议(Address Resolution Protocol,ARP)这样的协议,提供TCP/IP协议的数据结构和实际物理硬件之间的接口。

第二层——网间层

网间层对应于OSI七层参考模型的网络层。本层包含IP协议、RIP协议(Routing Information Protocol,路由信息协议),负责数据的包装、寻址和路由。同时还包含网间控制报文协议(Internet Control Message Protocol,ICMP)用来提供网络诊断信息。

第三层——传输层

传输层对应于OSI七层参考模型的传输层,它提供两种端到端的通信服务。其中TCP协议(Transmission Control Protocol)提供可靠的数据流运输服务,UDP协议(Use Datagram Protocol)提供不可靠的用户数据报服务。

第四层——应用层

应用层对应于OSI七层参考模型的应用层和表达层。因特网的应用层协议包括Finger、Whois、FTP(文件传输协议)、Gopher、HTTP(超文本传输协议)、Telent(远程终端协议)、SMTP(简单邮件传送协议)、IRC(因特网中继会话)、NNTP(网络新闻传输协议)等,这也是本书将要讨论的重点。

2.3 IP地址

前面的章节我们已经指出,由于不同网络的硬件存在不同类型的地址,TCP/IP需要有它自己的地址编码系统。IP协议规定每台主机(严格地说是每个因特网接口)都通过一个32位全局唯一的因特网地址来标识。通常IP地址是采用以点隔开的四个十进制数的形式来表示。每个数代表地址中的一个二位十六进制数(即八位二进制数)。例如IP地址205.187.251.2就表示相应的四个二位十六进制值 CD BB FB 02。

2.3.1 地址基本编码格式

在IPv4(IP协议,版本4)标准中,每个32位IP地址包含两个部分:网络标识符和网络内的主机编号。没有两个网络能够分配同一个网络标识符,同一网络上的两台计算机也不可能分配同一个主机编号。IANA负责分配网络标识符,以确保网络标识符的唯一性、因特网服务提供商(Internet Service Provider,ISP)或网络管理员负责维护同一网络上主机编号的唯一性等。网络标识符和主机编号的边界由IP地址的类别来确定,不同类别的IP地址能够满足不同规模网络的组网需要。为了满足不同的网络与主机比例的期望值,IP协议将地址编码分成三种基本类别:A类、B类、C类。D类地址是为多点广播而定义的,剩余的E类地址保留为实验使用,如图2.3所示。

  0          1          2          3

  0 123456789001234567890012345678901

  ┌─┬─────┬─────────────────────────┐

  │0│网络标识符│        主机编号             │A类

  ├─┴┬────┴────────┬────────────────┤

  │10│网络标识符        │     主机编号       │B类

  ├──┴┬────────────┴───────┬────────┤

  │110│       网络标识符        │  主机编号  │C类

  ├───┴┬───────────────────┴────────┤

  │1110│         多点广播地址             │D类

  ├────┴┬───────────────────────────┤

  │11110│        实验保留地址             │E类

  └─────┴───────────────────────────┘

      图2.3 IP地址的五种类别

 

A类网络地址第一位为“0”。前8位(0~7)代表网络标识符,后24位(8~31)代表本网络上的主机编号。因此这类网络存在128(27)个A类网络标识符,每个网络有16777216(224)台主机。例如10.0.0.1代表A类网10.0.0.0和1号主机。B类网络地址的前两位是“10”。前16位(0~15)代表网络标识符,每个网络有65536(216)台主机。例如128.1.0.1代表B类网128.1.0.0和1号主机。C类网络地址的前三位是“110”。前24位(0~23)代表网络标识符,后8位(24~31)代表网络上的主机编号。C类网络存在2097152(221)个网络标识符,每个网络有256(28)台主机。例如192.0.1.1代表C类网192.0.1.0和1号主机。可见地址的类别可以从第一个主机号辨别。可见IP地址的类别可以由第一个十进制数的范围辨别,如图2.4所示。

  ┌─┬────────┬───────┬────────┐

  │类│第一个10进制数│  网络数目 │   主机数目 │

  ├─┼────────┼───────┼────────┤

  │A│ 0~127  │  127  │16777214│

  ├─┼────────┼───────┼────────┤

  │B│128~191 │ 16834 │  65534 │

  ├─┼────────┼───────┼────────┤

  │C│192~223 │2097151│   254  │

  └─┴────────┴───────┴────────┘

    图2.4 IP地址的类别可以由点分十进制数地址的

         第一个十进制数的范围辨别

 

2.3.2 子网掩码

在因特网早期,每个组织机构的网络都很简单,通常一个组织机构也只有一个局域网,只需要网络标识符和主机编号这两级结构就足够了。随着因特网的进一步膨胀,B类地址消耗得很快,这种两级结构很难满足日益增长的网络的要求。到了1984年,在地址格式中又增加了第三级子网结构,子网对网络内部的地址空间进行再划分,这样就缓解了B类地址的需求,如图2.5所示。

  ┌─────┬────┬──┐

  │网络标识符│ 子网 │主机│

  └─────┴────┴──┘

        │←─主机编号→│

 

    图2.5 三级IP地址格式

 

子网或子网络是A、B或C类网络的一个子集。网络掩码用来把网络信息和主机信息分开。每个A、B或C类地址实际上都是一个自然掩码。A类地址的自然掩码255.0.0.0;B类地址的自然掩码是255.255.0.0;C类地址的自然掩码是255.255.255.0。如果没有子网的引入,网络标识符的使用会很限。使用了掩码,网络就可以分化成子网,并把地址的网格部分延伸到主机部分。子网划分技术增加了子网的数量,减少了主机的数量。如图2.6所示,掩码255.255.0.0把A类IP地址8.0.0.1划分成一个网络部分、一个子网部分和一个主机部分。

图2.6 基本子网划分的例子

要注意的是,子网掩码的格式是有限制的。子网掩码必须是相邻接的,它们的长度也必须要大于1,也就是说一个掩码应该有从左开始的连续的“1”,其余部分为“0”。下面的掩码可以用来把C类网络理论上可用的256个地址划分成多个子网。

  255(1111 1100)——64个子网,4台主机/子网

  248(1111 1000)——32个子网,8台主机/子网

  240(1111 0000)——16个子网,16台主机/子网

  224(1110 0000)——8个子网,32台主机/子网

  192(1100 0000)——4个子网,64台主机/子网

  128(1000 0000)——2个子网,128台主机/子网

2.3.3 特殊用途的IP地址

一台计算机可以分配一个主机地址,同是一个网络也可以分配一个网络地址。另外,在很多情况下主机并不知道自己的IP地址或者对方的IP地址,比如在主机启动时就是这样的。因此IP协议定义了一套特殊地址格式,称作保留地址,保留地址从不分配给某台主机,如图2.8所示。

  ┌──────────────┐

  │      全0      │本地网上的本主机

  └──────────────┘

  ┌───────┬──────┐

  │网络标识符全0│ 主机编号 │本地网上的主机

  └───────┴──────┘

  ┌───────┬──────┐

  │ 网络标识符 │主机编号全0│网络的伯克利广播

  └───────┴──────┘

  ┌──────────────┐

  │      全1      │本地网的有限广播

  └──────────────┘

  ┌───────┬──────┐

  │ 网络标识符 │主机编号全1│网络的直线广播

  └───────┴──────┘

  ┌───────┬──────┐

  │  127  │  任意  │本地环路

  └───────┴──────┘

  图2.8 特殊用途的IP地址格式

 

IP保留主机编号为0的地址,用它来表示一个网络,例如地址205.187.251.0表示C类网络,该网络的网络标识符是205.187.251。

当网络标识符不知道时,主机地址就可以用全0的网络标识符来代替。例如:特殊地址0.0.0.0表示本网络的主机,它被应用在启动协议中;特殊地址0.X.Y.Z表示本网络的主机X.Y.Z。这些特殊的IP地址只能当作源地址使用。

为了很方便地发送一个包的副本给同一物理网络上的所有主机,IP为每个网络定义了一个直接广播地址(directed broadcast address)。IP保留了主机编号中所有位为全1的地址,用它来表示一个网络的直接广播地址。例如:A.255.255.255、B.B.255.255、C.C.C.255就分别是A、B、C网络的广播地址。当一个包被发送到上述的一个直接广播地址时,这个包的单个副本通过因特网路由器到达特定网络,然后被传送到这个网络上的所有主机。在这里有个历史遗留问题,伯克利软件分发(Berkeley Software Distribution,BSD)的TCP/IP协议实现使用主机编号中所有位为全0而不是全1来表示直接广播地址,这种地址格式被非正式地称为伯克利广播(Berkeley Broadcast)地址。以上这些特殊的IP地址只能当作目的地址使用。

在测试网络应用程序时,还可以使用IP定义的一个特殊的本地环路地址(loopback address),发往该地址的任何分组都不会传出主机。它实际上是一个本地环路网络标符,IP保留A类网络127用作本地环路。任何具有127.X.Y.Z形式的地址都被当作本地环路地址,127.0.0.1是最普遍的本地环路地址,也可以用localhost来表示。

另外,IANA还为某些特殊分组保留了一系列多点广播地址。例如:224.0.0.1用来表示本地子网上的所有系统;224.0.0.2用来表示本地子网的所有路由器。

2.4 网络数据的传输次序

在PC机中,低位存储地址包含数据的低位字节,这种存储顺序被称作为Little Endial。而在因特网传输中,TCP/IP协议规定采用低位存储地址包含数据高位字节的Big Endial存储顺序,并把这种存储次序称作网络标准字节顺序,如图2.9所示。实际网络传输时,数据按每32位二进制数为一组进行传输。图中把每个32位二进制数按照书写方式分成4个八位二进制数,并且标明了实际的字节传输顺序。在传输每个八位二进制时,按照从左到右、从最高的符号位到最低位依次进行传输。

为了使通信的双方都能理解数据分组所携带的源地址、目的地址以及分组的长度等二进制信息,主机和路由器在发送一个分组之前,必须把二进制信息项从本地表示转换成网络标准字节顺序,并且当分组到达目的网络时又把它们从网络字节顺序换成特定的主机顺序。至于分组中用户数据区的数据,则可以选择任何数据格式,他们不会被转换成网络标准字顺序,而是由具体通信的双方负责解释。

2.5 网间协议(IP)

因特网的核心层是网间层和传输层。IP协议是建立TCP/IP网络的最基本协议,它定义了在整个TCP/IP网络上传输数据所用的基本单元。网间层协议为上层协调提供了无连接的、不可靠的数据报传送服务,其他协议作为IP数据报的数据被承载。它只是尽力地、最快地传递数据,同时提供差错校验和路由选择,但产不对数据的到达与否、数据到达的连续性和顺序性作任何保证,也不提供任何纠错功能。RFC791中定义了IPv4(网间协议,版本4),读者可参考RFC 791文件。

       2.5.1 IP数据报格式

TCP/IP协议使用的IP数据报(IP datagram)和物理网络上传输数据单元用的硬件帧有相同的格式,它包含一个数据报报头和一个数据区,如图2.10所示。

  ┌──────┬──────┐

  │ IP报头 │IP数据区 │IP数据报

  └──────┴──────┘

  ┌───┬─────────┐

  │帧头部│ 帧数据     │硬件帧

  └───┴─────────┘

   图2.10 IP数据报的一般格式

 

IP数据报头包含有源、目的信息,在穿越因特网时作寻径用,并且指明承载负载的协议类型,如TCP、ICMP、UDP、等。数据报所携带的数据量不固定,发送方根据特定的用途选择合适的数据量。在IPv4版本中,一个数据报的数据量可以小到一个字节,而如果包括报头大小的话,数据报则可以大到64K个字节。图2.11给出了IP数据报更详细的格式。

图2.11 IP数据报格式

为了方便编程,这里同时给出了IP数据报的C语言结构。注意,它并没有包括可选项和填充域。

  /* The IP header for VC++ */

  typedef struct tagIPHEADER

  {

  unsigned char h_len:4:/* length of tht header */

  unsigned char version:4;/* version of IP */

  unsigned char tos;/* type of service */

  unsigned short total_len;/* total length of the packet */

 

  unsigned short ident;/* unique identifier */

  unsigned short frag_and_flags;/*flags & frag offset */

  unsigned char ttl;/* TTL(Time To Live)

  unsigned char proto;/* protocol(TCP,UDP etc) */

  unsigned short checksum;/* IP head checksum */

 

  unsigned int sourceIP;//*source IP Address */

  unsigned int destIP;/*destination IP Address */

  }IPHEADER;

 

下面我们将分别讨论IP数据报报头中各域的详细含义。

2.5.2 版本协议号

IP数据报中的第一个域是4比特长的版本域(version)。版本号规定了数据报的格式,同的IP协议版本其数据报格式有所不同。因此IP协议软件在处理数据报之前,首先必须检查版本号,对不能正确识别的数据报版本应该予以拒绝。当前的IP协议版本号为4,常常称作IPv4;下一个将要发展的IP协议,它的版本号是6,也就是我们常说的IPv6。

2.5.3 数据报长度和填充域

紧接着版本域的是4比特长的报头长度域(h_len)。它指出了按32比特长标定的报头长度,报头的长度实际上是h_len<<2。如果报头长度不是32比特的整数倍,则由填充域添0补齐。

另外,报头中还有一个16比特长的数据报总长域(total_len)。它以字节为单位标定整个IP数据报的长度,并没有要按32比特长为单位对齐的要求。由于总长域占有16比特,所以数据报最长可达到216-1字节。

2.5.4 服务类型和优先权

8比特长的服务类型城(tos)规定本数据报的处理方式,并分成五个子域,其子域结构如图2.12所示。

     0 1 2 3 4 5 6 7

    ┌───┬───────┐

    │   │  传输类型 │

    │优先级├─┬─┬─┬─┤

    │   │D│T│R│C│

    └───┴─┴─┴─┴─┘

    图2.12 组成服务类型域的五个子域

 

3比特的优先级(PRECEDENCE)子域指明本数据报的优先级,允许发送方表示本数据报的重要程度。优先级的取值从0到7,0表示普通优先级,即表示网络控制优先级。优先级是由用户指定的,大多数主机和路由器软件对此都不予理睬,但这种思想却是十分重要的,因为它毕竟提供了一种手段,允许控制信息享受比一般数据更高的优先级。比如说,如果主机和路由器都服从优先级的话,则可以给拥塞控制信息赋予更高的优先级,从而实现不受拥

塞影响的拥塞控制算法。

D、T、R、C位表示本数据报所期望的传输类型。当这些比特位取值为1时,D代表低时延(Delay)T代表高吞吐量(Throughput)R代表高可靠性(Reliability),C代表低开销。当然,上述三位只是用户的请求,因特网并不能保证提供所要求的传输,只是把它们作为路由选择时的参考。另外要注意的是,每种物理网络技术的时延、吞吐量、可靠性性能之间往往是此强彼弱的,用户应只指定它们中的一个,同时指定多个没有任何意义。

2.5.5 标识符、标志和分片偏移量

网络数据最终都是通过物理网络帧传输,IP数据报也不例外。在理想的情况下,整个数据报被封装在一个物理帧中传输时网络效率最高。但是,不同的物理网络技术上所采用的最大帧长是相异的,这个帧尺寸称作最大传输单元(Maximum Transfer Unit,MTU)。例如:10Mb/s以太网每帧最多可承载1500个字节,而在100Mb/s的FDDI环上承载就可以大到4470个字节。

当数据报分组从一个MTU较大的网络经路由器中继到一个MTU较小的网络上时,由于分组过长,路由器就会要么拒绝中继,要么将数据报分片后再传送。分片通常在路由器中完成,而数据报重组由主机的IP协议软件完成。IP报头中的标识符(ident)、标志和分片偏移量(frag_and_flags)三个域用作分片和重组控制。标识符标识数据报发送时的先后顺序,每产生一个新数据报标识符增一,目的机用它来重编分片数据报。同一IP数据报分片后,标识符域不变。分片偏移量指在完整的数据报内该分片的偏移量,偏移量按8个字节为单位计算。标志域由3个比特位组成,第一位保留为0,如图2.l3所示。

 

     0  1 2

    ┌─┬──┬──┐

    │0│DF│MF│

    └─┴──┴──┘

    图2.13 标志中的各位

 

DF位表示分组禁止被分片。如果DF位置1,路由器就会不加考虑地废弃超长分组,同时还会发送一个ICMP错误信息给这个分组的源站点。MF位表示分组片未完。如果MF位清0,此分片是IP数据报分组的最后一片。

2.5.6 存活时间

存活时间(ttl)设置了该数据报在因特网中允许存在的最大生存时间,该时间以秒为单位。每当产生一新的数据报时,就为它设置一个最大的生存时间。当数据报通过的主机和路由器对该数据报进行处理时,又减去消耗的时间。一旦时间小于等于0,便将该数据报从因特网中删除,并向信源机发回出错信息。

路由器通常不知道物理网络上的传送时间,存活时间也只是一个数量级的概念,并不要求精确。因为精确的记时首先需要因特网中所有节点的时钟精确同步,这是很难做到的。有一些办法可以简化处理数据报且不需要同步时钟:第一,路由上的每个路由器处理报头时,从存活时间中减去一;第二,如果数据报在路由器中因等待服务被延迟,则从存活时间中减去等待的时间。

为IP数据报设置存活时间的思想,保证了即使路由表不可靠而选择了一个循环路由,数据报都不会在因特网中无休止地流动。RFC建议存活时间的缺省设置值为64,而Windows 98和 Windows NT 4.0的用户使用的存活时间缺省值为128。

2.5.7 协议序列号

协议域表示IP数据报中数据的协议类型,如TCP、UDP、ICMP等。表2-1列出了IANA已分配的常见协议序列号。

  表2-1

  ━━━━━━┯━━━━━━━┯━━━━━━━━━━━━━━━━━━

   十进制编号│  关键字  │  协议名称

  ──────┼───────┼──────────────────

       0│       │保留

  ──────┼───────┼──────────────────

       1│ICMP   │因特网控制报文协议

  ──────┼───────┼──────────────────

       2│IGMP   │因特网组管理协议

  ──────┼───────┼──────────────────

       3│GGP    │网关-网关协议

  ──────┼───────┼──────────────────

       4│IP     │IP里的IP

  ──────┼───────┼──────────────────

       5│ST     │数据流

  ──────┼───────┼──────────────────

       6│TCP    │传输控制协议

  ──────┼───────┼──────────────────

       8│EGP    │外部网关协议

  ──────┼───────┼──────────────────

      17│UDP    │用户数据报协议

  ──────┼───────┼──────────────────

      29│ISO-TP4│ISO传输协议类4

  ──────┼───────┼──────────────────

   41~60│       │未分配

  ──────┼───────┼──────────────────

      70│VISA   │VISA协议

  ──────┼───────┼──────────────────

      80│ISO-IP │ISO网间协议(CLNP)

  ──────┼───────┼──────────────────

      88│IGRP   │内部网关协议

  ──────┼───────┼──────────────────

      89│OSPF   │开放式最短路径优先协议

  ──────┼───────┼──────────────────

  99~254│       │未分配

  ──────┼───────┼──────────────────

     255│       │保留

  ━━━━━━┷━━━━━━━┷━━━━━━━━━━━━━━━━━━

2.5.8 报头校验和

报头中的任何一个域发生传输错误都会产生很多无法预料的结果。比如:如果发送地址错误,就可能无法删除一个已经过期的分组以及重编不属于同一报文的分片。报头校验和(Checksum)就可以保护IP数据报不产生这类错误,确保报头的完整性。

IP报头校验和的计算是先将校验和域置0,把报头看成一个16位的整数予列,对每个整数分别计算其二进制反码,相加后再对结果计算一次二进制反码而求得的,它常被简称为反码和的反码。

2.5.9 源地址和目的地址

源IP地址(sourceIP)和目的IP地址(destIP)域包含了数据报的原始发送方和最终接收方的32位的IP地址。数据包可能经过许多中间路由器,但是这两个地址域始终不变。

2.5.10 IP选项

目的IP地址后面的IP选项域是任选域,它的主要目的是用来装载特定的功能以便于网络测试和调试。在IP数据报中,选项是连续出现的,中间没有任何分隔符。每个选项包含一个选项码字节,后面可能跟有一个长度字节和该选项的一组字节数据。如图2.14所示,选项代码字节分成三个域。

         0 1 2 3 4 5 6 7

       ┌─┬───┬───────┐

       │C│选项类│ 选项号   │

       └─┴───┴───────┘

      图2.14 选项代码字节中的三个域

 

路由器在对IP数据报分片时,如果拷贝标志位(C)置1,说明该选项应被拷贝到所有片中去;如果置0,则仅把该选项拷贝到第一个分片中。

选项类和选项号指明选项的一般类型,并且给定了该类中的一个特殊选择。现在已经定义的有两个选项组:0是控制选项,2是调试和测量选项。在同一选项类里面,用选项号来标识选项。表2-2列出了RFC 791中已经定义的8种选项,并给出了它们的选项类和选项号,可以看出大多数选项都是用于控制目的。

  表2.2

  ━━━┯━━━┯━━┯━━━━━━━━━━━━━━━━━━━━━━

  选项类│选项号│长度│描述

  ───┼───┼──┼──────────────────────

   0 │ 0 │- │选项列表结束。该选项只占一个字节没有长度字节

  ───┼───┼──┼──────────────────────

   0 │ 1 │- │无操作。该选项只占一个字节,没有长度字节。

  ───┼───┼──┼──────────────────────

   0 │ 2 │11│安全和处理限制(用于军事目的)

  ───┼───┼──┼──────────────────────

   0 │ 3 │可变│自由源路由。用来在一个指定路径为数据报选路

  ───┼───┼──┼──────────────────────

   0 │ 7 │可变│记录路由。用来跟踪IP数据报所采用的路由

  ───┼───┼──┼──────────────────────

   0 │ 8 │ 4│数据流标识符。已过时。

  ───┼───┼──┼──────────────────────

   0 │ 9 │可变│严格源路由。用来在指定路径上为数据报选路。

  ───┼───┼──┼──────────────────────

   2 │ 4 │可变│因特网时戳。用来记录路由上的时间戳

  ━━━┷━━━┷━━┷━━━━━━━━━━━━━━━━━━━━━━  

.6 校验和差错检验

现在的通信系统实际上很少在传输错误。例如微小通信信道的误码率通常能达到每传输10兆字节少于1个字节的错误(10-7),光纤信道的误码率通常是低于10-9。但不管怎么说,传输差错总是存在,必须采取相应的措施检测差错确保数据的正确。为了检测差错,网络系统通常随数据发送一小部分附加信息。发送方从数据中计算附加信息,并且接收方进行同样的计算来核对结果。

有一些比较常用的方法能有效地检测差错,比如奇偶校验(parity chedk)、累加和、循环冗余校验,TCP/IP协议中则采用“反码和的反码”的校验和方法。奇偶校验机制要求对每个发送的字符附加一个奇偶校验位(parity bit),使得这个字符中1的个数为偶数或奇数,这被分别称作偶校验或奇检验。累加和是对所有的数据按字节、字或双字对齐求字节、字或双字和,并且不记进位。循环冗余校验和反码和的校验相对来说要复杂些,下面分别给出了对应的代码。

  /* 用于计算CRC-16的查找表 */

  static short crctab[]=

  {

  0x0000,0xC0C1,0xC181,0x0140,0xC301,0x03C0,0x0280,0xC241,

  0xC601,0x06C0,0x0780,0xC741,0x0500,0xC5C1,0xC481,0x0440,

  0xCC01,0x0CC0,0x0D80,0xCD41,0x0F00,0xCFC1,0xCE81,0x0E40,

  0x0A00,0xCAC1,0xCB81,0x0B40,0xC901,0x09C0,0x0880,0xC841,

  0xD801,0x18C0,0x1980,0xD941,0x1B00,0xDBC1,0xDA81,0x1A40,

  0x1E00,0xDEC1,0xDF81,0x1F40,0xDD01,0x1DC0,0x1C80,0xDC41,

  0x1400,0xD4C1,0xD581,0x1540,0xD701,0x17C0,0x1680,0xD641,

  0xD201,0x12C0,0x1380,0xD341,0x1100,0xD1C1,0xD081,0x1040,

  0xF001,0x30C0,0x3180,0xF141,0x3300,0xF3C1,0xF281,0x3240,

  0x3600,0xF6C1,0xF781,0x3740,0xF501,0x35C0,0x3480,0xF441,

  0x3C00,0xFCC1,0xFD81,0x3D40,0xFF01,0x3FC0,0x3E80,0xFE41,

  0xFA01,0x3AC0,0x3B80,0xFB41,0x3900,0xF9C1,0xF881,0x3840,

  0x2800,0xE8C1,0xE981,0x2940,0xEB01,0x2BC0,0x2A80,0xEA41,

  0xEE01,0x2EC0,0x2F80,0xEF41,0x2D00,0xEDC1,0xEC81,0x2C40,

  0xE401,0x24C0,0x2580,0xE541,0x2700,0xE7C1,0xE681,0x2640,

  0x2200,0xE2C1,0xE381,0x2340,0xE101,0x21C0,0x2080,0xE041,

  0xA001,0x60C0,0x6180,0xA141,0x6300,0xA3C1,0xA281,0x6240,

  0x6600,0xA6C1,0xA781,0x6740,0xA501,0x65C0,0x6480,DxA441,

  0x6C00,0xACC1,0xAD81,0x6D40,0xAF01,0x6FC0,0x6E80,0xAE41,

  0xAA01,0x6AC0,0x6B80,0xAB41,0x6900,0xA9C1,0xA881,0x6840,

  0x7800,0xB8C1,0xB981,0x7940,0xBB01,0x7BC0,0x7A80,0xBA41,

  0xBE01,0x7EC0,0x7F80,0xBF41,0x7D00,0xBDC1,0xBC81,0x7C40,

  0xB401,0x74C0,0x7580,0xB541,0x7700,0xB7C1,0xB681,0x7640,

  0x7200,0xB2C1,0xB381,0x7340,0xB101,0x7lC0,0x7080,0xB041,

  0x5000,0x90C1,0x9181,0x5140,0x9301,0x53C0,0x5280,0x9241,

  0x9601,0x56C0,0x5780,0x9741,0x5500,0x95C1,0x9481,0x5440,

  0x9C01,0x5CC0,0x5D80,0x9D41,0x5F00,0x9FC1,0x9E81,0x5E40,

  0x5A00,0x9AC1,0x9B81,0x5B40,0x9901,0x59C0,0x5880,0x9841,

  0x8801,0x48C0,0x4980,0x8941,0x4B00,0x8BC1,0x8A81,0x4A40,

  0x4E00,0x8EC1,0x8F81,0x4F40,0x8D01,0x4DC0,0x4C80,0x8C41,

  0x4400,0x84C1,0x8581,0x4540,0x8701,0x47C0,0x4680,0x8641,

  0x8201,0x42C0,0x4380,0x8341,0x4100,0x8lC1,0x8081,0x4040

  };

  /*计算长度为len的buf缓冲区中字节的CRC-16校验和

  *

  *返回的CRC-16校验和是字长型的无符号数

  *crc是用于累计的CRC-16校验和

  *buf是字节型的指针

  *len是按字节buf的长度

  */

  int

  crcbuf(crc,len,buf)

  register int crc;/* running CRC value*/

  register u_int len;

  register u_char *buf;

  {

   register u_int i;

   for(i=0;i    crc = ((crc>>8)&0xff)^crctab[(crc^*buf++)&0xff];

   return(crc);

  }

  /*计算反码和的反码

  *返回字符长型的无符号数

  *buffer是字长型的指针

  *size是按字节计算的buffer的长度

  */

  unsigned short checksum(unsigned short *buffer,int size)

  {

   unsigned long cksum = 0;

   while(1   {

    cksum += *buffer++;

    size -= sizeof(USHORT);

   }

   if(0    cksum += *(UCHAR*)buffer;

   cksum = (cksum>>16) + (cksum&0xffff);

   cksum += (cksum>>16);

   return(unsigned shout)(~cksum);

  }

2.7 网间控制报文ICMP)

IP协议的目的比较明确,它只是尽力地、最快地传递数据到目的站点,因此很难诊断错误情况,必须通过另外的协议返回相应的信息。针对网间层的错误诊断、拥塞控制、路径控制和查询服务四大功能,ICMP提供相应的报文。例如:当一个分组无法到达目的站点或TTL超时后,路由器就会废除这个分组,同时向源站点返回一个目的站点不可达的ICMP报文;另外,当网络拥塞(congestion)时,路由器就会废除过载的分组,同时向源站点返回一个源站点抑制的报文。RFC 792中定义了ICMP协议。

  如图2.15所示,ICMP报文是封装在IP数据报的数据区中发送的,因此并不能保证它的可靠性。为了避免重复报告所引起的“雪崩”现象,ICMP报文不再引发ICMP报文。

         ┌──────┬───────┐

         │ICMP头标│ICMP数据区│ICMP报文

         └──────┴───────┘

    ┌────┬──────────────┐

    │IP头标│    IP数据区     │IP数据报

    └────┴──────────────┘

            图2.15 ICMP报文的封装

 

2.7.1 ICMP报文格式

ICMP报文分成头标和数据区两部分,其中头标包含类型、代码和校验和三个域。ICMP报文格式如图2.16所示。

 

  0     1     2     3

  01234567890123456789012345678901

  ┌───┬───┬───────┐

  │ 类型│代码 │校验和    │

  ├───┴───┴───────┤

  │     数据        │

  ├───────────────┤

  │    ···       │

  └───────────────┘

     图2.16 ICMP报文格式

计算校验和的算法与IP报头校验和的算法相同,也是16位二进制反码和的反码。但要注意的是,它是整个ICMP数据报的校验和而不仅仅是头标的校验和;类型域是一个单字节整数,它指出报文的类型;代码域也是一个单字节整数,它提供关于报文类型更进一步的信息。表2-3定义了15个ICMP报文类型。

 

 0││12│

 3││12│

 4││12│

 5││12│

 8││12│

 9││12│

10││12│

11││12│