TCP/IP详解,卷1:协议--IP:网际协议

引言

I P 是 T C P / I P 协议族中最为核心的协议。全部的 T C P、U D P、I C M P 及 I G M P 数据都以 I P 数据
报格式传输(见图 1 - 4)。许多刚开始接触 T C P / I P 的人对 I P 提供不可靠、无链接的数据报传送
服务感到很奇怪,特别是那些具备 X . 2 5 或 S N A 背景知识的人。算法

不可靠(u n r e l i a b l e)的意思是它不能保证 I P 数据报能成功地到达目的地。 I P 仅提供最好
的传输服务。若是发生某种错误时,如某个路由器暂时用完了缓冲区, I P 有一个简单的错误
处理算法:丢弃该数据报,而后发送 I C M P 消息报给信源端。任何要求的可靠性必须由上层来
提供(如 T C P)。网络

无链接(c o n n e c t i o n l e s s)这个术语的意思是 I P 并不维护任何关于后续数据报的状态信息。
每一个数据报的处理是相互独立的。这也说明, I P 数据报能够不按发送顺序接收。若是一信源
向相同的信宿发送两个连续的数据报(先是 A,而后是 B),每一个数据报都是独立地进行路由
选择,可能选择不一样的路线,所以 B 可能在 A 到达以前先到达less

IP 首部

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

服务类型(TO S)字段包括一个 3 bit 的优先权子字段(如今已被忽略),4 bit 的 TO S 子字
段和 1 bit 未用位但必须置 0。4 bit 的 TO S 分别表明:最小时延、最大吞吐量、最高可靠性和最
小费用。4 bit 中只能置其中 1 bit。若是全部 4 bit 均为 0,那么就意味着是通常服务。RFC 1340
[Reynolds and Postel 1992]描述了全部的标准应用如何设置这些服务类型。 RFC 1349
[Almquist 1992]对该 R F C 进行了修正,更为详细地描述了 TO S 的特性。网站

图 3 - 2 列出了对不一样应用建议的 TO S 值。在最后一列中给出的是十六进制值,由于这就是
在后面将要看到的 t c p d u m p 命令输出。ui

e l n e t 和 R l o g i n 这两个交互应用要求最小的传输时延,由于人们主要用它们来传输少许的
交互数据。另外一方面, F T P 文件传输则要求有最大的吞吐量。最高可靠性被指明给网络管理
(S N M P)和路由选择协议。用户网络新闻( Usenet news, NNTP)是惟一要求最小费用的应
用。
如今大多数的 T C P / I P 实现都不支持 TO S 特性,可是自 4.3BSD Reno 之后的新版系统都对它
进行了设置。另外,新的路由协议如 O S P F 和 I S - I S 都能根据这些字段的值进行路由决策。
咱们提到 S L I P 通常提供基于服务类型的排队方法,容许对交互通讯数据在处理大块数据以前进行处
理。因为大多数的实现都不使用 TO S 字段,所以这种排队机制由 S L I P 本身来判断和处理,驱动程
序先查看协议字段(肯定是不是一个 T C P 段),而后检查 T C P 信源和信宿的端口号,以
判断是不是一个交互服务。一个驱动程序的注释这样认为,这种“使人厌恶的处理方法”是必需的,
由于大多数实现都不容许应用程序设置 TOS 字段。router

总长度字段是指整个 I P 数据报的长度,以字节为单位。利用首部长度字段和总长度字段,
就能够知道 I P 数据报中数据内容的起始位置和长度。因为该字段长 1 6 比特,因此 I P 数据报最
长可达 6 5 5 3 5 字节(回忆图 2 - 5,超级通道的 M T U 为 6 5 5 3 5。它的意思其实不是一个真正的
M T U — 它使用了最长的 I P 数据报)。当数据报被分片时,该字段的值也随着变化blog

选项字段一直都是以 32 bit 做为界限,在必要的时候插入值为 0 的填充字节。这样就保证
I P 首部始终是 32 bit 的整数倍(这是首部长度字段所要求的)。接口

