目录
????????互联网网络层采用的设计思路是这样的:网络层要设计得尽量简单,向其上层只提供简单灵活的、无连接的、尽最大努力交付的数据报服务。
????????在网络层在发送 IP 数据报时不需要先建立连接,每一个 IP 数据报都独立发送,与其前后的 数据报无关(不进行编号),且网络层不提供服务质量的承诺。
????????所以,网络层主要提供两种服务:数据包(IP数据报)路由和转发。该层传输的主要是IP数据报,所以本文主要介绍IP数据报的相关知识点。
????????网络层使用的一些协议:
????????网际协议 IP(Internet Protocol) 是 TCP/IP 体系中两个最主要的协议之一,与协议 IP 配套使用的还有三个协议:
????????下图画出了这三个协议和网际协议 IP 的关系:
????????在这网路层中,ARP 画在最下面 ,因为 IP 经常要使用这个协议。ICMP 和 IGMP 画在这一层的上部,因为它们要使用协议 IP。
????????网络中的一些中间连接设备:
????????我们都知道,要使整个网络互相连接起来,就需要使用到一些中间连接设备。根据中间设备所在的层次,一般有以下四种不同的中间设备:
????????下图是数据在网络中传输的一个简单释义图,图中给出了不同连接设备在各层中的位置:
????????一个连接在互联网上的设备,如果没有 IP 地址,就无法和网上的其他设备进行通信。
????????所以,连接到互联网上的每一台主机(或路由器),都必须有一个 IP 地址,该地址是一个 32 位的标识符,在全世界范围内都是唯一的,IP 地址的作用就是用来在互联网中进行寻址。
????????对主机或路由器来说,IP 地址都是 32 位的二进制代码。为了提高可读性,常常每隔 8 位就在 IP 地址中插入一个空格(机器中并没有这样的空格),同时,为了便于书写和记忆,常使用等效的十进制数字表示,并且在每段数字之间加上一个小数点。如下图所示:
????????IP 地址不但标志了一个主机(或路由器),而且还标志了此设备所连接的网络。因此,IP 地址采用两级结构,由两个字段组成:
????????IP 地址 = 网络号 + 主机号
????????下图给出了 IP 地址中的网络号和主机号的位置。具体的规定是:IP 地址中的前 n 位是网络号,而 IP 地址中后面的 (32 - n) 位是主机号。
????????现在的问题是,当我们看到一个IP 地址时,怎样知道它的网络号的位数 n 是多少呢?
????????在互联网发展早期,采用的是分类的 IP 地址,该地址分类的方法非常简单。A 类 (n=8),B 类 (n=16) 和 C 类 (n=24),这些地址都是单播地址(一对一通信),是最常用的。D 类是多播地址,E 类是保留地址,如下图所示:
????????32 位的 IP 地址空间共有 ?个地址,即 4294967296,接近 43 亿。A 类地址空间共有 个地址(A类地址以 0 开头),占整个 IP 地址空间的 50%。B 类地址空间共有 ?个地址,占整个 IP 地址空间的 25%。整个 C 类地址空间共有 个地址,占整个 IP 地址的 12.5%。D 类和 E类地址各占整个 IP 地址的 6.25%。//分类的 IP 地址中,A 类地址占比最多
????????需要注意的是,此分类方法目前已不再使用,主要原因在于,随着互联网的发展该分类方式下 IP 地址的数量已经不够用了,所以,目前使用得最多的是无分类编址方法。接下来,对这一编址方法进行介绍。
????????这种编址方法的全名是无分类域间路由选择?CIDR(Classless Inter-DomainRouting),它的要点有三个,分别为:网络前缀、地址块和地址掩码。
????????网络前缀:
????????CIDR 把网络号改称为“网络前缀”,剩下的后面部分仍然是主机号,用来指明主机。所以,CIDR 方式下,IP 地址结构为:网络前缀 + 主机号。此处,网络前缀的位数 n 不是固定的数,而是可以在 0~32 之间选取任意的值。
????????CIDR 使用“斜线记法”(slash notation),即在 IP 地址后面加上斜线 “/”,斜线后面是网络前缀所占的位数。例如,CIDR 表示的一个 IP 地址 128.14.35.7/20,二进制 IP 地址的前 20 位是网络前缀(相当于原来的网络号),剩下后面 12 位是主机号。
? ? ? ? 如何获取地址块中的最小地址和最大地址?以及如何计算网络前缀?
????????CIDR 把网络前缀都相同的所有连续的 IP 地址组成一个“CIDR 地址块”。CIDR 地址块包含的 IP 地址数目,取决于网络前缀的位数。
????????例如,已知 IP 地址 128.14.35.7/20 是某 CIDR 地址块中的一个地址,现在把它写成二进制表示形式,其中的前 20 位是网络前缀,而前缀后面的 12 位是主机号:
????????128.14.35.7/20 = 10000000 00001110 0010001100000111
????????可以很方便地得出这个地址所在的地址块中的最小地址和最大地址:
最小地址 | 128.14.32.0 | 10000000 00001110 00100000 00000000 |
最大地址 | 128.14.47.255 | 10000000 00001110 00101111 11111111 |
????????这个地址块的 IP 地址共有 ?个,扣除主机号为全 0 和全 1 的地址后,可指派的地址数是 - 2 个。
????????为什么需要地址掩码?
????????CIDR 使用斜线记法来标记网络前缀的数值。但是计算机看不见斜线记法,所以需要使用 32 位的地址掩码(address mask)来辅助计算机从 IP 地址中算出网络地址。
????????地址掩码又称为子网掩码,由一连串 1?和接着的一连串 0 组成,而 1 的个数就是网络前缀的长度。在 CIDR 记法中,斜线后面的数字就是地址掩码中 1 的个数。
????????例如,/20 地址块的地址掩码是:
????????11111111 11111111 11110000 00000000(20个连续的 1 和接着的 12 个连续的 0)。
????????这个掩码用 CIDR 记法表示就是 255.255.240.0/20。
????????下表给出了最常用的 CIDR 地址块:
网络前缀长度 | 点分十进制 | 包含的地址数 | 相当于包含分类的网络数 |
/13 | 255.248.0.0 | 512?K | 8?个?B?类或?2048?个?C?类 |
/14 | 255.252.0.0 | 256?K | 4?个?B?类或?1024?个?C?类 |
/15 | 255.254.0.0 | 128?K | 2?个?B?类或?512?个?C?类 |
/16 | 255.255.0.0 | 64?K | 1?个?B?类或?256?个?C?类 |
/17 | 255.255.128.0 | 32?K | 128?个?C?类 |
/18 | 255.255.192.0 | 16?K | 64?个?C?类 |
/19 | 255.255.224.0 | 8?K | 32?个?C?类 |
/20 | 255.255.240.0 | 4?K | 16?个?C?类 |
/21 | 255.255.248.0 | 2?K | 8?个??C?类 |
/22 | 255.255.252.0 | 1?K | 4?个?C?类 |
/23 | 255.255.254.0 | 512 | 2?个?C?类 |
/24 | 255.255.255.0 | 256 | 1?个?C?类 |
/25 | 255.255.255.128 | 128 | 1/2?个?C?类 |
/26 | 255.255.255.192 | 64 | 1/4?个?C?类 |
/27 | 255.255.255.224 | 32 | 1/8?个?C?类 |
????????从表格中可看出,网络前缀越短,地址块所包含的地址数就越多。
????????需要注意的是,在同一个局域网上的主机 IP 地址中的网络前缀必须是相同的,具有不同网络前缀的局域网必须使用路由器进行互连。//不同网段需要使用路由器进行连接
????????这里顺便提一下,计算机网络中还有一些特殊的 IP 地址,这些地址具有特定的用途,不用于一般的主机标识。以下是一些常见的特殊 IP 地址:
????????0.0.0.0: 表示"未指定"或"任意"地址。在一些上下文中,它可以表示主机的未知地址或用作默认路由。
????????127.0.0.1: 表示本地主机(loopback)地址,通常用于测试网络和本地服务。任何发往这个地址的数据都会在本地回环,不离开主机。
????????255.255.255.255: 表示广播地址,用于向本地网络中的所有主机广播信息。
????????10.0.0.0 到 10.255.255.255、172.16.0.0 到 172.31.255.255、192.168.0.0 到 192.168.255.255: 这些地址范围是私有 IP 地址,通常在内部网络中使用,不会在公共互联网上直接路由。
????????169.254.0.0 到 169.254.255.255: 表示自动配置的 IP 地址(APIPA,Automatic Private IP Addressing),当主机无法获取 DHCP 分配的地址时,它可能会在本地网络上选择一个未被使用的地址。????????
????????我们知道,IP 地址与 MAC 地址都是用来在网络中进行寻址,那么这两个地址到底有什么区别呢?
????????MAC 地址一般固化在网卡上的 ROM 中,因此常常将 MAC 地址称为硬件地址或物理地址。物理地址的反义词就是虚拟地址、软件地址或逻辑地址,IP 地址就属于这类地址,因为 IP 地址是用软件实现的。//网络层寻址和链路层寻址
????????下图说明了这两种地址的区别:
????????如图,IP 地址放在 IP 数据报的首部,而 MAC 地址则放在 MAC 的首部。在网络层和网络层以上使用的是 IP 地址,而数据链路层及以下使用的是 MAC 地址。当 IP 数据报插入到数据链路层的 MAC 以后,整个的 IP 数据报就成为 MAC 的数据,因而在数据链路层看不见数据报的 IP 地址。//网络层和网络层往上使用IP地址,链路层使用MAC地址
? ? ? ? 如下图,特别强调了 IP 地址与 MAC 地址所使用的位置的不同:
????????在实际应用中,如果已经知道了一个机器的 IP 地址,那么怎样找出其相应的 MAC 地址呢?
? ? ? ? 如果要解决这个问题,就需要用到地址解析协议ARP。ARP 用于解决同一个局域网上的主机或路由器的 IP 地址和 MAC 地址的映射问题。
????????下图,展示了协议 ARP 的作用://所谓的地址解析,就是通过IP地址找到MAC地址
? ? ? ? 那么 ARP是如何完成 IP 地址到 MAC 地址的映射的呢?
? ? ? ? 我们都知道,每一台主机都会设有一个 ARP 高速缓存(ARP cache),里面会存储本局域网上的各主机和路由器的 IP 地址到 MAC 地址的映射表。
????????当主机 A 要向本局域网上的某台主机 B 发送 IP 数据报时,就先在 ARP 高速缓存中查找有无主机 B 的 IP 地址。如有,就在 ARP 高速缓存中查出其对应的 MAC 地址,再把这个 MAC 地址写入 MAC 帧,然后通过局域网把该 MAC 帧发往此 MAC 地址。
????????但也有可能查不到主机 B 的 IP 地址。在这种情况下,主机 A 就自动运行 ARP,然后按以下步骤找出主机 B 的 MAC 地址:
????????(1)ARP 进程在本局域网上广播发送一个 ARP 请求报文,主要内容是:“我的 IP 地址是 209.0.0.5,MAC 地址是 00-00-CO-15-AD-18。我想知道 IP 地址为 209.0.0.6 的主机的 MAC 地址。”//广播报文
????????(2)在本局域网上的所有主机上运行的 ARP 进程都将收到此 ARP 的请求报文。
????????(3)主机 B 的 IP 地址与 ARP 请求报文中要查询的 IP 地址一致,就会向主机 A 发送 ARP 响应报文,主要内容是:“我的 IP 地址是 209.0.0.6,我的 MAC 地址是 08-00-2B-00-EE-0A”。由于其余所有主机的 IP 地址都与 ARP 请求报文中要查询的 IP 地址不一致,因此都不会理睬这个 ARP 请求报文。//响应ARP报文,此时主机B也会缓存主机A的IP-MAC映射
????????(4)主机 A 收到主机 B 的 ARP 响应报文后,就在其 ARP 高速缓存中写入主机 B 的 IP 地址到 MAC 地址的映射。//写入ARP缓存映射表
????????上述的整个流程图示如下:
????????注意:虽然 ARP 请求报文是广播发送的,但 ARP 响应报文是普通的单播,即从一个源地址发送到一个目的地址。
????????此外,ARP 对保存在高速缓存中的每一个映射地址项目都设置生存时间(例如,10~20分钟),凡超过生存时间的项目就从高速缓存中删除掉。//定时更新
????????在协议 IP 的标准中,描述首部格式的宽度是 32 位(即 4 字节)。下图是 IP 数据报的完整格式:
????????从图中可看出,一个 IP 数据报由首部和数据两部分组成。首部的前一部分长度是固定的,共 20 字节,是所有 IP 数据报必须具有的。在首部的固定部分的后面是一些可选字段,其长度是可变的。
????????下面是首部各字段的意义的具体介绍:
????????(1)版本:占 4 位,指协议 IP 的版本,通信双方使用的协议 IP 的版本必须一致。如,协议 IP 版本号为 4,即指 IPv4。
????????(2)首部长度:占 4 位,可表示的最大十进制数值是 15。当 IP 报文的首部长度不是 4 字节的整数倍时,必须利用最后的填充字段加以填充。最常用的首部长度是 20 字节,不使用任何可选字段。
????????(3)区分服务:占 8 位,用来获得更好的服务。只有在使用区分服务时,这个字段才起作用。在一般的情况下都不使用这个字段。
????????(4)总长度:指首部和数据之和的长度,单位为字节。总长度字段为 16 位,因此数据报的最大长度为 ?= 65535 字节。//大概64K
????????但是,实际上传送 64K 的数据报在现实中是极少遇到的。这是因为在 IP 层下面的每一种数据链路层协议都规定了一个数据中的数据字段的最大长度,即最大传送单元 MTU(Maximum Transfer Unit),最常用的以太网规定其 MTU 值是1500 字节,若传送的数据报长度超过 MTU 值,就必须把数据报进行分片处理。
????????虽然 IP 数据报越长,会使得传输效率越高(首部长度占数据报总长度的比例就越小),但 IP 数据报越短,路由器转发的速度就越快。因此,协议 IP 规定,在互联网中所有的主机和路由器必须能够接受长度不超过 576 字节的数据报。
????????(5)标识:占 16 位。IP 软件在存储器中维持一个计数器,每产生一个数据报,计数器就加 1,并将此值赋给标识字段。当数据报长度超过 MTU 必须分片时,这个标识字段就被复制到所有的分片数据报的标识字段中。相同的标识使分片后的数据报最后能正确地重装为原来的数据报。
????????注意:标识并不是序号,因为 IP 是无连接服务,数据报不存在按序接收的问题。
????????(6)标志:占 3 位,但目前只有两位有意义。
????????(7)片偏移:占 13 位。片偏移指出:较长的报文在分片后,某片在原分组中的相对位置。片偏移以 8 个字节为偏移单位。这就是说,除最后一个数据报分片外,其他每个分片的长度一定是 8 字节(64位)的整数倍。
????????(8)生存时间:占 8 位,英文缩写是 TTL(Time To Live),表明数据报在网络中的寿命。由发出的源点设置这个字段,其目的是防止无法交付的数据报无限制地在互联网中转发。
????????TTL 最初以秒作为值的单位。但随着技术的发展,路由器处理数据报的时间已经远远小于 1秒,所以就把 TTL 字段的功能改为“跳数限制”,用来指明数据报在互联网中至多可经过多少个路由器。
????????(9)协议:占 8 位,指出此数据报携带的数据使用何种协议,以便使目的主机的 IP 层知道应将数据部分上交给哪个协议进行处理。
????????常用的一些协议和相应的协议字段值如下:
????????(10)首部检验和:占 16 位。这个字段用来检验数据报的首部,但不包括数据部分。如果首部检验通过,接收方就保留这个数据报,否则即认为出错,并将此数据报丢弃。
????????(11)源地址:占 32 位。发送 IP 数据报的主机的 IP 地址。
????????(12)目的地址:占 32 位。接收 IP 数据报的主机的 IP 地址。
????????(13)IP 数据报首部的可变部分:该部分是一个选项字段,用来支持排错、测量以及安全等措施,内容很丰富。可变部分虽然增加了 IP 数据报的功能,但同时也增加了每一个路由器处理数据报的开销,所以,实际上这些选项很少被使用。目前,很多路由器都不考虑 IP 首部的选项字段,因此新的 IP 版 本 IPV6 就把 IP 数据报的首部长度做成固定的了。
????????至此,全文结束。