IP及其相关协议

IPv4 分组

IPv4 ,即现在普遍使用的IP 协议 (版本为4)。IP 协议定义数据传送的基本单元——IP 分组及其确切的数据格式 。IP 协议也包括一套规则 ,指明分组如何处理 、错误怎样控制。特别是,IP协议还包含非可靠投递的思想 ,以及与此关联的分组路由选择的思想 。

    IPv4 分组的格式

一个 IP 分组由首部和数据两部分组成 。首部的前一部分是固定长度的 ,共 20 宇节,是所有 IP 分组必须具有的 。在首部固定部分的后面是一些可选字段 ,其长度是可变的,用来提供错误检测及安全等机制 。IP 数据报的格式如图所示。

IP 首部的部分重要宇段含义如下 :

1)  版本    指 IP 协议的版本 ,目前广泛使用的版本号为 4。

2)首部长度    占4 位。以 32 位为单位,最大值为60字节 (15x4字节)。最常用的首部长度是 20 字节,此时不使用任何选项(即可选字段)。

3)总长度    占 16  位。指首部和数据之和的长度,单位为字节 ,因此数据报的最大长度为2^16-1=65535 字节。以太网帧的最大传送单元MTU为 1500 字节,因此当一个IP 数据报封装成帧时 ,数据报的总长度(首部加数据) 一定不能超过下面数据链路层的 MTU 值。

4) 标识    占 16 位。它是一个计数器 ,每产生一个数据报就加 1,并赋值给标识字段 。但它并不是 “序号” ( 因为IP是无连接服务)。当一个数据报长度超过网络的 MTU 时,必须分片,此时每个数据报片都复制一次标识号以便能正确重装成原来的数据报  。

5) 标志    占3 位 。标志字段的最低位为 MF,  MF=1 表示后面还有分片;MF=0 表示最后一个分片 。标志字段中间的一位是 DF,只有当 DF=0 时才允许分片。

6) 片偏移    占 13 位。它指出较长的分组在分片后 ,某片在原分组中的相对位置 。片偏移以8 个字节为偏移单位 ,也即每个分片的长度一定是 8 字节 ( 64 位) 的整数倍。

7) 首部检验和    占 16 位。IP数据报的首部检验和只校验分组的首部,而不校验数据部分。

8) 生存时间 TTL    占 8 位。即数据报在网络中可通过的路由器数的最大值 ,标识分组在网络中的寿命 ,以确保分组不会永远在网络中循环 。路由器在转发分组之前 ,先把 TTL 减 1。若 TTL  被减为 0,则该分组必须丢弃。

9) 协议    占 8 位。指出此分组携带的数据是使用何种协议  ,即分组的数据部分应交给哪个传输层协议,如TCP,  UDP 等。其中值为 6 表示 TCP,值为 17 表示 UDP 。

10)源地址宇段    占 4 字节,标识发送方的IP地址。

11)  目的地址字段    占 4 字节,标识接收方的IP地址。

IP 数据报分片

一个链路层数据报能承载的最大数据量称为最大传送单元(MTU ) 。因为 IP 数据报被封装在链路层数据报中 ,故链路层的 MTU 严格地限制着 IP 数据报的长度 ,而且在IP 数据报的源与目的地路径上的各段链路可能使用不同的链路层协议 ,有不间的 MTU 。例如 ,以太网的 MTU 为 1500 字节 ,而许多广域网的 MTU 不超过 576 字节 。当 IP 数据报的总长度大于链路 MTU 时,就需要将 IP 数据报中的数据分装在两个或更多个较小的 IP 数据报中 ,这些较小的数据报叫做片 。

片在目的地的网络层被重新组装 。目的主机使用IP首部中的标识 、标志和片偏移字段来完成对片的重组 。当创建一个 IP 数据报时 ,源主机为该数据报加上一个标识号 。当一个路由器需要将一个数据报分片时 ,形成的每个数据报 (即片) 都具有原始数据报的标识号 。当目的主机收到来自同一发送主机的一批数据报时  ,它可以通过检查数据报的标识号以确定哪些数据报是属于同一个原始数据报的片 。IP 首部中的标志位有 3 个比特 ,但只有后 2 个比特有意义 ,分别是 MF位( More Fragment ) 和 DF 位 (Don’t Fragment) 。只有当DF = 0时,该 IP 数据报才可以被分片 。 MF 则用来告知目的主机该 IP 数据报是否为原始数据报的最后一个片 。当MF=1时,表示相应的原始数据报还有后续的片;当MF=0时,表示该数据报是相应原始数据报的最后一个片 。目的主机在对片进行重组时 ,使用片偏移字段来确定片应放在原始 IP 数据报的哪个位置 。