IP 路由选择

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

在通常的体制中,I P 能够从 T C P、U D P、I C M P 和 I G M P 接收数据报(即在本地生成的数据
报)并进行发送,或者从一个网络接口接收数据报(待转发的数据报)并进行发送。 I P 层在
内存中有一个路由表。当收到一份数据报并进行发送时,它都要对该表搜索一次。当数据报
来自某个网络接口时,I P 首先检查目的 I P 地址是否为本机的 I P 地址之一或者 I P 广播地址。若是
确实是这样,数据报就被送到由 I P 首部协议字段所指定的协议模块进行处理。若是数据报的
目的不是这些地址,那么( 1)若是 I P 层被设置为路由器的功能,那么就对数据报进行转发
(也就是说,像下面对待发出的数据报同样处理);不然( 2)数据报被丢弃。

路由表中的每一项都包含下面这些信息:
• 目的 I P 地址。它既能够是一个完整的主机地址,也能够是一个网络地址,由该表目中的标
志字段来指定(以下所述)。主机地址有一个非 0 的主机号(见图 1 - 5),以指定某一特定的
主机,而网络地址中的主机号为 0,以指定网络中的全部主机(如以太网,令牌环网)。
• 下一站(或下一跳)路由器( next-hop router)的 I P 地址,或者有直接链接的网络 I P 地
址。下一站路由器是指一个在直接相连网络上的路由器,经过它能够转发数据报。下
一站路由器不是最终的目的,可是它能够把传送给它的数据报转发到最终目的。
• 标志。其中一个标志指明目的 I P 地址是网络地址仍是主机地址,另外一个标志指明下一
站路由器是否为真正的下一站路由器,仍是一个直接相连的接口(咱们将在 9 . 2 节中
详细介绍这些标志)。
• 为数据报的传输指定一个网络接口。

I P 路由选择是逐跳地(h o p - b y - h o p)进行的。从这个路由表信息能够看出, I P 并不知道到
达任何目的的完整路径(固然,除了那些与主机直接相连的目的)。全部的 I P 路由选择只为数
据报传输提供下一站路由器的 I P 地址。它假定下一站路由器比发送数据报的主机更接近目的,
并且下一站路由器与该主机是直接相连的。

完整主机地址匹配在网络号匹配以前执行。只有当它们都失败后才选择默认路由。默认
路由,以及下一站路由器发送的 I C M P 间接报文(若是咱们为数据报选择了错误的默认路由),
是 I P 路由选择机制中功能强大的特性。

为一个网络指定一个路由器,而没必要为每一个主机指定一个路由器,这是 I P 路由选择机制
的另外一个基本特性。这样作能够极大地缩小路由表的规模,好比 I n t e r n e t 上的路由器有只有几
千个表目,而不会是超过 1 0 0 万个表目。

子网寻址

如今全部的主机都要求支持子网编址( RFC 950 [Mogul and Postel 1985])。不是把 I P 地址
当作由单纯的一个网络号和一个主机号组成,而是把主机号再分红一个子网号和一个主机号。
这样作的缘由是由于 A 类和 B 类地址为主机号分配了太多的空间,可分别容纳的主机数为
2 2 4 -2 和 2 1 6 -2。事实上,在一个网络中人们并不安排这么多的主机(各种 I P 地址的格式如图 1 - 5
所示)。因为全 0 或全 1 的主机号都是无效的,所以咱们把总数减去 2。
在 I n t e r N I C 得到某类 I P 网络号后,就由当地的系统管理员来进行分配,由他(或她)来决
定是否创建子网,以及分配多少比特给子网号和主机号。例如,这里有一个 B 类网络地址
(1 4 0 . 2 5 2),在剩下的 16 bit 中,8 bit 用于子网号,8 bit 用于主机号,格式如图 3 - 5 所示。这样
就容许有 2 5 4 个子网,每一个子网能够有 2 5 4 台主机

