TCP/IP详解--第三章


3IP:网际协议


3.1    引言

 

IP是TCP/IP协议族中最为核心的协议。所有的 TCP、UDP、ICMP及IGMP数据都以 IP数据 报格式传输(见图 1-4)。许多刚开始接触 TCP/IP的人对 IP提供不可靠、无连接的数据报传送 服务感到很奇怪,特别是那些具有 X.25或SNA背景知识的人。

不可靠( unreliable)的意思是它不能保证 IP数据报能成功地到达目的地。 IP仅提供最好 的传输服务。如果发生某种错误时,如某个路由器暂时用完了缓冲区, IP有一个简单的错误 处理算法:丢弃该数据报,然后发送 ICMP消息报给信源端。任何要求的可靠性必须由上层来 提供(如 TCP)。

无连接( connectionless)这个术语的意思是 IP并不维护任何关于后续数据报的状态信息。 每个数据报的处理是相互独立的。这也说明,  IP数据报可以不按发送顺序接收。如果一信源 向相同的信宿发送两个连续的数据报(先是 A,然后是 B),每个数据报都是独立地进行路由 选择,可能选择不同的路线,因此 B可能在 A到达之前先到达。

在本章,我们将简要介绍 IP 首部中的各个字段,讨论 IP路由选择和子网的有关内容。还 要介绍两个有用的命令: ifconfig和netstat。关于 IP首部中一些字段的细节,将留在以 后使用这些字段的时候再进行讨论。 RFC 791[Postel 1981a]是IP的正式规范文件。

3.2   IP首部

 

IP数据报的格式如图 3-1所示。普通的 IP首部长为 20个字节,除非含有选项字段。

 


4位     4位首部 版本         长度

16位标识


8位服务类型 (TOS)


16位总长度(字节数)

 

3位                 13位片偏移 标志


8位生存时间


8位协议


16位首部检验和


20字节


 

32位源IP地址

 

32位目的IP地址

 

选项(如果有)

 

 

数     据

 

 

 

3-1   IP数据报格式及首部中的各字段


分析图 3-1中的首部。最高位在左边,记为 0 bit ;最低位在右边,记为 31 bit。

4个字节的 32 bit 值以下面的次序传输:首先是 0~7 bit ,其次8~15 bit ,然后16~23 bit, 最后是 24~31 bit 。这种传输次序称作bigendian字节序。由于 TCP/IP首部中所有的二进制整数 在网络中传输时都要求以这种次序,因此它又称作网络字节序。以其他形式存储二进制整数 的机器,如 little endian格式,则必须在传输数据之前把首部转换成网络字节序。

目前的协议版本号是 4,因此 IP有时也称作 IPv4。3.10节将对一种新版的 IP协议进行讨论。 首部长度指的是首部占 32 bit 字的数目,包括任何选项。由于它是一个 4比特字段,因此 首部最长为 60个字节。在第 8章中,我们将看到这种限制使某些选项如路由记录选项在当今已

没有什么用处。普通 IP数据报(没有任何选择项)字段的值是 5。 服务类型(TOS)字段包括一个 3 bit 的优先权子字段(现在已被忽略),4 bit 的TOS子字

段和1bit 未用位但必须置 0。4 bit 的TOS分别代表:最小时延、最大吞吐量、最高可靠性和最小费用。 4 bit中只能置其中1 bit 。如果所有 4 bit 均为0,那么就意味着是一般服务。RFC1340 [Reynolds and Postel 1992] 描述了所有的标准应用如何设置这些服务类型。   RFC 1349 [Almquist1992] 对该RFC进行了修正,更为详细地描述了TOS的特性。

图3-2列出了对不同应用建议的 TOS值。在最后一列中给出的是十六进制值,因为这就是 在后面将要看到的 tcpdump命令输出。

 

制值

 
应  用  程  序 最小时延     最大吞吐量       最高可靠性        最小费用        16进

 

 

控制 数据 任意块数据

 

 

命令阶段 数据阶段

 

UDP查询 TCP查询 区域传输

 

差错 查询 任何IGP

 

 

 

 

3-2   服务类型字段推荐值

 

Telnet和Rlogin这两个交互应用要求最小的传输时延,因为人们主要用它们来传输少量的 交互数据。另一方面, FTP文件传输则要求有最大的吞吐量。最高可靠性被指明给网络管理

(SNMP)和路由选择协议。用户网络新闻( Usenet news, NNTP )是唯一要求最小费用的应 用。

现在大多数的 TCP/IP实现都不支持 TOS特性,但是自 4.3BSD Reno以后的新版系统都对它 进行了设置。另外,新的路由协议如 OSPF和IS-IS都能根据这些字段的值进行路由决策。

在2.10节中,我们提到 SLIP一般提供基于服务类型的排队方法,允许对交互通信


 

数据在处理大块数据之前进行处理。由于大多数的实现都不使用 TOS字段,因此这种 排队机制由 SLIP自己来判断和处理,驱动程序先查看协议字段(确定是否是一个 TCP 段),然后检查TCP信源和信宿的端口号,以判断是否是一个交互服务。一个驱动程序 的注释这样认为,这种“令人厌恶的处理方法”是必需的,因为大多数实现都不允许 应用程序设置TOS字段。