IP 分片涉及一定的计算 。例如,一个长4000 字节的 IP 数据报(首部 20 字节,数据部分3980 字节) 到达一个路由器 ,需要转发到一条 MTU 为 1500 字节的链路上 。这意味着原始数据报中 3980 字节数据必须被分配到 3 个独立的片中 (每个片也是一个 IP 数据报)。假定原始数据报的标识号为 777 ,那么分成的 3 片如图所示。可以看出 ,由于偏移值的单位是 8 字节,所以除了最后一个片外,其他所有片中的有效数据载荷都是 8 的倍数。

网络层转发分组的流程

网络层的路由器执行的分组转发算法如下 :

1)  从数据报的首部提取目的主机的 IP 地址 D,得出目的网络地址为 N。

2)若网络 N 与此路由器直接相连 ,则把数据报直接交付目的主机 D,这就叫路由器的直接交付;否则是间接交付 ,执行3)。

3) 若路由表中有目的地为址为 D 的特定主机路由 (对特定的目的主机指明一个特定的路由 , 通常是为了控制或测试网络 ,或出于安全考虑才采用的) ,则把数据报传送给路由表中所指明的下一跳路由器;否则,执行4)。

4) 若路由表中有到达网络 N  的路由,则把数据报传送给路由表指明的下一跳路由器 :否则,执行 5)。

5) 若路由表中有一个默认路由 ,则把数据报传送给路由表中所指明的默认路由器;否则,执行6)。

6) 报告转发分组出错 。

注意:得到下一跳路由器的 IP 地址后不是直接将该地址填入到待发送的数据报,而是将该IP地址转换成 MAC 地址 ( 通过ARP协议),将其放到MAC帧首部中 ,然后根据这个 MAC 地址找到下一跳路由器 。在不同网络中传送时,MAC 帧中的源地址和目的地址要发生变化 ,但是网桥在转发帧时 ,不改变帧的源地址,注意区分 。

IPv4 地址与 NAT

    IPv4 地址

连接在 Internet 中的每一台主机 (或路由器) 都分配一个 32 比特的全球唯一的标识符 ,即IP地址 。传统的 IP 地址是分类的地址 ,分为A、B、C、D、E 五类。

无论哪类 IP 地址 ,都由网络号和主机号两部分组成 。即 IP 地址::={<网络号>,<主机号〉} 。 其中网络号标志主机(或路由器) 所连接到的网络 。一个网络号在整个因特网范围内必须是唯一的。主机号标志该主机  (或路由器)。一个主机号在它前面的网络号所指明的网络范围内必须是唯一的。由此可见,一个 IP 地址在整个因特网范国内是唯一的。

分类的 IP 地址如图所示。

在各类 IP 地址中 ,有一些 IP 地址用于表示特殊用途 ,不用于做主机 IP 地址: 

主机号全为 0 表示本网络本身 。例如,202.98.174.0

主机号全为 1表示本网络的广播地址 ,又称直接广播地址 。例如,202.98.174.255 

127.0.0.0 网络保留作为环路自检 ( Loopback Test ) 地址,此地址表示任意主机本身 ,目的地址为环回地址的 IP 数据报永远不会出现在任何网络上。

32 位全为 0,即 0.0.0.0 表示本网络上的本主机 。

32 位全为 1,即 255.255.255.255 表示整个 TCP/IP 网络的广播地址,又称受限广播地址 。 实际使用时由于路由器对广播域的隔离 ,255.255.255.255 等效为本网络的广播地址 。

常用的三种类别的 IP 地址的使用范围见下表。