许多管理员采用天然的划分方法,即把 B 类地址中留给主机的 16 bit 中的前 8 bit 做为子网
地址,后 8 b i t 做为主机号。这样用点分十进制方法表示的 I P 地址就能够比较容易肯定子网号。
可是,并不要求 A 类或 B 类地址的子网划分都要以字节为划分界限。
大多数的子网例子都是 B 类地址。其实,子网还可用于 C 类地址,只是它可用的比特数较
少而已。不多出现 A 类地址的子网例子是由于 A 类地址自己就不多(可是,大多数 A 类地址都
是进行子网划分的)。

子网划分缩减了路由表的规模

子网掩码

任何主机在引导时进行的部分配置是指定主机 I P 地址。大多数系统把 I P 地址存在一个磁
盘文件里供引导时读用

除了 I P 地址之外,主机还须要知道有多少比特用于子网号及多少比特用于主机号。这是
在引导过程当中经过子网掩码来肯定的。这个掩码是一个 32 bit 的值,其中值为 1 的比特留给网
络号和子网号,为 0 的比特留给主机号。图 3 - 7 是一个 B 类地址的两种不一样的子网掩码格式。第
一个例子是 n o a o . e d u 网络采用的子网划分方法,如图 3 - 5 所示,子网号和主机号都是 8 bit 宽。
第二个例子是一个 B 类地址划分红 10 bit 的子网号和 6 bit 的主机号。

尽管 I P 地址通常以点分十进制方法表示,可是子网掩码却常常用十六进制来表示,特别
是当界限不是一个字节时,由于子网掩码是一个比特掩码。

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

特殊状况的 IP 地址

通过子网划分的描述,如今介绍 7 个特殊的 I P 地址,如图 3 - 9 所示。在这个图中, 0 表示所
有的比特位全为 0;- 1 表示全部的比特位全为 1;n e t i d、s u b n e t i d 和 h o s t i d 分别表示不为全 0 或全
1 的对应字段。子网号栏为空表示该地址没有进行子网划分

咱们把这个表分红三个部分。表的头两项是特殊的源地址,中间项是特殊的环回地址,
最后四项是广播地址。
表中的头两项,网络号为 0,如主机使用 B O O T P 协议肯定本机 I P 地址时只能做为初始化过
程中的源地址出现。

RFC 1009[Braden and Postel 1987]容许一个含有子网的网络使用多个子网掩码。新
的路由器需求 RFC[Almquist 1993]则要求支持这一功能。
可是,问题在于并非全部的路由选择协议在交换目的网络时也交换子网掩码。
R I P 不支持变长子网,R I P 第 2 版和 O S P F 则支持变长子网。

ifconfig 命令

到目前为止,咱们已经讨论了链路层和 I P 层,如今能够介绍 T C P / I P 对网络接口进行配置
和查询的命令了。i f c o n f i g( 8 )命令通常在引导时运行,以配置主机上的每一个接口。
因为拨号接口可能会常常接通和挂断(如 S L I P 链路),每次线路接通和挂断时,
i f c o n f i g 都必须(以某种方法)运行。这个过程如何完成取决于使用的 S L I P 软件

环回接口(2 . 7 节)被认为是一个网络接口。它是一个 A 类地址,没有进行子网划分。
须要注意的是以太网没有采用尾部封装( 2 . 3 节),并且能够进行广播,而 S L I P 链路是一
个点对点的连接

i f c o n f i g 命令通常支持 T C P / I P 之外的其余协议族,并且有不少参数。关于这些细节可
以查看系统说明书

netstat 命令

n e t s t a t( 1 )命令也提供系统上的接口信息。 - i 参数将打印出接口信息, - n 参数则打印出
I P 地址,而不是主机名字

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

IP 的将来