总长度字段是指整个 IP数据报的长度,以字节为单位。利用首部长度字段和总长度字段, 就可以知道 IP数据报中数据内容的起始位置和长度。由于该字段长  16比特,所以 IP数据报最 长可达 6 5 5 3 5 字节(回忆图 2 - 5 ,超级通道的 M T U为 6 5 5 3 5 。它的意思其实不是一个真正的 MTU—它使用了最长的 IP 数据报)。当数据报被分片时,该字段的值也随着变化,这一点将在11.5节中进一步描述。

尽管可以传送一个长达 65535字节的 IP数据报,但是大多数的链路层都会对它进行分片。 而且,主机也要求不能接收超过 576字节的数据报。由于 TCP把用户数据分成若干片,因此一 般来说这个限制不会影响 TCP。在后面的章节中将遇到大量使用 UDP 的应用( RIP,TFTP, BOOTP,DNS,以及 SNMP),它们都限制用户数据报长度为 512字节,小于 576字节。但是, 事实上现在大多数的实现(特别是那些支持网络文件系统  NFS的实现)允许超过 8192字节的 IP数据报。

总长度字段是 IP首部中必要的内容,因为一些数据链路(如以太网)需要填充一些数据 以达到最小长度。尽管以太网的最小帧长为 46字节(见图 2-1),但是 IP数据可能会更短。如 果没有总长度字段,那么 IP层就不知道 46字节中有多少是 IP数据报的内容。

标识字段唯一地标识主机发送的每一份数据报。通常每发送一份报文它的值就会加  1。在

11.5节介绍分片和重组时再详细讨论它。同样,在讨论分片时再来分析标志字段和片偏移字 段。

RFC 791[Postel 1981a]认为标识字段应该由让IP发送数据报的上层来选择。假设有两个连续的IP数据报,其中一个是由TCP生成的,而另一个是由UDP生成的,那么它们 可能具有相同的标识字段。尽管这也可以照常工作(由重组算法来处理),但是在大多 数从伯克利派生出来的系统中,每发送一个IP数据报,IP层都要把一个内核变量的值加

1,不管交给IP的数据来自哪一层。内核变量的初始值根据系统引导时的时间来设置。

TTL(time-to-live)生存时间字段设置了数据报可以经过的最多路由器数。它指定了数据 报的生存时间。TTL的初始值由源主机设置(通常为 32或64),一旦经过一个处理它的路由器, 它的值就减去 1。当该字段的值为 0时,数据报就被丢弃,并发送 ICMP报文通知源主机。第 8 章我们讨论 Traceroute程序时将再回来讨论该字段。

我们已经在第 1章讨论了协议字段,并在图 1-8中示出了它如何被 IP用来对数据报进行分 用。根据它可以识别是哪个协议向 IP传送数据。

首部检验和字段是根据 IP首部计算的检验和码。它不对首部后面的数据进行计算。 ICMP、

IGMP、UDP和TCP在它们各自的首部中均含有同时覆盖首部和数据检验和码。 为了计算一份数据报的 IP检验和,首先把检验和字段置为 0。然后,对首部中每个 16 bit

进行二进制反码求和(整个首部看成是由一串 16 bit 的字组成),结果存在检验和字段中。当 收到一份 IP数据报后,同样对首部中每个 16 bit 进行二进制反码的求和。由于接收方在计算过


 

程中包含了发送方存在首部中的检验和,因此,如果首部在传输过程中没有发生任何差错, 那么接收方计算的结果应该为全 1。如果结果不是全 1(即检验和错误),那么 IP就丢弃收到的 数据报。但是不生成差错报文,由上层去发现丢失的数据报并进行重传。

ICMP、IGMP、UDP和TCP都采用相同的检验和算法,尽管 TCP和UDP除了本身的首部和 数据外,在 IP首部中还包含不同的字段。在 RFC 1071[Braden, Borman and Patridge 1988]中有 关于如何计算 Internet检验和的实现技术。由于路由器经常只修改 TTL字段(减 1),因此当路 由器转发一份报文时可以增加它的检验和,而不需要对     I P 整个首部进行重新计算。  RF C

1141[Mallory and Kullberg 1990]为此给出了一个很有效的方法。

但是,标准的BSD实现在转发数据报时并不是采用这种增加的办法。

每一份 IP数据报都包含源 IP地址和目的 IP 地址。我们在 1.4节中说过,它们都是 32 bit 的

值。

最后一个字段是任选项,是数据报中的一个可变长的可选信息。目前,这些任选项定义 如下:

•  安全和处理限制(用于军事领域,详细内容参见 RFC 1108[Kent 1991])

•  记录路径(让每个路由器都记下它的 IP地址,见 7.3节)

•  时间戳(让每个路由器都记下它的 IP地址和时间,见 7.4节)

•  宽松的源站选路(为数据报指定一系列必须经过的 IP地址,见 8.5节)

•  严格的源站选路(与宽松的源站选路类似,但是要求只能经过指定的这些地址,不能经过其他的地址)。

这些选项很少被使用,并非所有的主机和路由器都支持这些选项。

选项字段一直都是以 32 bit 作为界限,在必要的时候插入值为 0的填充字节。这样就保证

IP首部始终是 32 bit 的整数倍(这是首部长度字段所要求的)。

3.3  IP路由选择

 

从概念上说, IP路由选择是简单的,特别对于主机来说。如果目的主机与源主机直接相 连(如点对点链路)或都在一个共享网络上(以太网或令牌环网),那么 IP数据报就直接送到 目的主机上。否则,主机把数据报发往一默认的路由器上,由路由器来转发该数据报。大多 数的主机都是采用这种简单机制。