在表中,A 类地址可用的网络数为 2^7-2 ,减 2 的原因是:第一,网络号字段全为 0 的 IP 地址是保留地址 ,意思是 “本网络”;第二,网络号为 127 为环回测试地址 。B 类地址可用网络数为 2^14 - 1,减 1 的原因是:128.0 这个网络号是不可指派的 。C 类地址可用网络数为 2^21 - 1,减1的原因是:网络号为 192.0.0 的网络是不可指派的 。

IP 地址有以下重要的特点 :

1) 每个 IP 地址都由网络号和主机号两部分组成 ,因此IP 地址是一种分等级的地址结构 。 分等级的好处是 :①IP 地址管理机构在分配 IP 地址时只分配网络号 (第一级),而主机号 (第二级) 则由得到该网络的单位自行分配 ,方便了 IP 地址的管理;②路由器仅根据目的主机所连接的网络号来转发分组 (而不考虑目标主机号),从而减小了路由表所占的存储空间 。

2) IP 地址是标志一个主机 (或路由器) 和一条链路的接口 。当一个主机同时连接到两个网络时,该主机就必须同时具有两个相应的 IP 地址,每个 IP 地址的网络号必须与所在网络的网络号相同,且这两个 IP 地址的网络号是不同的 。因此 IP 网络上的一个路由器必然至少应当具有两个 IP 地址 (路由器每个端口必须至少分配一个 IP 地址)。

3)用转发器或桥接器 ( 网桥等) 连接起来的若干个 LAN 仍然是同一个网络 ( 同一个广播域),因此该 LAN  中所有主机的 IP 地址的网络号必须相同 ,但主机号必须不同 。

4)在 IP 地址中 ,所有分配到网络号的网络 (无论是 LAN 或 WAN ) 都是平等的。

5)在同一个局域网上的主机或路由器的 IP 地址中的网络号必须是一样的 。路由器总是具有两个或两个以上的 IP 地址,路由器的每一个端口都有一个不同网络号的 IP 地址。

    网络地址转换

网络地址转换(NAT) ,是通过将专用网络地址 (如企业内部 Intranet ) 转换为公用地址 (如 Internet ),从而对外隐藏了内部管理的 IP 地址。它使得整个专用网只需要一个全球IP地址就可以与因特网连通,由于专用网本地IP 地址是可重用的,所以 NAT 大大节省了IP地址的消耗 。 同时,它隐藏了内部网络结构 ,从而降低了内部网络受到攻击的风险 。

此外,为了网络安全 ,划出了部分 IP 地址为私有 IP 地址。私有 IP 地址只用于 LAN ,不用 于 WAN 连接 (因此私有 IP 地址不能直接用于 Internet ,必须通过网关利用 NAT 把私有 IP 地址转换为 Internet 中合法的全球IP地址后才能用于 Internet ),并且允许私有IP 地址被 LAN 重复使用。这有效地解决了 IP 地址不足的问题 。私有 IP 地址网段如下 :

A 类:1个 A 类网段 ,即 10.0.0.0 ~10.255.255.255

B 类:16 个 B 类网段,即 172.16.0.0 ~172.31.255.255

C 类:256 个 C 类网段 ,即 192.168.0.0 ~192.168.255.255

在因特网中的所有路由器 ,对目的地址是私有地址的数据报一律不进行转发 。这种采用私有IP 地址的互联网络称为专用互联网或本地互联网 。私有IP地址也称可重用地址 。

使用 NAT 时需要在专用网连接到因特网的路由器上安装 NAT 软件,NAT 路由器至少有一个有效的外部全球地址 。当使用本地地址的主机在和外界通信时 ,NAT 路由器使用 NAT  转换表将本地地址转换成全球地址 ,或将全球地址转换成本地地址 。NAT 转换表中存放着{本地 IP 地址: 端口}到{全球 IP 地址:端口}的映射。通过{ip 地址 :端口}这样的映射方式 ,就可以让多个私有 IP 地址映射到同一个全球 IP 地址。