I P 主要存在三个方面的问题。这是 I n t e r n e t 在过去几年快速增加所形成的结果(参见习题
1 . 2)。

  1. 超过半数的 B 类地址已被分配。根据估计,它们大约在 1 9 9 5 年耗尽。
  2. 32 bit 的 I P 地址从长期的 I n t e r n e t 增加角度来看,通常是不够用的。
  3. 当前的路由结构没有层次结构,属于平面型 ( f l a t )结构,每一个网络都须要一个路由表目。
    随着网络数目的增加,一个具备多个网络的网站就必须分配多个 C 类地址,而不是一个 B 类地
    址,所以路由表的规模会不断增加。
    无类别的域间路由选择 C I D R(Classless Interdomain Routing)提出了一个能够解决第三
    个问题的建议,对当前版本的 I P(I P 版本 4)进行扩充,以适应 2 1 世纪 I n t e r n e t 的发展。对此我
    们将在 1 0 . 8 节进一步详细介绍。
    对新版的 I P,即下一代 I P,常常称做 I P n g,主要有四个方面的建议。 1 9 9 3 年 5 月发行的
    IEEE Network (vol.7, no.3)对前三个建议进行了综述,同时有一篇关于 C I D R 的论文。R F C
    1454 [Dixon 1993]对前三个建议进行了比较。
  4. SIP,简单 I n t e r n e t 协议。它针对当前的 I P 提出了一个最小幅度的修改建议,采用 6 4 位地
    址和一个不一样的首部格式(首部的前 4 比特仍然包含协议的版本号,其值再也不是 4)。
  5. PIP。这个建议也采用了更大的、可变长度的和有层次结构的地址,并且首部格式也不
    相同。
  6. TUBA, 代 表“ TCP and UDP with Bigger Address”, 它基 于 OSI 的 C L N P
    (Connectionless Network Protocol,无链接网络协议),一个与 I P 相似的 O S I 协议。它提供大得
    多的地址空间:可变长度,可达 2 0 个字节。因为 C L N P 是一个现有的协议,而 S I P 和 P I P 只是建
    议,所以关于 C L N P 的文档已经出现。RFC 1347[Callon 1992]提供了 T U B A 的有关细节

  7. TP/IX,由 RFC 1475 [Ullmann 1993]对它进行了描述。虽然 S I P 采用了 64 bit 的址址,但
    是它还改变了 T C P 和 U D P 的格式:两个协议均为 32 bit 的端口号,64 bit 的序列号,64 bit 的确
    认号,以及 T C P 的 32 bit 窗口。
    前三个建议基本上采用了相同版本的 T C P 和 U D P 做为传输层协议。
    因为四个建议只能有一个被选为 I P v 4 的替换者,并且在你读到此书时可能已经作出选择,
    所以咱们对它们不进行过多评论。虽然 C I D R 即将实现以解决目前的短时间问题,可是 I P v 4 后继
    者的实现则须要通过许多年。

小结

本章开始描述了 I P 首部的格式,并简要讨论了首部中的各个字段。咱们还介绍了I P 路由
选择,并指出主机的路由选择能够很是简单:若是目的主机在直接相连的网络上,那么就把
数据报直接传给目的主机,不然传给默认路由器。
在进行路由选择决策时,主机和路由器都使用路由表。在表中有三种类型的路由:特定
主机型、特定网络型和默认路由型。路由表中的表目具备必定的优先级。在选择路由时,主
机路由优先于网络路由,最后在没有其余可选路由存在时才选择默认路由
I P 路由选择是经过逐跳来实现的。数据报在各站的传输过程当中目的 I P 地址始终不变,但
是封装和目的链路层地址在每一站均可以改变。大多数的主机和许多路由器对于非本地网络
的数据报都使用默认的下一站路由器。
A 类和 B 类地址通常都要进行子网划分。用于子网号的比特数经过子网掩码来指定。咱们
为此举了一个实例来详细说明,即做者所在的子网,并介绍了变长子网的概念。子网的划分
缩小了 I n t e r n e t 路由表的规模,由于许多网络常常能够经过单个表目就能够访问了。接口和网
络的有关信息经过i f c o n f i g 和 n e t s t a t 命令能够得到,包括接口的 I P 地址、子网掩码、广
播地址以及 M T U 等

在本章的最后,咱们对 I n t e r n e t 协议族潜在的改进建议 — 下一代 I P进行了讨论。

相关文章
相关标签/搜索