在本节和第 9章中,我们将讨论更一般的情况,即 IP层既可以配置成路由器的功能,也可 以配置成主机的功能。当今的大多数多用户系统,包括几乎所有的 Unix系统,都可以配置成 一个路由器。我们可以为它指定主机和路由器都可以使用的简单路由算法。本质上的区别在 于主机从不把数据报从一个接口转发到另一个接口,而路由器则要转发数据报。内含路由器功能的主机应该从不转发数据报,除非它被设置成那样。在 9.4小节中,我们将进一步讨论配 置的有关问题。

在一般的体制中, IP可以从 TCP、UDP、ICMP和IGMP接收数据报(即在本地生成的数据

报)并进行发送,或者从一个网络接口接收数据报(待转发的数据报)并进行发送。  IP 层在 内存中有一个路由表。当收到一份数据报并进行发送时,它都要对该表搜索一次。当数据报来自某个网络接口时, IP首先检查目的 IP地址是否为本机的 IP地址之一或者 IP广播地址。如果 确实是这样,数据报就被送到由 IP首部协议字段所指定的协议模块进行处理。如果数据报的


目的不是这些地址,那么( 1)如果 IP层被设置为路由器的功能,那么就对数据报进行转发

(也就是说,像下面对待发出的数据报一样处理);否则( 2)数据报被丢弃。 路由表中的每一项都包含下面这些信息:

• 目的IP地址。它既可以是一个完整的主机地址,也可以是一个网络地址,由该表目中的标

志字段来指定(如下所述)。主机地址有一个非0的主机号(见图1-5),以指定某一特定的主机,而网络地址中的主机号为0,以指定网络中的所有主机(如以太网,令牌环网)。

•  下一站(或下一跳)路由器( next-hop router )的 IP地址,或者有直接连接的网络 IP地

址。下一站路由器是指一个在直接相连网络上的路由器,通过它可以转发数据报。下 一站路由器不是最终的目的,但是它可以把传送给它的数据报转发到最终目的。

• 标志。其中一个标志指明目的 IP地址是网络地址还是主机地址,另一个标志指明下一 站路由器是否为真正的下一站路由器,还是一个直接相连的接口(我们将在                                              9 . 2节中 详细介绍这些标志)。

•  为数据报的传输指定一个网络接口。

IP路由选择是逐跳地( hop-by-hop)进行的。从这个路由表信息可以看出, IP并不知道到 达任何目的的完整路径(当然,除了那些与主机直接相连的目的)。所有的IP路由选择只为数 据报传输提供下一站路由器的 IP地址。它假定下一站路由器比发送数据报的主机更接近目的, 而且下一站路由器与该主机是直接相连的。

IP路由选择主要完成以下这些功能:

1) 搜索路由表,寻找能与目的 IP地址完全匹配的表目(网络号和主机号都要匹配)。如果 找到,则把报文发送给该表目指定的下一站路由器或直接连接的网络接口(取决于标 志字段的值)。

2) 搜索路由表,寻找能与目的网络号相匹配的表目。如果找到,则把报文发送给该表目

指定的下一站路由器或直接连接的网络接口(取决于标志字段的值)。目的网络上的所 有主机都可以通过这个表目来处置。例如,一个以太网上的所有主机都是通过这种表 目进行寻径的。 这种搜索网络的匹配方法必须考虑可能的子网掩码。关于这一点我们在下一节中进行 讨论。

3) 搜索路由表,寻找标为“默认( default)”的表目。如果找到,则把报文发送给该表目 指定的下一站路由器。

如果上面这些步骤都没有成功,那么该数据报就不能被传送。如果不能传送的数据报来自 本机,那么一般会向生成数据报的应用程序返回一个“主机不可达”或“网络不可达”的错误。完整主机地址匹配在网络号匹配之前执行。只有当它们都失败后才选择默认路由。默认

路由,以及下一站路由器发送的 ICMP间接报文(如果我们为数据报选择了错误的默认路由), 是IP路由选择机制中功能强大的特性。我们在第 9章对它们进行讨论。

为一个网络指定一个路由器,而不必为每个主机指定一个路由器,这是  IP 路由选择机制 的另一个基本特性。这样做可以极大地缩小路由表的规模,比如 Internet上的路由器有只有几 千个表目,而不会是超过 100万个表目。

举例

 

首先考虑一个简单的例子:我们的主机 bsdi有一个 IP数据报要发送给主机 sun。双方都在


 

同一个以太网上(参见扉页前图)。数据报的传输过程如图 3-3所示。 当IP从某个上层收到这份数据报后,它搜索路由表,发现目的 IP地址( 140.252.13.33)在

一个直接相连的网络上(以太网 140.252.13.0)。于是,在表中找到匹配网络地址(在下一节 中,我们将看到,由于以太网的子网掩码的存在,实际的网络地址是 140.252.13.32,但是这 并不影响这里所讨论的路由选择)。


数据报被送到以太网驱动程序,然后 作为一个以太网数据帧被送到 sun主机上

(见图 2 - 1 )。 I P 数据报中的目的地址是

sun的IP 地址( 140.252.13.33),而在链


目的网络=

140.252,13,0


 

 

以太网140.252.13

 

链路层 IP首


路层首部中的目的地址是 48 bit 的sun主 机的以太网接口地址。这个 48 bit 的以太 网地址是用 A R P 协议获得的,我们将在 下一章对此进行描述。