下面以宿舍共享宽带上网为例 。假设一个宿舍办理了 2Mb/s 的电信宽带 ,那么这个宿舍就获得了一个全球 IP 地址(如 138.76.29.7 ) ,而宿舍内 4 台主机使用私有地址( 如 192.168.0.0 网段)。 宿舍的网关路由器应该开启 NAT 功能,并且某时刻路由器上的 NAT 转换表见表。那么,当路由器从 LAN 端口收到IP及源端口号为192.168.0.2:2233  的数据报时 ,就将其映射成138.76.29.7: 5001 ,然后从WAN端口发送到因特网上 。当路由器从 WAN 端口收到目的 IP 及目的端口号为 138.76.29.7:5060 的数据报时,就将其映射成 192.168.0.3:1234,然后从 LAN 端口发送给相应的本地主机。这样,只需要一个全球地址,就可以让多台主机同时访问因特网 。

注意:普通路由器在转发 IP 数据报时 ,不改变其源 IP 地址和目的 IP 地址。而NAT路由器在转发 IP 数据报时一定要更换其IP地址 ( 转换源 IP 地址或目的 IP 地址 )。普通路由器仅工作在网络层,而 NAT 路由器转发数据报时需要查看和转换传输层的端口号 。

子网划分与子网掩码 、CIDR

    子网划分

两级IP地址的缺点 :IP 地址空间的利用率有时很低:给每一个物理网络分配一个网络号会使路由表变得太大因而使网络性能变坏;两级的 IP 地址不够灵活 。

从 1985 年起,在 IP 地址中又增加了一个 “子网号字段”,使两级 IP 地址变成为三级 IP 地址 。这种做法叫做划分子网 。划分子网已成为因特网的正式标准协议 。

划分子网的基本思路如下 :

·划分子网纯属一个单位内部的事情。单位对外仍然表现为没有划分子网的网络 。

·从主机号借用若干个比特作为子网号 ,当然主机号也就相应减少了相同的比特 。三级 IP地址的结构如下 :IP 地址 {<网络号〉,<子网号>,<主机号>} 。

·凡是从其他网络发送给本单位某个主机的 IP 数据报,仍然是根据 IP 数据报的目的网络号,先找到连接在本单位网络上的路由器。然后此路由器在收到IP数据报后,再按目的网络号和子网号找到目的子网 。最后就把 IP 数据报直接交付给目的主机 。

注意:1) 划分子网只是把 IP 地址的主机号这部分进行再划分 ,而不改变 IP地址原来的网络号。因此,从一个 IP 地址本身或 IP 数据报的首部 ,并无法判断源主机或目的主机所连接的网络是否进行了子网划分 。

2)   [RFC 950]规定,对分类的IPv4 地址进行子网划分时 ,子网号不能为全 1 或全 0。但随着 CIDR 的广泛使用 ,现在全 1 和全 0 的子网号也可以使用了 ,但一定要谨慎使用 ,要弄清你的路由器所用的路由选择软件是否支持全 0 或全 1 的子网号这种用法 。

3) 不论是分类的 IPv4 地址还是 CIDR ,其子网中的主机号为全 0 或全 1 的地址都不能被指派。子网中的主机号全 0 的地址为子网的网络号 ,主机号全 1 的地址为子网的广播地址。

    子网掩码

为了告诉主机或路由器对一个 A 类、B 类、C 类网络进行了子网划分 ,使用子网掩码来表达对原网络中主机号的借位 。

子网掩码是一个与 IP 地址相对应的长 32bit 的二进制串,它由一串 1 和跟随的一串 0 组成。 其中,1对应于 IP 地址中的网络号及子网号 ,而 0 对应于主机号 。计算机只需将 IP 地址和其对应的子网掩码运位相 “与” (逻辑 AND 运算),就可得出相应子网的网络地址 。

现在的因特网标准规定 :所有的网络都必须使用子网掩码 。如果一个网络没有划分子网,那么就采用默认子网掩码 。A 、B 、C  类地址的默认子网掩码分别为  255.0.0.0 、255.255.0.0 、 255.255.255.0 。例如,某主机的 IP 地址 136.34.5.56,子网掩码为255.255.255.0 ,进行逐位“与” 运算后,得出该主机所在子网的网络号 136.34.5.0。

