网际协议(IP,Internet Protocol)是 TCP/IP 协议族使用的网络层传输协议。IP 是 TCP/IP 一系列协议的核心,主要负责网络层 IP 分组的传输,从而实现广域异构网络的互连。目前,IP 第4 版(即 IPv4)是基于 TCP/IP 技术构建的全球因特网( Internet)所使用的主要 IP 版本,是由 因特网标准制定组织在 1981 年9 月确定的正式标准(RFC 791 Internet Protocol)。IPv6 是为了 适应当前因特网应用的飞速发展,为了克服 IPv4 存在的缺点(如 IP 地址空间的耗尽、缺乏对 实时音频和视频应用的支持以及缺乏对数据加密和鉴别的支持等)而提出的下一代网际协 议。移动 IP 是用于移动通信的技术,它是对当前基于固定网络环境设计的IP的一种扩展,使 其能够用于从一个网络转移到另一个网络的移动主机。
本章介绍了当前流行的 IPv4、下一代的网际协议 IPv6 和移动 IP 技术。在本章中如不特 别说明,IP 就是指 IPv4。
IP提供不可靠的、无连接的,尽最大努力交付的分组传输机制。“不可靠的”含义是指它 不能保证 IP 分组成功地传送到达目的站。如果 IP 分组经过的某个中间路由器暂时用完了缓 冲区,路由器就会丢弃该 IP 分组。任何要求的可靠性必须通过上层协议(如 TCP)来提供。 “无连接的”含义是指 IP 并不维护任何后续分组的状态信息,每个 IP 分组的处理都是相互独 立的。换言之,IP 分组可以不按发送顺序接收。如果一个发送站向同一目的站发送两个IP分 组 A 和 B,那么每个分组都是独立地进行路由选择,可能选择不同的传送路径,因此分组 B 有 可能比先发送的 A 更早到达目的站。最后,IP 提供的是“尽最大努力交付”的服务,也就是说, IP 协议尽力发送每个 IP 分组,并不随意地放弃分组,只有当资源用完或底层网络出现故障时 才可能出现不可靠性。
IP提供了3个重要的定义:
(1)IP定义了数据传输所用的基本单元,即规定了传输的数据格式。
(2)IP规定了IP分组的路由机制。
(3)除了数据格式和路由机制以外,IP还包括了一组体现不可靠分组交付思路的规则。这
些规则指明了主机和路由器应该如何处理IP分组、何时及如何发出错误信息以及在什么情况
下可以放弃分组等。IP是TCP/TP互联网设计中最基本的部分,因此有时称TCP/IP互联网为
基于IP的技术。
基于TCP/IP技术构建的互联网可以看作是一个虚拟网络,它把处于不同物理网络的所有主机都互连起来,并通过这个虚拟网络进行通信,这样就隐藏了不同物理网络的底层结构,简化了不同网络间的互连。为了能够进行有效的通信,在虚拟网络中的每一台设备(主机或路由器)都需要一个全局的地址标识,这个地址就是IP地址。
IP地址常采用二进制和点分十进制表示方式。
例如:点分十进制 195.69.19.20 对应的二进制为 11000011 01000101 00010011 00010100
二进制转十进制:把二进制数中为1的位对应的十进制数值相加起来即可获得。
(11000011)2=128+64+2+1=195
(01000101)2=64+4+1=69
(00010011)2=16+2+1=19
(00010100)2=16+4=20
十进制转二进制:把这个十进制数表示为不同二进制位对应的十进制数之和。
例如:十进制数69可表示为69=64+4+1,即对应的二进制数为 01000101
二进制数与十进制数之间的关系 | ||||||||
位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
二进制 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
十进制 | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
在IPv4中,采用了一个两级的地址结构。32 bit 长度的IP地址包括两个部分:网络号和主机号。网络号标识一个网络,主机号标识该网络上的主机。针对网络规模的不同,把IP地址划分为5个不同的类别,分别称为A、B、C、D和E类。
红色部分表示网络类别,x表示网络号所占用的bit位,y表示主机号所占用的bit位,z表示多播地址,?表示保留未用。
A类:0xxxxxxx yyyyyyyy yyyyyyyy yyyyyyyy
B类:10xxxxxx xxxxxxxx yyyyyyyy yyyyyyyy
C类:110xxxxx xxxxxxxx xxxxxxxx yyyyyyyy
D类:1110zzzz zzzzzzzz zzzzzzzz zzzzzzzz
E类:1111???? ???????? ???????? ????????
(1) A类地址。A类地址用于支持特大型的网络。在A类地址中,第1个字节表示网络号,但最左边的第一位必须为0,剩下3个字节用来表示主机号。在整个A类地址中,共包括126(即27-2)个不同的网络,网络号0和127被保留用作特殊用途。后3个字节(24 bit)的主机号中,共有224个不同组合,能产生16777216个可能的主机地址。在所有这些可能地址中,主机号全0和全1被留作特殊用途,主机号全0的地址被用作代表该网络地址,主机号全1的地址表示该网络的广播地址,所以每个A类地址能够支持16777214(即224-2)个主机地址。
(2) B类地址。B类地址用于支持大型和中型的网络。在B类地址中,前两个字节用来表示网络号,但是最左边的两位必须为10,再后面的14位定义不同的网络,共可定义214=16384个B类网络,剩下的两个字节用来代表主机号,能够支持65534(216-2)个主机地址,这里有两个地址用作特殊用途,主机号全0和全1分别代表本网络地址和本网络的广播地址。
(3) C类地址。C类地址用于支持小型的网络。在C类地址中,前3个字节用来表示网络号,但最左边的3位必须是110,后面的21位定义不同的网络,共可定义221=2097152个C类网络。剩下的1个字节用来代表主机号,能够支持254(28-2)个主机地址,同样,有两个地址用作特殊用途,主机号全0和全1分别代表本网络地址和本网络的广播地址。
(4) D类地址。D类地址也称作多播地址。D类地址不是用于单独的主机地址,是专为IP网络中的多播而设置的。当需要向一组地址发送IP分组时,它不必将分组发送给每一个地址,只需将分组发送到一个特定的多播地址,所有加入该多播群组的设备(主机或路由器)均可以收到这个IP分组。这样对源发送站而言,分组只需发送一次就可以发送到所有目的站,大大减轻了网络和源发送站的负担。在D类地址中没有网络号和主机号之分,整个地址都用作多播。最左边的4位1110定义这个类,剩下的28位定义不同的多播地址。需要注意,D类地址只能用作目的地址,不能用作源地址。
(5) E类地址。E类地址没有网络号和主机号之分,最左边的4位1111定义这个类。整个E类地址都保留作为特殊用途,即被留作实验用途。
在A类、B类和C类地址中,有一部分地址被用作特殊用途,这些地址也称为特殊地址。
特殊地址 | |||
特殊地址 | 网络号 | 主机号 | 源地址/目的地址 |
网络地址 | 特定的 | 全0 | 都不是 |
直接广播地址 | 特定的 | 全1 | 目的地址 |
受限广播地址 | 全1 | 全1 | 目的地址 |
本网络上的本主机 | 全0 | 全0 | 源地址 |
本网络上的特定主机 | 全0 | 特定的 | 目的地址 |
环回地址 | 127 | 任意 | 目的地址 |
(1) 网络地址。在A类、B类和C类地址中,具有全0主机号的地址不指派给任何主机,这个地址保留用来定义本网络的地址。在路由选择中用网络地址标识一个网络。
(2) 直接广播地址。在A类、B类和C类地址中,若主机号是全1,则此地址称为直接广播地址,用于将IP分组发送到一个特定网络上的所有主机。
(3) 受限广播地址。若32 bit的IP地址都是全1(对应点分十进制表示为255.255.255.255),则此地址表示在当前网络上的一个广播地址。当需要将一个IP分组发送到本网络上的所有主机时,可使用这个地址作为分组的目的地址。需要注意,路由器不会转发此类型地址的分组,广播只局限在本地网络。
(4) 本网络上的本主机。若32 bit的IP地址都是全0(对应点分十进制表示为0.0.0.0)就表示在本网络上的本主机地址。当一个主机需要获得其IP地址时,可以运行一个引导程序,并且发送一个以全0地址作为源地址、受限广播地址作为目的地址的IP分组给引导服务器,以得到本主机的IP地址。
(5) 本网络上的特定主机。网络号为全0的IP地址表示在这个网络上的特定主机。用于一个主机向同一网络上的特定主机发送一个IP分组。因为网络号为0,路由器不会转发这个分组,所以分组只能局限在本地网络。
(6) 环回地址。在点分十进制表示的IP地址中,第1个字节等于127的IP地址用作环回地址,它是一个用来测试设备软件的地址。当使用环回地址时,分组永远不离开这个设备,只简单地返回到协议软件。例如,常用的“ping”命令,发送一个将环回地址作为目的地址的分组,以便测试IP软件能否接收和处理一个分组。
每一类网络中的网络数量和主机数量 | ||||
类 | 第1个字节 | 地址范围 | 网络数量 | 主机数量 |
A | 1~126 | 1.0.0.1~126.255.255.254 | 27-2=126 | 224-2=16777214 |
B | 128~191 | 128.0.0.1~191.255.255.254 | 214=16384 | 216-2=65534 |
C | 192~223 | 192.0.0.1~223.255.255.254 | 221=2097152 | 28-2=254 |
D | 224~239 | 224.0.0.1~239.255.255.254 | 不适用 | 不适用 |
E | 240~255 | 240.0.0.1~255.255.255.254 | 不适用 | 不适用 |
在A类、B类和C类IP地址中都有部分地址被保留,没有分配给任何因特网用户。换言之,任何用户都可以使用这部分地址,这些地址称为私有地址。下表给出了A类、B类和C类地址中被保留的私有地址。
私有地址 | ||
类 | 网络地址 | 网络数 |
A | 10.0.0.0 | 1 |
B | 172.16.0.0~172.31.0.0 | 16 |
C | 192.168.0.0~192.168.255.0 | 256 |
如果给一个单独的互联网(如校园网或企业网)分配IP地址,原则上网络管理员可自行规定网络上各主机的IP地址。如果该网络是与因特网相连接的,那么首先要向因特网编号管理局(IANA)的有关机构申请网络地址,然后再自行分配该网络上的主机地址。当为路由器分配IP地址时,为便于网络管理员记忆,一般可以为路由器接口分配较特殊的IP地址,例如该网络可用的最大或最小的IP地址。
一个互联网是由许多物理网络(局域网或广域网等)和连接它们的路由器所组成的。路 由器在网络层实现路由功能,互连不同的物理网络(网段)。根据 IP 协议的路由机制,在同一 个物理网络(网段)中的各主机必须具有相同的网络地址。换言之,一个物理网络(网段)对应 一个网络地址,大的物理网络(网段)对应能够容纳大量主机地址的网络地址,小的物理网络 (网段)对应能够容纳少量主机地址的网络地址,这就是 IP 分类编址的初衷。事实上,所有的 物理网络(如以太网)中,几乎不可能包含一个 B 类网络地址所容纳的 6 万多台主机,更不可 想象有 A 类网络所容纳的1 600 多万台主机。如果还是用一个物理网络(网段)对应一个网络 地址,那么就会导致大量的 IP 地址被浪费。在因特网迅速发展的今天,网络地址已经成为珍 贵的资源,如何有效利用 IP 地址空间成为一个至关重要的问题。能否打破 IP 地址类的界限, 使得每一个物理网络(网段)都有合适大小的网络地址段相对应呢?换言之,网络地址中容纳 的 IP 地址数如何匹配物理网络(网段)中包含的实际主机数量?这就引出了子网划分的概 念。子网划分就是将一个网络地址下的大段主机地址划分成较小的被称为子网络的组,使得 划分后子网络的大小接近实际物理网络(网段)的规模,这样可以有效利用 IP 地址空间,划分 后的每一个子网都有自己的子网地址(网络地址)。
采用子网划分的方法,可以将一个大的网络地址分成多个更小的子网络地址。这些子网络 地址可以被分布到整个组织机构中,使得每一个子网络地址对应一个物理网络(网段),便于有效 地利用地址空间,体现更好的逻辑组织性。在 1985 年,子网在 RFC 950 文档中被正式定义。
子网划分使 IPv4 地址从两级结构变成了 3 级结构,如图 3-3 所示。
如图 3-3 所示的 3 级地址结构中,由子网号所占的位数决定子网的数量。对于一个 B 类 网络地址,在 16 bit 的主机号中,如果划分出 8 bit 作为子网号,那么可以生成 28(即 256)个潜 在的子网地址。剩下的 8 bit 作为子网中的主机号,在每个子网中可以包含254(28-2)个主机 地址,这里除掉了一个被保留用作子网地址的全0主机地址和一个保留用作子网广播地址的 全1主机地址。
在上述256个潜在的子网地址中,第1个子网号(子网号0)可能与类网络号混淆,所以不应该被使用。例如,如果B类网络地址为 172.16.0.0,那么子网号0的子网地址为 172.16.0.0,这与子网划分之前的B类网络地址(172.16.0.0)相同。同样,对于最后一个子 网号(全1子网号),它的子网广播地址(172.16.255.255)与划分子网前的网络广播地址 (172.16.255.255)相同,也不应该被使用。因此,在计算子网数量时,假定子网部分占n位, 则划分出的子网数量为 2n-2 个,这里去掉了子网部分为全0和全1的两个子网号。
通过子网划分之后,属于同一网络地址下的两个主机地址 172.69.100.37 和 172.69.101.38(第3字节用作子网号)已处在不同的逻辑子网上,所以不能进行直接通信,子 网间的通信必须借助于路由器提供的路由功能。
如果给定了一个 IP 地址,能否容易地计算出所对应的网络地址呢?这一点是非常重要 的,当路由器在转发网络层的 IP 分组时,首先要从 IP 分组的目的 IP 地址中得到目的网络地 址,再根据目的网络地址来查找路由表实现分组的转发。
在没有划分子网的情况下,已知一个 IP 地址找出其网络地址的方法之一就是首先找出这个 地址所属的类,根据所属类,计算出网络号和主机号,对应的主机号置全0,就得到网络地址。如 给定 IP 地址是 140.68.10.22,那么可以知道它是一个 B 类地址,B 类地址网络号占 2 个字节,所 以该网络号为 140.68,主机号所占的 2 个字节置全0,得到相应的网络地址为140.68.0.0。
现在,对于有子网划分的情况,如何确定一个 IP 地址的子网地址呢?换言之,如何确定 IP 地址中的网络部分(包括子网部分)和主机部分?更一般地,区分 IP 地址中网络部分(包括子 网部分)和主机部分的另一种方法就是采用子网掩码。
如图 3-4 所示,子网掩码是一个 32 bit 的二进制数,子网掩码中的各位分别与 IP 地址中的 各位一一对应。如果 IP 地址中的某一位对应的子网掩码位为 1,那么该位就属于地址的网络 部分或子网部分;相反,如果 IP 地址中的某一位对应的子网掩码位为0,那么该位就属于地址 的主机部分。由此可见,子网掩码实际上代替了传统的地址类别来决定一个位是否属于地址 的网络或主机部分。通过 IP 地址和子网掩码的结合,管理员可以更加灵活地配置网络地址。
如图 3-5 所示为通过子网掩码计算子网地址的一个例子。首先把点分十进制表示的 IP 地址和子网掩码转换为二进制表示,再对二进制数进行按位的“与”操作,最后再把二进制表 示的子网地址转换成点分十进制表示。该图中已知 IP 地址为 172.69.11.20,子网掩码为 255.255.255.0,计算得到的子网地址为 172.69.11.0。
子网掩码除了点分十进制表示之外,有时也使用一种“斜杠”的格式表示,斜杠后面的数字表示子网掩码中1的个数。
例如,172.69.11.20/16 表示 IP 地址 172.69.11.20 的网络部分占 16 bit,另外的 16 bit 为 主机部分,子网掩码为 255.255.0.0。172.69.11.20/24 则表示 IP 地址 172.69.11.20 的网络和子网部分共占 24 bit,另外的 8 bit 为主机部分,对应的子网掩码为 255.255.255.0。在此,B类地址的 16 bit 主机部分中有 8 bit 用于划分子网。
在划分子网时,根据划分出的各个子网的子网掩码值的相同与否,可以分成定长子网掩码和变长子网掩码两种方法。下面分别进行介绍。
所谓定长子网掩码,是指划分出的各个子网的子网掩码值都是相同的。在此,“定长”的含义是指子网掩码中1的个数是相同的,即子网掩码中连续1的长度是一定的。
采用定长子网掩码划分子网,一般需要以下几个步骤:
1)确定需要划分的子网数量。
2)确定被划分网络地址主机部分的位数。
3)根据子网数量,确定子网部分所需的位数。假定需要划分的子网数量为m,则所需的
位数n为满足不等式2n≥m+2时的最小值。
4)计算子网掩码。根据子网部分的位数,确定子网掩码值。把网络部分和子网部分的位
设为全1,剩下主机部分的位设全0,得到32位的子网掩码。
5)确定每一个子网的地址范围。子网掩码确定之后,根据主机部分所占的位数,确定每
一个子网的地址范围。
【例 3-4】某机构分到一个 C 类地址 200.68.10.0, 该机构需要划分6个子网。试划分子网,计算子网地址、子网掩码及每个子网中的主机地址范围。
1)需要划分的子网数量是6。
2)C 类地址中网络部分占24 bit,主机部分占8 bit。
3)子网部分所占的位数n为满足不等式 2n≥6+2 时的最小值。得到n为3,即子网部分占3位。
4)子网掩码中有 24+3 =27 个连续的 1 和 8-3=5 个连续的 0。即
11111111 11111111 11111111 11100000
用点分十进制表示为 255.255.255,224。
5)总的子网地址如表 3-5 所示。
例 3-4 的总的子网地址 | ||||
子网地址 | 第1字节 | 第2字节 | 第3字节 | 第4字节 |
200.68.10.0 | 11001000 | 01000100 | 00001010 | 00000000 |
200.68.10.32 | 00100000 | |||
200.68.10.64 | 01000000 | |||
200.68.10.96 | 01100000 | |||
200.68.10.128 | 10000000 | |||
200.68.10.160 | 10100000 | |||
200.68.10.192 | 11000000 | |||
200.68.10.224 | 11100000 |
例3-4的子网地址、子网掩码和主机地址范围 | ||
子网地址 | 子网掩码 | 主机地址范围 |
200.68.10.32 | 255.255.255.224 | 200.68.10.33~200.68.10.62 |
200.68.10.64 | 200.68.10.65~200.68.10.94 | |
200.68.10.96 | 200.68.10.97~200.68.10.126 | |
200.68.10.128 | 200.68.10.129~200.68.10.158 | |
200.68.10.160 | 200.68.10.161~200.68.10.190 | |
200.68.10.192 | 200.68.10.193~200.68.10.222 |
根据上面定长子网掩码的划分方法,得到的各个子网的子网掩码都是相同的。定长子网 掩码一般适合于这样的场合:有多个物理网络(网段),各个物理网络(网段)需要的 IP 地址数 相当。另外,物理网络(网段)中的主机数越多,则划分出的子网数量就越少。
现在考虑如图 3-6a 所示的情况。假定某机构已经分到一个 C 类地址 200.69.11.0,需要 划分 3 个子网,每个子网包含的主机数分别为 60、14 和 14。另外,路由器 A 和 B、B 和 C 之间 需要 2 个通过点对点链路连接(即 2 个 IP 地址)的子网。根据上面的定长子网掩码划分方法, 共需要划分 5 个子网,子网部分需要 3 bit,主机部分占 5 bit,这样每个子网最多能够包含 30 台 主机,不能满足其中一个子网需要 60 台主机的要求。相反,要使子网能够容纳 60 台主机,即 主机部分就要占 6 bit,子网部分还剩下 2 bit,那么只能划分 2 个子网(不考虑启用子网号0), 也不能满足划分 5 个子网的要求。所以,采用定长子网掩码划分方法,不能解决这个子网划分 问题。为什么会出现这种情况呢?一个包含 254 个主机地址的 C 类地址却不能给总数只有 60+14+14+2+2=92 的主机分配地址。现在来仔细分析一下上面的划分过程。实际上,即 使只有一个子网包括 60 台主机,但划分出的各个子网却都包含同样的主机数,造成大量地址 的浪费。这样,一方面一个子网最多只能包含 30 台主机而不能满足需要 60 台主机的要求,另 一方面,有两个子网只有 14 台主机,甚至2 台主机,却也要分配 30 个地址,这就造成大量地址 的浪费。能否根据每个物理网络(网段)实际的主机数量来确定划分子网主机部分的位数呢? 答案是肯定的,但是这样得到的每个物理网络(网段)的子网掩码的长度是不相等的,即所谓 的变长子网掩码。
变长子网掩码允许以每个物理网络(网段)为基础来选择子网部分,一旦选定了某种子网 划分方法,则该网络上的所有设备都必须遵守。其优点在于:一个机构能够混用大型和小型网 络,能够更高效地利用 IP 地址空间。
如图 3-6a 所示网络中变长子网掩码的划分步骤如下:
1)按每个子网所含主机地址数从小到大排列,得到 2、2、14、14 和 60。
2)计算每个子网所需主机部分位数,分别得到2、2、4、4和6。
3)对主机部分位数以从小到大的顺序进行编码、首先对所含主机部分位数为2的子网号进行编码,在此,忽略子网号为0的编码,得到如表3-7所示编码。
表3-7 主机号占2位的子网号编码 | ||
网络号 | 子网号 | 主机号 |
200.69.11 | 000001 | hh |
000010 | hh | |
已用地址 | 0000hh | hh |
在已用地址的计算中,主机部分所占的位数以下一个子网所需的主机部分位数为标准,如此处的4 bit即为下一个子网所需的主机部分位数。得到子网的编码为0000,即该子网号就是在主机号占4 bit的子网编码中已被使用的地址。如果采用了已使用地址作为子网号,则可能出现不同的子网中产生相同的IP地址,导致路由器无法正确转发IP分组到目的地址。 例如,000011(子网号)+01(主机号)的IP,与0000(子网号)+1101(主机号)的IP相同。IP分组中不含子网掩码,路由器转发IP分组时也不会考虑子网掩码(即路由器不会考虑子网划分),所以不同子网中出现相同IP时,路由器转发IP分组会出错。
表3-8 主机号占4位的子网号编码 | ||
网络号 | 子网号 | 主机号 |
200.69.11 | 0000 | hhhh |
0001 | hhhh | |
0010 | hhhh | |
已用地址 | 00hh | hhhh |
表3-9 主机号占6位的子网号编码 | ||
网络号 | 子网号 | 主机号 |
200.69.11 | 00 | hhhhhh |
01 | hhhhhh |
表3-10 划分得到的子网地址和子网掩码 | |||
主机数 | 子网地址 | 子网掩码 | 子网号 |
2 | 200.69.11.4 | 255.255.255.252(/30) | 000001 |
2 | 200.69.11.8 | 255.255.255.252(/30) | 000010 |
14 | 200.69.11.16 | 255.255.255.240(/28) | 0001 |
14 | 200.69.11.32 | 255.255.255.240(/28) | 0010 |
60 | 200.69.11.64 | 255.255.255.192(/26) | 01 |
假如把上表第4行的子网号稍作修改,得到划分的子网如表3-11所示。从子网号的编码来看,似乎并没有什么问题。现仔细分析一下,这样的变长子网掩码划分是否合理?有没有二义性呢?
表3-11 一种变长子网掩码划分方案 | ||
子网地址 | 子网掩码 | 子网号 |
200.69.11.4 | 255.255.255.252(/30) | 000001 |
200.69.11.8 | 255.255.255.252(/30) | 000010 |
200.69.11.16 | 255.255.255.240(/28) | 0001 |
200.69.11.96 | 255.255.255.240(/28) | 0110 |
200.69.11.64 | 255.255.255.192(/26) | 01 |
现在,假定有一个IP地址200.69.11.100,采用子网掩码255.255.255.192,得到的子网地址为:200.69.11.64。若采用子网掩码255.255.255.240,得到的子网地址为:200.69.11.96。即一个地址采用不同的子网掩码时与两个子网地址相匹配,出现二义性。所以如表3-10所示的子网掩码划分就不合理,必须要避免。
// 判断ip属于哪类网络(A、B、C、D、E)
public static string IPv4AddressTypeString(string ip)
{
int type = IPv4AddressType(ip);
string s = "unknow";
switch(type)
{
case 0: s = "A"; break;
case 1: s = "B"; break;
case 2: s = "C"; break;
case 3: s = "D"; break;
case 4: s = "E"; break;
}
return s;
}
// 判断ip属于哪类网络(A、B、C、D、E)
public static int IPv4AddressType(string ip)
{
//仅判断第一个字节的前几个bit位
string[] parts = ip.Split(new char[] { '.' });
int i = byte.Parse(parts[0]);
//判断第1位是否为 0
bool isA = (i >> 7 == 0);
if (isA) return 0;
//判断前2位是否为 10
bool isB = (i >> 6 == 2);
if (isB) return 1;
//判断前3位是否为 110
bool isC = (i >> 5 == 6);
if (isC) return 2;
//判断前4位是否为 1110
bool isD = (i >> 4 == 14);
if (isD) return 3;
//判断前4位是否为 1111
bool isE = (i >> 4 == 15);
if (isE) return 4;
//未知类别 -1
return -1;
}
在IP层传输的分组叫做IP分组(Packet)。如图3-7所示为IP分组的格式,由首部和数据两部分组成。IP分组首部中包含选项字段,所以它是可变长的,基本首部的长度为20B,包含选项的最大长度为60B。下面简单地介绍各个字段的含义。
图3-8 服务类型 | |||||||
8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
优 | 先 | 级 | D | T | R | C | 未使用 |
实际中,不同的应用有不同的服务质量要求,体现在网络层的IP分组有不同的服务类型,如 Telnet 和 Rlogin 应用要求最小的传输时延,FTP应用要求最大的吞吐量,SNMP和路由协议要求最高的可靠性,NNTP要求最小的费用等。这样,当路由器转发IP分组时,可根据服务类型进行路由选择。但遗憾的是,大多数的TCP/IP实现中并不支持服务类型,这些位都置为0,路由器也都忽略该字段。20世纪90年代后期,IETF重新定义了该字段,以适应一系列的有差别服务。
表3-17 协议字段值与高层协议的对应关系 | |
值 | 协议 |
1 | ICMP |
2 | IGMP |
6 | TCP |
17 | UDP |
50 | ESP(IPSec) |
51 | AH(IPSec) |
89 | OSPF |
选项是IP分组的可选部分,可用于网络的控制和测试。但是选项处理作为IP协议的组成部分,在所有的IP协议实现中都是不可缺少的。主要包括以下3种类型的选项:
1)记录路由。记录路由就是记录下IP分组从源站到目的站所经过路径上各个路由器的IP地址。记录地址的区域大小是由源站预先分配并初始化的,最多可记录9个路由器的IP地址。如果预先分配的区域不足以记录下全部路径,那么IP协议将放弃记录余下的地址。此外,只有在源站和目的站双方都同意的情况下,记录路由选项中的各个IP地址才能得到处理,该选项才是有效的。
2)源路由。源路由是指传送IP分组的路由由源站指定,而不是由IP协议通过路由表确定的。源路由选项分为两类:一类是严格源路由,另一类是不严格源路由。
所谓严格源路由,就是由发送 IP 分组的源站给出一条完整的路径,即规定该分组必须依次所经过的每一个路由器的 IP 地址。换言之,若分组经过了一个路由器,其 IP 地址未在严格源路由选项中,则该路由器将丢弃此分组并发出差错报文。若分组到达目的站时仍有严格源路由选项中未经过的路由器,则目的站也将该分组丢弃并发出差错报文。严格源路由是一个很有用的选项,可以用于发送站选择一条具有特定服务类型(最小时延,最大吞吐量或高可靠性)的路由发送分组,或者用于测试某特定网络的性能。
不严格源路由与严格源路由相似,区别在于不严格源路由并未给出该分组完整的路径信息,只是给出必须通过的路由器 IP 地址,分组还可通过其他的路由器传输。
3)时间戳。时间戳选项用来记录 IP 分组经过每一个路由器时的时间。时间戳中的时间采用环球时间表示,以毫秒为单位。通过时间戳能够估计分组从一个路由器到另一个路由器所需的时间,可用于分析网络的吞吐量,拥塞情况、负载情况等。由于各路由器中的时钟并不严格同步,所以时间戳只是一种大致的参考值。此外,在选择时间戳选项时,可以设置成时间和地址同时记录,缺省为只记录时间。
实际上,网络层的每一个 IP 分组都需要通过底层的物理网络进行传输,当分组通过不同的物理网络时,如何保证传输的高效率呢?因此,IP 协议需要解决分组大小与不同物理网络帧数据大小的匹配问题。
任何一个物理网络的数据链路层都有其自己的帧格式,在帧格式中规定了一个物理帧中允许传输数据量的上限值,这个上限值称作网络最大传输单元(MTU,Maximum Transfer Unit)。例如,以太网限制传输 1500B 的数据,而 FDDI 允许每帧 4352B 的数据。如表3-18 所示为不 同物理网络的 MTU 值。
当 IP 分组通过不同的物理网络时,会受到不同网络 MTU 值的限制,如果把分组大小限制在最小网络的 MTU 值,那么经过大 MTU 值的网络时,这时传输是不经济的。相反,如果一个分组的大小超过网络的 MTU 值,就不能在该网络中传输。
表3-18 不同网络的 MTU 值 | |
物理网络 | MTU/B |
超级通道(Hyperchannel) | 65535 |
令牌环(16 Mbps) | 17914 |
令牌环(4 Mbps) | 4464 |
FDDI | 4352 |
以太网 | 1500 |
X.25 | 576 |
PPP | 296 |
IP 规定的分组的最大长度为 65535B,远大于大多数物理网络的 MTU 值。IP 在对待分 组大小时,采用以下的处理方式:选择一个方便的初始分组大小,同时提供了这样一种机制,当 一个较长的 IP 分组经过一个 MTU 值较小的物理网络时,把长分组分割成较小的分组进行传 输,这个划分过程叫做分片,划分得到的每一部分也叫做分片。IP 规定分片可以在任何需要 的中间路由器上进行,而重组仅在目的站进行。这种方案的优点是:这些分片可以走不同的路 径,减少路由器中保存的信息及路由器的工作量。
如图 3-9 所示,路由器 R1 和 R2 连接了具有不同 MTU 值的 3 个网络,两台主机A和B直 接连接到 MTU 值为 1500B 的网络1和网络3上,每台主机都可以产生和发送最多1500B的 分组。当路由器 R1 从主机 A 接收分组转发到 MTU 值为 620B 的网络2时,必须进行分片。同 样,当路由器 R2 从主机 B 接收分组转发到 MTU 值为 620B 的网络2时,也要进行分片。
分片意味着把原始分组中的数据分成几个部分,每片的格式都与原始分组相同,每个分 片都包含一个分片首部,除了标志字段中的一个位外,它基本上复制了原始分组的首部,如图 3-10 所示,给出了如图3-9所示互联网中路由器 R1 上进行分片的例子。分片的总长度等于网 络2的 MTU 值。
下面介绍在 IP 分组首部中与分片有关的字段。
在分片重组时,目的站的IP根据分片中相关字段(总长度,分片偏移及标志)以及相同的标识、协议号、源IP地址和目的IP地址,并且在一定的时间内分片全部到齐后,将其重新组装成完整的原始分组。IP协议将满足上述条件的分片按分片偏移顺序排队,且只保留第1个分片首部,删除其余分片的首部,组装成一个完整的原始IP分组,并重新计算分组总长度,填入IP分组首部的总长度字段。最后将重组后的IP分组按协议字段中的协议号提交给上层协议。
【例 3-6】图 3-11 给出了具有不同 MTU 值的一个互联网的拓扑结构,主机 A 向主机 B发送一个满足最大 MTU 值的 IP 分组1,当该分组通过网络2和网络3时发生分片,表3-19 给出了分组1经过此网络时的分片情况,给出了分片总长度,标识,标志和分片偏移的关系。