首部      部

 

目的 目的

 

3-3   数据报从主机bsdisun的传送过程


现在来看另一个例子:主机 bsdi有一份 IP数据报要传到 ftp.uu.net主机上,它的 IP地 址是192.48.96.9。经过的前三个路由器如图 3-4所示。首先,主机 bsdi搜索路由表,但是没有 找到与主机地址或网络地址相匹配的表目,因此只能用默认的表目,把数据报传给下一站路 由器,即主机 sun。当数据报从 bsdi被传到 sun主机上以后,目的 IP地址是最终的信宿机地 址(192.48.96.9),但是链路层地址却是 sun主机的以太网接口地址。这与图 3-3不同,在那里 数据报中的目的 IP地址和目的链路层地址都指的是相同的主机( sun)。

 

目的以太网=以太网的140.252.1.4

目的IP=192.48.96.9


下一站=

140.252.104.2(默认)


链路层   IP

首部   首部


 


以太网,140.252.1


下一站=

140.252.1.4(默认)


 

调制解 调器

 

IP

首部


 

调制解 调器


目的IP=192.48.96.9


 


下一站=

140.252.13.33(默认)


下一站=

140.252.1.183(默认)


 

以太网,140.252.13

链路层   IP

首部  首部

目的IP=192.48.96.9

目的以太网=以太网的140.252.13.33

 

3-4   bsdi ftp.uu.net (192.48.96.9)的初始路径


 

当sun收到数据报后,它发现数据报的目的 IP地址并不是本机的任一地址,而 sun已被设 置成具有路由器的功能,因此它把数据报进行转发。经过搜索路由表,选用了默认表目。根 据sun的默认表目,它把数据报转发到下一站路由器 netb,该路由器的地址是 140.252.1.183。 数据报是经过点对点SLIP链路被传送的,采用了图 2-2所示的最小封装格式。这里,我们没有 给出像以太网链路层数据帧那样的首部,因为在 SLIP链路中没有那样的首部。

当netb收到数据报后,它执行与 sun主机相同的步骤:数据报的目的地址不是本机地址, 而netb也被设置成具有路由器的功能,于是它也对该数据报进行转发。采用的也是默认路由 表目,把数据报送到下一站路由器 gateway(140.252.1.4)。位于以太网 140.252.1上的主机 netb用ARP获得对应于 140.252.1.4的48 bit 以太网地址。这个以太网地址就是链路层数据帧头 上的目的地址。

路由器 gateway也执行与前面两个路由器相同的步骤。它的默认路由表目所指定的下一站路由器 I P地址是 1 4 0 . 2 5 2 . 1 0 4 . 2 (我们将在图 8 - 4中证实,使用 Tr a c e r o u t e 程序时,它就是 gateway使用的下一站路由器)。

对于这个例子需要指出一些关键点:

1) 该例子中的所有主机和路由器都使用了默认路由。事实上,大多数主机和一些路由器 可以用默认路由来处理任何目的,除非它在本地局域网上。

2) 数据报中的目的 IP地址始终不发生任何变化(在 8.5节中,我们将看到,只有使用源路 由选项时,目的 IP地址才有可能被修改,但这种情况很少出现)。所有的路由选择决策都是基 于这个目的 IP地址。

3) 每个链路层可能具有不同的数据帧首部,而且链路层的目的地址(如果有的话)始终 指的是下一站的链路层地址。在例子中,两个以太网封装了含有下一站以太网地址的链路层首部,但是 SLIP链路没有这样做。以太网地址一般通过 ARP获得。

在第 9章,我们在描述了 ICMP之后将再次讨论 IP 路由选择问题。我们将看到一些路由表 的例子,以及如何用它们来进行路由决策的。

3.4   子网寻址

 

现在所有的主机都要求支持子网编址( RFC 950 [Mogul and Postel 1985])。不是把 IP地址 看成由单纯的一个网络号和一个主机号组成,而是把主机号再分成一个子网号和一个主机号。

这样做的原因是因为 A类和 B类地址为主机号分配了太多的空间,可分别容纳的主机数为

224-2和216-2。事实上,在一个网络中人们并不安排这么多的主机(各类 IP地址的格式如图 1-5

所示)。由于全 0或全1的主机号都是无效的,因此我们把总数减去 2。 在InterNIC获得某类 IP网络号后,就由当地的系统管理员来进行分配,由他(或她)来决

定是否建立子网,以及分配多少比特给子网号和主机号。例如,这里有一个        B 类网络地址

(140.252),在剩下的 16 bit 中, 8 bit 用于子网号, 8 bit 用于主机号,格式如图 3-5所示。这样 就允许有 254个子网,每个子网可以有 254台主机。

 

16位                                           8位                            8位


B类                         网络号=140.252


子网号


主机号


 

 

3-5   B类地址的一种子网编址


 

许多管理员采用自然的划分方法,即把 B类地址中留给主机的 16 bit 中的前 8 bit 作为子网 地址,后 8bit作为主机号。这样用点分十进制方法表示的 IP地址就可以比较容易确定子网号。 但是,并不要求 A类或B类地址的子网划分都要以字节为划分界限。

大多数的子网例子都是 B类地址。其实,子网还可用于 C类地址,只是它可用的比特数较 少而已。很少出现 A类地址的子网例子是因为 A类地址本身就很少(但是,大多数 A 类地址都 是进行子网划分的)。