由于子网掩码是一个网络或一个子网的重要属性,所以路由器在相互之间交换路由信息时, 必须把自己所在网络 (或子网) 的子网掩码告诉对方 。路由表中的每一个条目,除了要给出目的网络地址和下一跳地址外  ,还需要同时给出该目的网络的子网掩码。

在使用子网掩码的情况下 :

1) 一个主机在设置 IP 地址信息的同时 ,必须设置子网掩码 。

2)  同属于一个子网的所有主机以及路由器的相应端口 ,必须设置相同的子网掩码 。

3)  路由器的路由表中 ,所包含的信息其主要内容必须有:目的网络地址、子网掩码 、下一跳地址。

使用子网掩码时路由器的分组转发算法如下 :

1)  从收到的分组的首部提取目的 IP 地址,记为D。

2) 先判断是否为直接交付 。对路由器直接相连的网络个进行检查 :用各网络的子网掩码和 D按位相 “与”,看结果是否和相应的网络地址匹配 。若匹配,则将分组直接交付,否则就是间接交付,执行 3)。

3) 若路由表中有目的地址为 D 的特定主机路由,则将分组传送给路由表中所指明的下一跳路由器;否则,执行4)。

4) 对路由表中的每一行 (目的网络地址 ,子网掩码 ,下一跳地址) 中的子网掩码和D逐位相 “与”,其结果为 N。若 N与该行的目的网络地址匹配 ,则将分组传送给该行指明的下一跳路由器;否则,执行5)。

5) 若路由表中有一个默认路由 ,则将分组传送给路由表中所指明的默认路由器 ;否则,执行6)。

6) 报告转发分组出错 。

    无分类编址 CIDR

无分类域间路由选择 (CIDR ) 是在变长子网掩码的基础上提出的一种消除传统 A、B、C 类网络划分,并且可以在软件的支持下实现超网构造的一种IP地址的划分方法 。

比如说,如果一个单位需要2000个地址 ,那么就分配它一个 2048 地址的块 ( 8 个连续的 C 类网络),而不是一个完全的B类地址。这样可以大幅度提高IP地址空间的利用率 ,减小路由器的路由表大小 ,提高路由转发能力。CIDR的主要特点有:

1) 消除了传统的 A、B、C 类地址以及划分子网的概念 ,因而可以更加有效地分配 IPv4 的地址空间 。CIDR 使用“网络前缀” 的概念代替子网络的概念 。这样IP地址的无分类两级编址为 : IP : :={<网络前缀>,<主机号>} 。

CIDR 还使用 “斜线记法” (或称 CIDR 记法),即:IP 地址/网络前缀所占比特数 。其中,网络前缀所占比特数对应于网络号的部分 ,等效于子网掩码中连续 1 的部分 。例如 ,对于 128.14.32.5/20 这个地址 ,它的掩码是 20 个连续的 1 和后续 12 个连续的 0,通过逐位相 “与” 的方法可以得到该地址的网络前缀 (或直接截取前 20 位):

CIDR 虽然不使用子网 ,但仍然使用 “掩码” 这一名词。“CIDR 不使用子网” 是指 CIDR 并没有在 32 位地址中指明若干位作为子网字段 。但分配到一个 CIDR 地址块的组织 ,仍可以在本组织内根据需要划分出一些子网 。例如,某组织分配到地址块 /20,就可以再继续划分为8个子网 (从主机号中借用 3 位来划分子网),这时每个子网的网络前缀就变成23位。全 0 和全 1 的主机号地址一般不使用 。

2) 将网络前缀都相同的连续的 IP 地址组成 “CIDR 地址块”。一个CIDR 地址块可以表示很多地址,这种地址的聚合称为路由聚合,或称为构成超网  。路由聚合使得路由表中的一个项目可以表示很多个原来传统分类地址的路由  ,有利于减少路由器之间的路由选择信息的交换,从而提高网络性能。

例如,如图所示的网络中,如果不使用路由聚合,那么R1的路由表中需要分别有到网络 1 和网络 2 的路由表项。不难发现 ,网络 1 和网络 2 的网络前缀在二进制表示的情况下 ,前 16 位都是相同的,第17 位分别是 0 和 1,并且从R1 到网络 1和网络 2 的路由的下一跳皆为 R2。 若使用路由聚合,在R1 看来,网络 1 和网络 2 可以构成一个更大的地址块 206.1.0.0/16 ,到网络1 和网络 2 的两条路由就可以聚合成一条到 206.1.0.0/16 的路由。

