计算机网络 – 网络层(上)
两种服务
在计算机网络领域,网络层应该向运输层提供怎样的服务(“面向连接”还是“无连接”)曾引起了长期的争论。
一种观点认为,应该让计算机网络模仿电信网络,使用面向连接的通信方式。通信之前先建立虚电路(Virtual Circuit),以保证双方通信所需的一切网络资源。(这里的虚网络表示这只是一条逻辑上的连接,分组都沿着这条逻辑连接按照存储转发方式传送,而并不是真正建立了一条物理连接;与之相对的,电路交换的电话通信是先建立一条真正的连接具体可参见概述部分介绍
另一种观点认为,应该让网络层向上只提供简单灵活的、无连接的、尽最大努力交付的数据报服务。采用这种设计思路, 则网络的造价大大降低,运行方式灵活,能够适应多种应用。且每个分组独立选择路由进行转发。
网际协议 IP
网际协议 IP 是 TCP/IP 体系中两个最主要的协议之一。与 IP 协议配套使用的还有三个协议:
地址解析协议 ARP(Address Resolution Protocol)
网际控制报文协议 ICMP(Internet Control Message Protocol)
网际组管理协议 IGMP(Internet Group Management Protocol)
虚拟互联网络
所谓虚拟互连网络也就是逻辑互连网络,它的意思就是互连起来的各种物理网络的异构性本来是客观存在的,但是我们利用 IP 协议就可以使这些性能各异的网络从用户看起来好像是一个统一的网络。
如果在这种覆盖全球的 IP 网的上层使用 TCP 协议,那么就是现在的互联网 (Internet)。
分类的 IP 地址
IP 地址就是给每个连接在互联网上的主机(或路由器)分配一个在全世界范围是唯一的 32 位的标识符。
IP 地址的编址方法
分类 IP 地址。这是最基本的编址方法,在 1981 年就通过了相应的标准协议。
划分子网。这是对最基本的编址方法的改进,其标准 [RFC 950] 在 1985 年通过。
构成超网。这是比较新的无分类编址方法。1993 年提出后很快就得到推广应用。
分类 IP 地址
IP 地址 ::= {< 网络号 >, < 主机号 >}
一般表示 IP 地址采用点分十进制记法,将每个八位二进制数 (1 byte) 转换为十进制数。
其中 D 类地址为多播地址;E 类地址保留为今后使用。
一般不可用的特殊 IP 地址
网络号
主机号
作为源地址
作为目的地址
代表含义
0
0
可以
不可
在本网络上的本主机(见 6.6 节 DHCP 协议)
0
host-id
可以
不可
在本网络上的某台主机 host-id
全 1
全 1
不可
可以
只在本网络上进行广播(各路由器均不转发)
net-id
全 1
不可
可以
对 net-id 上的所有主机进行广播
127
非全 0 或全 1 的任何数
可以
可以
用作本地软件环回测试之用
IP 地址的一些特点
1、IP 地址实际上是标志一个主机(或路由器)和一条链路的接口。
当一个主机同时连接到两个网络上时,该主机就必须同时具有两个相应的 IP 地址;
由于一个路由器至少应当连接到两个网络,故一个路由器至少应当有两个不同的 IP 地址。
2、用转发器或网桥连接起来的若干个局域网仍为一个网络,因此这些局域网都具有同样的网络号。
3、所有分配到网络号的网络,无论是范围很小的局域网,还是可能覆盖很大地理范围的广域网,都是平等的。
IP 地址与硬件地址
路由转发过程中,路由器仅根据目的站的 IP 地址进行路由选择,IP 数据报首部的内容不变;而 MAC 帧每经过一个路由,都将首部的目的地址和源地址更新为下一个路由(主机)硬件地址和这个路由(主机)硬件地址。
IP 层屏蔽了传输中的细节。
地址解析协议(ARP)
每一个主机都设有一个 ARP 高速缓存 (ARP cache),里面有所在的局域网上的各主机和路由器的 IP 地址到硬件地址的映射表。
< IP address;MAC address;TTL >(TTL: 地址映射有效时间)
当主机 A 欲向本局域网上的某个主机 B 发送 IP 数据报时,就先在其 ARP 高速缓存中查看有无主机 B 的 IP 地址。
如有,就可查出其对应的硬件地址,再将此硬件地址写入 MAC 帧,然后通过局域网将该 MAC 帧发往此硬件地址。
如没有,ARP 进程在本局域网上广播发送一个 ARP 请求分组。收到 ARP 响应分组后,将得到的 IP 地址到硬件地址的映射写入 ARP 高速缓存。
ARP 是解决同一个局域网上的主机或路由器的 IP 地址和硬件地址的映射问题。如果所要找的主机和源主机不在同一个局域网上,那么就要通过 ARP 找到一个位于本局域网上的某个路由器的硬件地址,然后把分组发送给这个路由器,让这个路由器把分组转发给下一个网络。剩下的工作就由下一个网络来做。
IP 数据报的格式
首部前部分(20 字节)是固定长度,是所有 IP 数据报共有的;后面是一些可选字段,其长度可变。
总长度:指首部和数据之和的长度。
标志:最低位 MF=1 表示还有分片;中间位 DF= 0 时允许分片。
片偏移:表示较长的分组在分片后,某片在原分组中的相对位置。片偏移以 8 个字节为单位。
生存时间:记为 TTL(Time To Live),指示数据报在网络中可通过的路由器数的最大值。
协议:指出此数据报携带的数据使用何种协议,以便目的主机的 IP 层将数据部分上交给那个处理过程。
首部检验和:只检验数据报的首部,不检验数据部分。(采用 16 位二进制反码求和算法)
IP 层分组转发的流程
在路由表中,对每一条路由,最主要的是(目的网络地址,下一跳地址)
根据目的网络地址就能确定下一跳路由器,这样做的结果是:
IP 数据报最终一定可以找到目的主机所在目的网络上的路由器(可能要通过多次的间接交付)。
只有到达最后一个路由器时,才试图向目的主机进行直接交付。
特定主机路由
虽然互联网所有的分组转发都是基于目的主机所在的网络,但在大多数情况下都允许有这样的特例,即为特定的目的主机指明一个路由。
默认路由 (default route)
路由器还可采用默认路由以减少路由表所占用的空间和搜索路由表所用的时间。如果一个主机连接在一个小网络上,而这个网络只用一个路由器和互联网连接,那么在这种情况下使用默认路由是非常合适的。
“下一跳”是在下层实现的当路由器收到待转发的数据报,不是将下一跳路由器的 IP 地址填入 IP 数据报,而是送交下层的网络接口软件。网络接口软件使用 ARP 负责将下一跳路由器的 IP 地址转换成硬件地址,并将此硬件地址放在链路层的 MAC 帧的首部,然后根据这个硬件地址找到下一跳路由器。
划分子网和构造超网
划分子网
从 1985 年起在 IP 地址中又增加了一个“子网号字段”(Subnet-ID),使两级的 IP 地址变成为三级的 IP 地址。这种做法叫做划分子网 (subnetting)。
优点
减少了 IP 地址的浪费
使网络的组织更加灵活
更便于维护和管理
子网掩码
子网掩码 (subnet mask)用于找出 IP 地址中的子网部分。子网掩码长度为 32 位(IP 地址的长度):
某位 = 1:IP 地址中的对应位为网络号和子网号
某位 = 0:IP 地址中的对应位为主机号
路由器在和相邻路由器交换路由信息时,必须把自己所在网络(或子网)的子网掩码告诉相邻路由器。路由器的路由表中的每一个项目,除了要给出目的网络地址外,还必须同时给出该网络的子网掩码。
(目的网络地址,子网掩码,下一跳地址)
划分子网情况下的分组转发(1) 从收到的分组的首部提取目的 IP 地址 D。(2) 先用(本网络内部)各网络的子网掩码和 D 逐位相“与”,看是否和相应的网络地址匹配。若匹配,则将分组直接交付。否则就是间接交付,执行 (3)。(3) 若路由表中有目的地址为 D 的特定主机路由,则将分组传送给指明的下一跳路由器;否则,执行 (4)。(4) 对路由表中的每一行,将子网掩码和 D 逐位相“与”。若结果与该行的目的网络地址匹配,则将分组传送给该行指明的下一跳路由器;否则,执行 (5)。(5) 若路由表中有一个默认路由,则将分组传送给路由表中所指明的默认路由器;否则,执行 (6)。(6) 报告转发分组出错。
无分类编制 CIDR(Classless Inter-Domain Routing)
CIDR 使用各种长度的“网络前缀”(network-prefix)来代替分类地址中的网络号和子网号。IP 地址从三级编址(使用子网掩码)又回到了两级编址。
IP 地址 ::= {< 网络前缀 >, < 主机号 >}
CIDR 使用“斜线记法”(slash notation)即在 IP 地址面加上一个斜线“/”,然后写上网络前缀所占的位数(这个数值对应于三级编址中子网掩码中 1 的个数)。例如:220.78.168.0/24。
CIDR 地址块
CIDR 把网络前缀都相同的连续的 IP 地址组成“CIDR 地址块”。
路由聚合 (route aggregation) 或构成超网 (supernetting)
一个 CIDR 地址块可以表示很多地址,这种地址的聚合常称为路由聚合,它使得路由表中的一个项目可以表示很多个(例如上千个)原来传统分类地址的路由。可以更加有效地分配 IPv4 的地址空间,可根据客户的需要分配适当大小的 CIDR 地址块。
最长前缀匹配
使用 CIDR 时,路由表中的每个项目由“网络前缀”和“下一跳地址”组成。在查找路由表时可能会得到不止一个匹配结果。应当从匹配结果中选择具有最长网络前缀的路由:最长前缀匹配 (longest-prefix matching)。
使用二叉线索查找路由表
为了进行更加有效的查找,通常是将无分类编址的路由表存放在一种层次的数据结构中,然后自上而下地按层次进行查找。这里最常用的就是二叉线索 (binary trie)。IP 地址中从左到右的比特值决定了从根结点逐层向下层延伸的路径,而二叉线索中的各个路径就代表路由表中存放的各个地址。