子网对外部路由器来说隐藏了内部网络组织(一个校园或公司内部)的细节。在我们的 网络例子中,所有的 IP地址都有一个 B类网络号 140.252。但是其中有超过 30个子网,多于 400 台主机分布在这些子网中。由一台路由器提供了 Internet的接入,如图 3-6所示。

在这个图中,我们把大多数的路由器编号为 Rnn是子网号。我们给出了连接这些子网的 路由器,同时还包括了扉页前图中的九个系统。在图中,以太网用粗线表示,点对点链路用虚线表示。我们没有画出不同子网中的所有主机。例如,在子网  140.252.3上,就超过50台主 机,而在子网 140.252.1上则超过 100台主机。

与30个C类地址相比,用一个包含30个子网的 B类地址的好处是,它可以缩小Internet路由 表的规模。 B 类地址140.252被划分为若干子网的事实对于所有子网以外的Internet路由器都是 透明的。为了到达IP 地址开始部分为14 0 . 2 5 2 的主机,外部路由器只需要知道通往  I P 地址

140.252.104.1的路径。这就是说,对于网络 140.252只需一个路由表目,而如果采用30个C类 地址,则需要 30个路由表目。因此,子网划分缩减了路由表的规模(在  10.8小节中,我们将 介绍一种新技术,即使用C类地址也可以缩减路由表的规模)。

子网对于子网内部的路由器是不透明的。如图  3-6所示,一份来自Internet的数据报到达 gateway,它的目的地址是 140.252.57.1。路由器 gateway需要知道子网号是 57,然后把它 送到kpno。同样, kpno必须把数据报送到 R55,最后由 R55把它送到 R57。

 

3-6   网络noao.edu140.252)中的大多数子网安排


3.5   子网掩码

 

任何主机在引导时进行的部分配置是指定主机  IP地址。大多数系统把IP地址存在一个磁 盘文件里供引导时读用。在第5章我们将讨论一个无盘系统如何在引导时获得IP地址。

除了 IP地址以外,主机还需要知道有多少比特用于子网号及多少比特用于主机号。这是 在引导过程中通过子网掩码来确定的。这个掩码是一个  32 bit 的值,其中值为1的比特留给网 络号和子网号,为0的比特留给主机号。图3-7是一个B类地址的两种不同的子网掩码格式。第一个例子是 noao.edu网络采用的子网划分方法,如图 3-5所示,子网号和主机号都是 8 bit宽。 第二个例子是一个 B类地址划分成10 bit的子网号和 6 bit 的主机号。

16位                                          8位                           8位


B类

子网掩码


网络号


子网号


主机号


 


16位


10位                         8位


B类 子网掩码


网络号                                          子网号                      主机号


 

3-7   两种不同的B类地址子网掩码的例子

 

尽管IP地址一般以点分十进制方法表示,但是子网掩码却经常用十六进制来表示,特别是当界限不是一个字节时,因为子网掩码是一个比特掩码。

给定IP地址和子网掩码以后,主机就可以确定IP数据报的目的是:( 1)本子网上的主机; (2)本网络中其他子网中的主机;( 3)其他网络上的主机。如果知道本机的 IP地址,那么就知道 它是否为 A类、B类或C类地址(从 IP地址的高位可以得知),也就知道网络号和子网号之间的分 界线。而根据子网掩码就可知道子网号与主机号之间的分界线。

举例

 

假设我们的主机地址是140.252.1.1(一个B类地址),而子网掩码为255.255.255.0(其中8 bit为子网号, 8 bit 为主机号)。

• 如果目的 IP地址是 140.252.4.5 ,那么我们就知道B类网络号是相同的(140.252),但是 子网号是不同的( 1和4)。用子网掩码在两个IP地址之间的比较如图3-8所示。

• 如果目的 IP地址是 140.252.1.22,那么 B类网络号还是一样的( 140.252),而且子网号也 是一样的( 1),但是主机号是不同的。

• 如果目的 IP地址是 192.43.235.6(一个C类地址),那么网络号是不同的,因而进一步的比较就不用再进行了。

B类网络号末尾    指明的子网号末尾


 

 

B类 子网掩码


16位                  8位                      8位


网络号相符                     子网号不相等

 

B类

 

3-8   使用子网掩码的两个B类地址之间的比较


给定两个 IP地址和子网掩码后,IP路由选择功能一直进行这样的比较。

3.6   特殊情况的IP地址

 

经过子网划分的描述,现在介绍 7个特殊的 IP地址,如图3-9所示。在这个图中,0表示所 有的比特位全为 0;-1表示所有的比特位全为1;netid、subnetid和hostid分别表示不为全0或全

1的对应字段。子网号栏为空表示该地址没有进行子网划分。

 

IP   地   址

可   以   为

描      述

网络号

子网号

主机号

源  端

目的端

0

0

 

0

主机号

OK

OK

不可能

不可能

网络上的主机(参见下面的限制)

网络上的特定主机(参见下面的限制)

127

 

任何值

OK

OK

环回地址( 2.7节)

-1

netid netid netid

 

 

 

subnetid

-1

-1

-1

-1

-1

不可能

不可能 不可能 不可能

OK OK OK OK

受限的广播(永远不被转发)

以网络为目的向 netid广播 以子网为目的向netid、subnetid广播 以所有子网为目的向 netid广播

 

3-9   特殊情况的IP地址

 

我们把这个表分成三个部分。表的头两项是特殊的源地址,中间项是特殊的环回地址, 最后四项是广播地址。