CIDR 地址块中的地址数一定是 2 的整数次幂,实际可指派的地址数通常为2^N-2, N表示主机号的位数 ,主机号全0代表网络号 ,主机号全1为广播地址 。网络前缀越短 ,其地址块所包含的地址数就越多 。而在三级结构的 IP 地址中,划分子网是使网络前缀变长 。

CIDR 的优点在于网络前缀长度的灵活性 。由于上层网络的前缀长度较短 ,因此相应的路由表的项目较少。而内部又可采用延长网络前缀的方法来灵活的划分子网  。

最长前缀匹配(最佳匹配) :使用 CIDR 时,路由表中的每个项目由 “网络前缀” 和 “下一跳地址” 组成。在查找路由表时可能会得到不止一个匹配结果。应当从匹配结果中选择具有最长网络前缀的路由 ,因为网络前缀越长 ,其地址块就越小 ,因而路由就越具体。

CIDR 查找路由表的方法 :为了进行更如有效的查找最长前缀匹配,通常是将无分类编址的路由表存放在一种层次的数据结构中 ,然后自上而下地按层次进行查找 。这里最常用的数据结构就是二叉线索 。

ARP 协议、DHCP 协议与 ICMP 协议

    IP 地址与硬件地址

IP 地址是网络层使用的地址 ,它是分层次等级的 。硬件地址是数据链路层使用的地址  (例如 MAC 地址),它是平面式的。在网络层及网络层之上使用 IP 地址,IP 地址放在 IP 数据报的首部,而MAC 地址放在 MAC 帧的首部。通过数据封装 ,把IP数据报分组封装成为 MAC 帧之后 ,数据链路层看不见数据报分组中的 IP 地址。

由于路由器的隔离,IP 网络中无法通过广播方式依靠 MAC地址来完成跨网络的寻址 ,因此在 IP 网络的网络层只使用IP地址来完成寻址 。寻址时 :每个路由器依据其路由表 (依靠静态路由或动态路由协议生成) 选择到目标网络(即主机号全为 0  的网络地址) 需要转发到的下一跳(路由器的物理端口号或下一网络地址) ,而IP分组通过多次路由转发到达目标网络后 ,则改为在目标网络 LAN 中通过数据链路层的 MAC 地址以广播方式寻址 。这样可以提高路由选择的效率 。

1)在IP层抽象的互联网上只能看到 IP 数据报 。

2)虽然在 IP 数据报首部中有完整的源 IP 地址和目的 IP 地址,但路由器只根据目的 IP 地址的网络号进行路由选择 。

3)在局域网的链路层,只能看见 MAC 帧。而通过路由器转发 IP 分组时,此 IP 分组在每个网络中都被路由器解封装和重新封装 。因此 IP 数据报在被路由器转发时其数据链路层封装所使用的 MAC 地址是在不断改变的 。这也决定了无法使用 MAC 地址跨网络通信 。

4)尽管互联在一起的网络的硬件地址体系各不相同 ,但IP层抽象的互联网却屏蔽了下层这些报复杂的细节。只要我们在网络层上讨论问题 ,就能够使用统一的、抽象的 IP 地址研究主机与主机或路由器之间的通信 。

注意:路由器由于互联多个网络,因此它不仅有多个 IP 地址 ,也有多个硬件地址

    地址解析协议 ARP

无论网络层使用什么协议 ,在实际网络的链路上传送数据帧时,最终必须使用硬件地址。所以需要一种方法来完成 IP 地址到 MAC 地址的映射 ,这就是地址解析协议 ARP( Address Resolution Protocol ) 。每个主机都设有一个 ARP 高速缓存,存放本局域网上各主机和路由器的 IP 地址到 MAC 地址的映射表 ,称 ARP 表。使用ARP 协议来动态维护此 ARP 表。