表中的头两项,网络号为 0,如主机使用 BOOTP协议确定本机 IP地址时只能作为初始化过 程中的源地址出现。

在12.2节中,我们将进一步分析四类广播地址。

3.7   一个子网的例子

 

这个例子是本文中采用的子网,以及如何使用两个不同的子网掩码。具体安排如图  3-10

所示。

 

 

 

 

 

 

 

以太网,子网140.252.1

 

SLIP子网

 

 

 

以太网,子网140.252.13.32

作者所在子网140.252.13

 

3-10   作者所在子网中的主机和网络安排

 

如果把该图与扉页前图相比,就会发现在图3-10中省略了从路由器sun到上面的以太网之 间的连接细节,实际上它们之间的连接是拨号SLIP。这个细节不影响本节中讨论的子网划分


问题。我们在4.6节讨论ARP代理时将再回头讨论这个细节。

问题是我们在子网 13中有两个分离的网络:一个以太网和一个点对点链路(硬件连接的 SLIP链路)(点对点链接始终会带来问题,因为它一般在两端都需要  IP地址)。将来或许会有 更多的主机和网络,但是为了不让主机跨越不同的网络就得使用不同的子网号。我们的解决方法是把子网号从 8 bit 扩充到 11bit ,把主机号从 8 bit 减为5bit 。这就叫作变长子网,因为

140.252网络中的大多数子网都采用 8 bit 子网掩码,而我们的子网却采用 11 bit 的子网掩码。

RFC 1009[Braden and Postel 1987]允许一个含有子网的网络使用多个子网掩码。新 的路由器需求RFC[Almquist 1993]则要求支持这一功能。

但是,问题在于并不是所有的路由选择协议在交换目的网络时也交换子网掩码。 在第10章中,我们将看到RIP不支持变长子网,RIP第2版和OSPF则支持变长子网。在 我们的例子中不存在这种问题,因为在我的子网中不要求使用RIP协议。

作者子网中的IP地址结构如图3-11所示,11位子网号中的前8 bit 始终是13。在剩下的 3 bit 中,我们用二进制001表示以太网,010表示点对点 SLIP链路。这个变长子网掩码在140.252网 络中不会给其他主机和路由器带来问题— 只要目的是子网 140.252.13的所有数据报都传给路 由器 sun(IP地址是 140.252.1.29),如图3-11所示。如果sun知道子网 13中的主机有11 bit 子 网号,那么一切都好办了。


16位

B类                              网络号=140.252


11位子网号ID


5位 主机号ID


 


 

子网掩码


8位=13


 

 

3-11  变长子网

 

140.252.13子网中的所有接口的子网掩码是 255.255.255.224,或 0xffffffe0。这表明最右边 的5bit 留给主机号,左边的27 bit留给网络号和子网号。

图3-10中所有接口的 IP地址和子网掩码的分配情况如图 3-12所示。

 

主机        IP地址           子网掩码     网络号   子网号     主机号            注          释

在子网1上 在作者所在子网上

 

在以太网上 点对点 点对点

以太网上的广播地址

 

3-12   作者子网的IP地址

 

第1栏标为是“主机”,但是 sun和bsdi也具有路由器的功能,因为它们是多接口的,可 以把分组数据从一个接口转发到另一个接口。

这个表中的最后一行是图  3 - 1 0 中的广播地址  1 4 0 . 2 5 2 . 1 3 . 6 3 :它是根据以太网子网号

(140.252.13.32)和图 3-11中的低5位置1(16+8+4+2+1=31)得来的(我们在第12章中将 看到,这个地址被称作以子网为目的的广播地址( subnet-directed broadcastaddress))。


 

3.8   ifconfig命令

 

到目前为止,我们已经讨论了链路层和 IP层,现在可以介绍 TCP/IP对网络接口进行配置 和查询的命令了。 ifconfig(8)命令一般在引导时运行,以配置主机上的每个接口。

由于拨号接口可能会经常接通和挂断(如   S L I P 链路 ),每次线路接通和挂断时,

ifconfig都必须(以某种方法)运行。这个过程如何完成取决于使用的SLIP软件。 下面是作者子网接口的有关参数。请把它们与图 3-12的值进行比较。

在所有接口报告的选项

 

 

 

 

 

 

 

环回接口( 2.7节)被认为是一个网络接口。它是一个A类地址,没有进行子网划分。

需要注意的是以太网没有采用尾部封装(2.3节),而且可以进行广播,而SLIP链路是一 个点对点的链接。

SLIP接口的标志 LINK0是一个允许压缩 slip的数据( CSLIP,参见 2.5节)的配置选项。其 他的选项有LINK1(如果从另一端收到一份压缩报文,就允许采用  CSLIP)和LINK2(所有外出的 ICMP报文都被丢弃)。我们在 4.6节中将讨论 SLIP链接的目的地址。

 

安装指南中的注释对最后这个选项进行了解释:“一般它不应设置,但是由于一些 不当的ping操作,可能会导致吞吐量降到0。”

 

bsdi是另一台路由器。由于- a参数是 SunOS操作系统具有的功能,因此我们必须多次执 行ifconfig,并指定接口名字参数:

 

 

 

 

 

 

这里,我们看到以太网接口(we0)的一个新选项:SIMPLEX。这个4.4BSD标志表明接 口不能收到本机传送的数据。在 BSD/386中所有的以太网都这样设置。一旦这样设置后,如果接口发送一帧数据到广播地址,那么就会为本机拷贝一份数据送到环回地址(在 6.3小节我 们将举例说明这一点)。

在主机slip中,SLIP接口的设置基本上与上面的bsdi一致,只是两端的IP地址进行了互换:

 

slip % /sbin/ifconfig sl0

sl0: flags=1011<UP,POINTOPOINT,LINK0>

inet 140.252.13.65 --> 140.252.13.66 netmask ffffffe0

最后一个接口是主机 svr4上的以太网接口。它与前面的以太网接口类似,只是  SVR4版 的ifconfig没有打印 RUNNING标志:

svr4 % /usr/sbin/ifconfig emd0

emd0: flags=23<UP,BROADCAST,NOTRAILERS>

inet 140.252.13.34 netmask ffffffe0 broadcast 140.252.13.63


 

ifconfig命令一般支持TCP/IP以外的其他协议族,而且有很多参数。关于这些细节可以查看系统说明书。

3.9   netstat命令

 

netstat(1)命令也提供系统上的接口信息。 -i参数将打印出接口信息, -n参数则打印出

IP地址,而不是主机名字。

 

 

 

 

 

 

这个命令打印出每个接口的 MTU、输入分组数、输入错误、输出分组数、输出错误、冲 突以及当前的输出队列长度。

在第 9章将用 netstat命令检查路由表,那时再回头讨论该命令。另外,在第  13章将用 它的一个改进版本来查看活动的广播组。

3.10    IP的未来

 

IP主要存在三个方面的问题。这是 Internet在过去几年快速增长所造成的结果(参见习题

1.2)。

1) 超过半数的 B类地址已被分配。根据估计,它们大约在 1995年耗尽。

2) 32 bit的IP地址从长期的 Internet增长角度来看,一般是不够用的。

3) 当前的路由结构没有层次结构,属于平面型(flat)结构,每个网络都需要一个路由表目。随着网络数目的增长,一个具有多个网络的网站就必须分配多个  C类地址,而不是一个B类地 址,因此路由表的规模会不断增长。

无类别的域间路由选择CIDR(Classless InterdomainRouting )提出了一个可以解决第三 个问题的建议,对当前版本的 IP(IP版本4)进行扩充,以适应 21世纪Internet的发展。对此我 们将在10.8节进一步详细介绍。

对新版的 IP ,即下一代 IP,经常称作 IPng ,主要有四个方面的建议。 1993年 5月发行的

IEEE Network  (vol.7, no.3) 对前三个建议进行了综述,同时有一篇关于  CIDR的论文。 RFC

1454 [Dixon 1993]对前三个建议进行了比较。

1) SIP,简单 Internet协议。它针对当前的IP提出了一个最小幅度的修改建议,采用64位地 址和一个不同的首部格式(首部的前 4比特仍然包含协议的版本号,其值不再是4)。

2) PIP。这个建议也采用了更大的、可变长度的和有层次结构的地址,而且首部格式也不相同。

3)  TUBA , 代 表“ TCP  and UDP  with Bigger  Address ”, 它基 于 OSI  的 C L N P

(ConnectionlessNetwork Protocol,无连接网络协议),一个与 IP类似的 OSI协议。它提供大得 多的地址空间:可变长度,可达 20个字节。由于 CLNP是一个现有的协议,而 SIP和PIP只是建议,因此关于 CLNP的文档已经出现。RFC 1347[Callon1992] 提供了 TUBA的有关细节。文献 [Perlman1992] 的第 7章对IPv4和CLNP进行了比较。许多路由器已经支持CLNP,但是很少有 主机也提供支持。


 

4)TP/IX,由RFC 1475 [Ullmann 1993]对它进行了描述。虽然 SIP采用了 64 bit的址址,但 是它还改变了 TCP和UDP的格式:两个协议均为32 bit的端口号,64 bit 的序列号,64 bit 的确 认号,以及 TCP的32 bit窗口。

前三个建议基本上采用了相同版本的 TCP和UDP作为传输层协议。 由于四个建议只能有一个被选为 IPv4的替换者,而且在你读到此书时可能已经做出选择,

因此我们对它们不进行过多评论。虽然 CIDR即将实现以解决目前的短期问题,但是 IPv4后继者的实现则需要经过许多年。

3.11  小结

 

本章开始描述了IP首部的格式,并简要讨论了首部中的各个字段。我们还介绍了  IP路由 选择,并指出主机的路由选择可以非常简单:如果目的主机在直接相连的网络上,那么就把数据报直接传给目的主机,否则传给默认路由器。

在进行路由选择决策时,主机和路由器都使用路由表。在表中有三种类型的路由:特定主机型、特定网络型和默认路由型。路由表中的表目具有一定的优先级。在选择路由时,主 机路由优先于网络路由,最后在没有其他可选路由存在时才选择默认路由。

IP路由选择是通过逐跳来实现的。数据报在各站的传输过程中目的 IP地址始终不变,但 是封装和目的链路层地址在每一站都可以改变。大多数的主机和许多路由器对于非本地网络的数据报都使用默认的下一站路由器。

A类和B类地址一般都要进行子网划分。用于子网号的比特数通过子网掩码来指定。我们为此举了一个实例来详细说明,即作者所在的子网,并介绍了变长子网的概念。子网的划分缩小了Internet路由表的规模,因为许多网络经常可以通过单个表目就可以访问了。接口和网络的有关信息通过ifconfig和netstat命令可以获得,包括接口的 IP地址、子网掩码、广 播地址以及 MTU等。