ARP工作在网络层,其工作原理:当主机A欲向本局域网上的某个主机 B 发送 IP 数据报时,就先在其ARP 高速缓存中查看有无主机 B 的IP地址 。如有,就可查出其对应的硬件地址, 再将此硬件地址写入 MAC 帧,然后通过局域网将该 MAC 帧发往此硬件地址 。如果没有 ,就通过使用目的MAC地址为 FF-FF-FF-FF-FF-FF的帧来封装并广播 ARP 请求分组 ,可以便同一个局域网里的所有主机收到 ARP 请求。当主机 B 收到该 ARP 请求后 ,就会向主机 A 发出响应 ARP 分组,分组中包含主机 B 的IP 与 MAC 地址的映射关系 ,主机A 在收到后将此映射写入 ARP 缓存中,然后按查询到的硬件地址发送 MAC 帧。ARP 协议由于 “看到了” IP 地址,所以它工作在网络层,而 NAT 路由器由于 “看到了” 端口,所以它工作在传输层 。对于某个协议工作在哪个层次,读者应该能通过协议的工作原理进行猜测。

注意:ARP 是解决同一个局域网上的主机或路由器的 IP 地址和硬件地址的映射问题 如果所要找的主机和源主机不在同一个局域网上 ,那么就要通过 ARP  协议找到一个位于本局域网上的某个路由器的硬件地址然后把分组发送给这个路由器让这个路由器把分组特发给下一个网络。剩下的工作就由下一个网络来做,尽管ARP 请求分组是广播发送的 ,但是 ARP 响应分组是普通的单播 ,即从一个源地址发送到一个目的地址 。

ARP 的4 种典型情况总结 :

1)  发送方是主机 ,要把 IP 数据报发送到本网络上的另一个主机 。这时用 ARP 找到目的主机的硬件地址 。

2)发送方是主机 ,要把 IP 数据报发送到另一个网络上的一个主机 。这时用 ARP 找到本网络上的一个路由器的硬件地址 ,剩下的工作由这个路由器来完成 。

3)发送方是路由器 ,要把 IP 数据报转发到本网络上的一个主机 。这时用 ARP 找到目的主机的硬件地址。

4 )发送方是路由器 ,要把 IP数据报转发到另一个网络上的一个 主机。这时用 ARP 找到本网络上的一个路由器的硬件地址 ,剩下的工作由找到的这个路由器完成 。

从 IP 地扯到硬件地址的解析是自动进行的 ,主机的用户对这种地址解析过程是不知道的 。 只要主机或路由器要和本网络上的另一个已知 IP 地址的主机或路由器进行通信 ,ARP  协议就会自动地将这个 IP 地址解析为链路层所需要的硬件地址 。

    动态主机配置协议 DHCP

动态主机配置协议 (Dynamic Host Configuration Protocol, DHCP ) 常用于给主机动态地分配 IP 地址 ,它提供了即插即用联网的机制 ,这种机制允许一台计算机加入新的网络和获取IP 地址而不用手工参与 。DHCP 是应用层协议 ,它是基于 UDP 的。

DHCP 协议工作原理 :它使用客户/服务器方式 。需要IP 地址的主机在启动时就向 DHCP 服务器广播发送发现报文 ,这时该主机就成为DHCP客户。本地网络上所有主机都能收到此广播报文 ,但只有 DHCP 服务器才回答此广播报文 。DHCP  服务器先在其数据库中查找该计算机的配置信息。若找到,则返回找到的信息 。若找不到 ,则从服务器的 IP 地址池中取一个地址分配给该计算机 。DHCP 服务器的回答报文叫做提供报文 。

DHCP 服务器聚合 DHCP 客户端的交换过程如下 :

1) DHCP 客户机广播 “DHCP 发现” 消息,试图找到网络中的 DHCP 服务器,从服务器获得一个 IP 地址。

2) DHCP 服务器收到 “DHCP 发现” 消息后 ,就向网络中广播 “DHCP 提供” 消息,其中包括提供 DHCP 客户机的 IP 地址和相关配置信息 。

3) DHCP 客户机收到 “DHCP 提供” 消息,如果接受 DHCP 服务器所提供的相关参数 ,则通过广播 “DHCP 请求” 消息向 DHCP 服务器请求提供 IP 地址。

4)DHCP 服务器广播 “DHCP 确认” 消息,将 IP地址分配给 DHCP 客户机。