在本章的最后,我们对 Internet协议族潜在的改进建议—下一代 IP进行了讨论。

习题

 

3.1  环回地址必须是127.0.0.1吗?

3.2   在图3-6中指出有两个网络接口的路由器。

3.3   子网号为 16 bit 的A类地址与子网号为 8 bit 的B类地址的子网掩码有什么不同?

3.4   阅读RFC 1219 [Tsuchiya 1991],学习分配子网号和主机号的有关推荐技术。

3.5   子网掩码 255.255.0.255是否对 A类地址有效?

3.6   你认为为什么 3.9小节中打印出来的环回接口的 MTU要设置为 1536?

3.7   TCP/IP协议族是基于一种数据报的网络技术,即 IP层,其他的协议族则基于面向连接的 网络技术。阅读文献 [Clark 1988],找出数据报网络层提供的三个优点。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
TCP/IP详解·卷2:实现》完整而详细地介绍了TCP/IP协议是如何实现的。书中给出了约500个图例,15000行实际操作的C代码,采用举例教学的方法帮助你掌握TCP/IP实现。《TCP/IP详解·卷2:实现》不仅说明了插口API和协议的关系以及主机实现与路由器实现的差别。还介绍了4.4BSD-Lite版的新的特点。《TCP/IP详解·卷2:实现》适用于希望理解TCP/IP协议如何实现的人,包括编写网络应用程序的程序员以及利用TCP/IP维护计算机网络的系统管理员。 目录 · · · · · · 第一章 概述 1.1 引言 1.2 源代码表示 1.3 历史 1.4 应用编程接口 1.5 程序示例 1.6 系统调用和库函数 1.7 描述符 1.8 网络实现概述 1.9 mbuf与输出处理 1.10 输入处理 1.11 网络实现概述 1.12 中断级别与并发 1.13 源代码组织 1.14 测试网络 1.15 小结 第二章 mduf:存储器缓存 2.1 引言 2.2 代码介绍 2.3 mduf的定义 2.4 mduf结构 2.5 简单的mduf宏和函数 2.6 m_devget和m_pullup函数 2.7 mduf宏和函数的小结 2.8 Net/3联网数据结构小结 2.9 m_copy和簇引用记数 2.10 其他选择 2.11 小结 第三章 接口层 3.1 引言 3.2 代码介绍 3.3 ifnet结构 3.4 ifaddr结构 3.5 sockaddr结构 3.6 ifnet与ifaddr的专用化 3.7 网络初始化概述 3.8 以太网初始化 3.9 SLIP初始化 3.10 环回初始化 3.11 if_attach函数 3.12 ifinit函数 3.13 小结 第四章 接口:以太网 4.1 引言 4.2 代码介绍 4.3 以太网接口 4.4 ioctl系统调用 4.5 小结 第五章 接口:SLIP和环回 5.1 引言 5.2 代码介绍 5.3 SLIP接口 5.4 环回接口 5.5 小结 第六章 IP编址 6.1 引言 6.2 代码介绍 6.3 接口和地址小结 6.4 sockaddr_in结构 6.5 in_ifaddr结构 6.6 地址指派 6.7 接口ioctl处理 6.8 internet实用函数 6.9 ifnet实用函数 6.10 小结 第七章 域和协议 7.1 引言 7.2 代码介绍 7.3 domain结构 7.4 protosw结构 7.5 IP的domain和protosw结构 7.6 pffindproto和pffindtype函数 7.7 pfctlinput函数 7.8 IP初始化 7.9 sysctl系统调用 7.10 小结 第八章 IP:网际协议 8.1 引言 8.2 代码介绍 8.3 IP分组 8.4 输入处理:ipintr函数 8.5 转发:ip_forward函数 8.6 输出处理:ip_output函数 8.7 Internet检验和:in_cksum函数 8.8 setsockopt和getsockopt系统调用 8.9 ip_sysctl函数 8.10 小结 第九章 IP选项处理 9.1 引言 9.2 代码介绍 9.3 选项格式 9.4 ip_dooptions函数 9.5 记录路由选项 9.6 源站和记录路由选项 9.7 时间戳选项 9.8 ip_insertoptions函数 9.9 ip_pcbopts函数 9.10 一些限制 9.11 小结 第十章 IP的分片与重装 10.1 引言 10.2 代码介绍 10.3 分片 10.4 ip_optcopy函数 10.5 重装 10.6 ip_optcopy函数 10.7 ip_slowtimo函数 10.8 小结 第十一章 ICMP:Internet控制报文协议 第十二章 IP多播 第十三章 IGMP:Internet组管理协议 第十四章 IP多播选路 第十五章 插口层 第十六章 插口I/O 第十七章 插口选项 第十八章 Radix树路由表 第十九章 选路请求和选路消息 第二十章 选路接口 第二十一章 ARP:地址解析协议 第二十二章 协议控制块 第二十三章 UDP:用户数据报协议 第二十四章 TCP:传输控制协议 第二十五章 TCP的定时器 第二十六章 TCP输出 第二十七章 TCP的函数 第二十八章 TCP的输入 第二十九章 TCP的输入(续) 第三十章 TCP的用户需求 第三十一章 BPF:BSD分组过滤程序 第三十二章 原始IP 结束语 附录A 部分习题的解答 附录B 源代码的获取 附录C RFC 1122的有关内容 参考文献

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值