DHCP 协议允许网络上配置多台 DHCP 服务器,当 DHCP 客户机发出 DHCP 请求时 ,有可能收到多个应答消息 。这时,DHCP 客户机只会挑选其中一个,通常挑选最先到达的 。

DHCP 服务器分配给 DHCP 客户的 IP 地址是临时的,因此 DHCP 客户只能在一段有限的时间内使用这个分配到的 IP 地址。DHCP  称这段时间为租用期 。租用期的数值应由 DHCP 服务器自己决定,DHCP  客户也可在自己发送的报文中提出对租用期的要求 。

DHCP 协议是应用层协议 ,因为它是通过客户/服务器方式工作的 ,DHCP 客户端向 DHCP 服务器请求服务 ,应用层协议有两种工作方式 :客户/服务器方式和 P2P 方式,而其他层次的协议是没有这两种正作方式的 。

DHCP 协议的客户端和服务端需要通过广播方式来进行交互 ,原因是在 DHCP 协议执行期间,客户端和服务端都没有标识自己身份的 IP 地址,因此不可能通过单播的形式进行交互 。采用 UDP 而不采用 TCP 的原因也很明显,TCP 协议需要建立连接 ,如果连对方的 IP 地址都不知道 ,更不可能通过双方的套接宇建立连接了 。

    网际控制报文协议 ICMP

为了提高 IP 数据报交付成功的机会 ,在网络层使用了网际控制报文协议 ( Internet Con仕ol Message Protocol, ICMP ) 来允许主机或路由器报告差错和异常情况 。ICMP 报文作为 IP 层数据报的数据 ,加上数据报的首部 ,组成 IP 数据报发送出去 。ICMP  协议是 IP 层协议。

ICMP 报文的种类有两种 ,即 ICMP 差错报告报文和 ICMP 询问报文。

ICMP 差错报告报文用于目标主机或到目标主机路径上的路由器向源主机报告差错和异常情况。共有以下五种类型:

1) 终点不可达 。当路由器或主机不能交付数据报时就向源点发送终点不可达报文 。

2) 源点抑制 。当路由器或主机由于拥塞而丢弃数据报时 ,就向源点发送源点抑制报文 ,使源点知道应当把数据报的发送速率放慢  。

3) 时间超过。当路由器收到生存时间 TTL 为零的数据报时 ,除丢弃该数据报外,还要向源点发送时间超过报文。当终点在预先规定的时间内不能收到一个数据报的全部数据报片时 ,就把己收到的数据报片都丢弃,并向源点发送时间超过报文 。

4) 参数问题 。当路由器或目的主机收到的数据报的首部中有的字段的值不正确时 ,就丢弃该数据报 ,并向源点发送参数问题报文 。

5) 改变路由 (重定向)。路由器把改变路由报文发送给主机,让主机知道下次应将数据报发送给另外的路由器 (可通过更好的路由) 。

不应发送 ICMP 差错报告报文的几种情况:

1)   对 ICMP 差错报告报文不再发送 ICMP 差错报告报文。

2) 对第一个分片的数据报片的所有后续数据报片都不发送 ICMP 差错报告报文 。

3) 对具有组播地址的数据报都不发送 ICMP 差错报告报文 。

4) 对具有特殊地址 ( 如 127.0.0.0 或 0.0.0.0 )  的数据报不发送 ICMP 差错报告报文 。

ICMP  询问报文有四种类型 :回送请求和回答报文 、时间戳请求和回答报文 、掩码地址请求和回答报文 、路由器询问和通告报文 ,最常用的是前两类 。

ICMP 的两个常见的应用是分组网间探测  PING( 用来测试两个主机之间的连通性) 和 traceroute  ( UNIX  中的名字,在 Windows  中是 tracert ,可以用来跟踪分组经过的路由)。其中 PING 使用了 ICMP 回送请求和回答报文 ,traceroute  ( Tracert )使用了 ICMP 时间超过报文 。

注意:PING 工作在应用层 ,它直接使用网络层的 ICMP 协议 ,而没有使用传输层的 TCP 或UDP 协议。Traceroute/tracert  工作在网络层