网络层
1. 概述
网络层提供两种服务:面向连接和无连接的传送服务
在互联网中,网络层向上只提供简单灵活的,无连接的,尽最大努力交付的数据报服务,网络层不提供服务质量的承诺;
网络层的两个层面:
- 数据层面:路由器根据转发表,把收到分组从查到的对应接口转发出去
- 控制层面:根据路由选择协议所用的路由算法计算路由,创建路由表
路由器之间传送的信息有以下两大类:
- 转发源主机和目的主机之间所传送的数据
- 传送路由信息
2. 国际协议 IP
国际协议 IP(Internet Protocol)是 TCP/IP 体系中两个最主要的协议之一;与协议 IP 配套使用的还有三个协议:
- 地址解析协议 ARP(Arrdress Resolution Protocol)
- 网际控制报文协议 ICMP (Internet Control Message Protocol)
- 网际组管理协议 IGMP(Internet Group Management Protocol)
将网络互相连接起来需要使用一些中间设备,根据中间设备所在的层次,可以有以下四种不同的中间设备:
- 物理层:转发器(repeater)
- 数据链路层:网桥或桥接器(bridge)以及交换机(switch)
- 网络层:路由器(router)
- 网络层以上:网关(gateway),用网关连接两个不兼容的系统需要在高层进行协议的转换;
2.1. IP 地址分类
主要分为ABC三类:
- A类:子网掩码:255.0.0.0,网络号全为 0 的 IP 地址为本网络,网络号最大(127)的 IP 地址用作本地软件环回测试本主机进程之间的通信使用;
- B类:子网掩码:255.255.0.0
- C类:子网掩码:255.255.255.0
2.2. 无分类编址 CIDR
使用 CIDR 的好处就是可以更加有效地分配 IP 地址空间,根据客户地需求选择适当大小地 CIDR 地址块;
无分类域间路由选择 CIDR(Classless Inter-Domain Routing),要点如下:
-
将网络号改称为“网络前缀”,网络前缀位数 n 不固定,0~32 任意取值;使用斜线记法或称为“CIDR记法”,在 IP 地址后面加入斜线“/”,斜线后面是网络前缀所占的位数;可以看出网络前缀越短的地址块所包含的地址数就越多; -
把网络前缀相同的所有连续的 IP 地址组成一个 “CIDR 地址块”,常使用地址块中的最小地址和网络前缀的位数指名一个地址块;
已知 IP 地址 128.14.35.7/20 是某 CIDR 地址块中的一个地址,现在把它写成二进制表示,前 20 位是网络前缀:128.14.35.7/20 = 10000000 00001110 00100011 00000111
这个地址块的 IP 地址共有 212 - 2个(去掉全1和全0),显然每次计算太麻烦,==常使用地址块中的最小地址和网络前缀的位数指名一个地址块;==即该地址块为:128.14.32.0/20
-
计算机使用 32 位的地址掩码来从 IP 地址迅速计算出网络地址;地址掩码(又称子网掩码)由一连串的 1 和一连串的 0 组成,1 的个数是网络前缀的长度,例如上例中地址掩码是:11111111 11111111 11110000 00000000 = 255.2555.240.0;
根据子网掩码定义可知,早期的分类 IP 地址的子网掩码都是固定的:
- A 类:255.0.0.0
- B 类:255.255.0.0
- C 类:255.255.255.0
把二进制 IP 地址和子网掩码进行按位与(&)运算,即可计算出网络地址:
CIDR 地址中还有三个特殊的地址块:
-
当前缀 n = 32,32 位 IP 地址都是前缀,没有主机号,这其实就是一个 IP 地址,这个特殊的 IP 地址用于主机路由 -
当前缀 n = 31,这个地址块中只有两个 IP 地址,主机号分别为 0 和 1,这个地址块用于 点对点链路 -
当前缀 n = 0,同时 IP 地址也是全 0,即 0.0.0.0/0,这用于默认路由;
一个大的 CIDR 地址块中往往包含很多小的地址块,所以在路由器的转发表中就利用较大的一个 CIDR 地址块来顶替许多较小的地址块,这种方法称为路由聚合(route aggregation)
2.3. IP 地址的特点
- 由网络前缀和主机号组成,是一种分等级的地址结构;分等级的好处是:
- IP 地址管理机构只负责分配网络前缀(第一级),主机号(第二级)由申请单位自行分配,方便了 IP 地址的管理;
- 路由器根据目的主机所连接的网络前缀(即地址块)来转发分组(而不考虑主机号),可以减少转发表所占的存储空间,缩短查找转发表的时间;
- IP 地址是标志一台主机(或路由器)和一条链路的接口;
- 用转发器或交换机连接起来的若干个局域网仍为一个网络,因为它们具有相同的网络前缀;具有不同网络前缀的局域网必须使用路由器进行互连;
- 互联网平等对待每一个 IP 地址;
两个路由器直接相连时,使用了 /31 地址块,专门为点对点链路的两端使用,这种特殊的“网络”一般被称为 无编号网络(unnumbered network) 或 匿名网络(anonymous network)
2.4. Mac 地址与 IP 地址
二者的称呼区别:
- Mac 地址固化在网卡上的 ROM 中,常称为 硬件地址 或 物理地址
- IP 地址常称为 虚拟地址、软件地址 或 逻辑地址
从层次的角度看:
- Mac 地址是数据链路层使用的地址
- IP 地址是网络层和以上各层使用的地址,是一种逻辑地址(IP 地址是由软件实现的)
IP 地址放在 IP 数据报中,MAC 地址放在 MAC 帧的首部。
在发送数据时,数据从高层下到低层,然后才到通信链路上传输。使用 IP 地址的 IP 数据报一旦交给数据链路层,就被封装成为 MAC 帧。MAC 帧在传送时使用的源地址和目的地址都是 MAC 地址,这两个 MAC 地址都写在 MAC 帧的首部中(各占 6 个字节);
连接在通信链路上的站点收到 MAC 帧后,根据 MAC 帧首部中的 MAC 地址决定收下或丢弃;只有剥去 MAC 帧首部和尾部后把 MAC 层的数据上交给网络层后,网络层才能在 IP 数据报中找到源 IP 地址和目的 IP 地址;
- 在 IP 层抽象的互联网只能看到 IP 数据报
- 路由器 R1、R2、R3 都有两个 MAC 地址,因为它同时连接着两个局域网
- 路由器只根据目的站的 IP 地址进行转发,与源站 IP 地址无关
- 在局域网的链路层,只能看见 MAC 帧
2.5. 地址解析协议 ARP
ARP(Arrdress Resolution Protocol)地址解析协议适用于根据一个机器(主机或路由器)的 IP 地址解析出其相应的 MAC 地址;
IP 地址是 32 位数据,MAC 地址是 48 位数据,格式不同,且主机更换了网络适配器后 MAC 地址也会变化,IP 地址与 MAC 地址二者之间并不存在简单的映射关系;
每个主机都设有一个 ARP 高速缓存(APR Cache),其内存有本局域网上的各主机和路由器的 IP 地址到 MAC 地址的映射表(从 IP 地址到 MAC 地址的映射表),定时动态更新(新增或超时删除);
在本局域网内,若主机 A 要向主机 B 发送的 IP 数据报,其经过的过程如下:
- 查表:查找本机的 ARP 高速缓存看是否有主机 B 的 IP 地址
- 若有,取出其 MAC 地址写入 MAC 帧通过局域网把该 MAC 帧发送至此 MAC 地址
- 若无,则主机 A 自动运行 APR
- 广播:ARP 进程在本局域网上广播发送一个 APR 请求分组(大意是:“我的 IP 地址是 xxx.xxx.xxx.xxx,MAC 地址是 xx-xx-xx-xx-xx-xx,我想知道 IP 地址为 xxx.xxx.xxx.xxx 的MAC地址”)
- 回应:所有在本局域网上运行的主机收到了 ARP 请求分组(包括主机 B),主机 B 的 IP 与 ARP 请求分组中要查询的 IP 地址一致,收下该 ARP 分组,将其写入自己的 APR 缓存中,并向主机 A 发送 ARP 响应分组(大意是:“我的 IP 地址是 xxx.xxx.xxx.xxx,我的 MAC 地址是 xx-xx-xx-xx-xx-xx”);
- 更新:主机 A 收到 ARP 响应分组后,将其 IP 地址到 MAC 地址的映射写入 APR 高速缓存中;
- 重发:重新执行步骤 1
注意由于互联网上的主机可以随时加入和删除,同一主机的 MAC 地址也可能因为网卡的更换而改变,所以 ARP 高速缓存中的每一个映射地址项目都应该有一个生存时间(过期时间),超时则删除;
ARP 适用于解决同一局域网内主机或者路由器的 IP 地址和 MAC 地址的映射问题;
注意:这并不代表着 APR 协议只用于同一局域网内,从 IP 地址到 MAC 地址的解析是自动进行的,主机的用户对这种地址解析过程是不知道的,ARP 协议使用的四种典型情况:
在许多情况下需要多次使用 ARP,重复下述的四种情况;
- 发送方是主机(如 H1),要把 IP 数据报发送到同一个网络上的另一台主机(如 H2)。具体执行过程如上述;
- 发送方是主机(如 H2),要把 IP 数据报发送到另一个网络上的一台主机(如 H3 或 H4)。具体执行过程拆分为两部:
- H1 发送 ARP 请求分组(在网络 N1 上广播),找到 N1 上的一个路由器 R1 的 MAC 地址;
- 剩余的工作由路由器 R1 完成,R1 要做的就是 步骤 3 和 步骤 4;
- 发送方是路由器(如 R1),要把 IP 数据报转发到与 R1 连接在同一个网络 N2 上的主机(如 H3)。
- R1 发送 ARP 请求分组(在网络 N2 上广播)找到目的主机 H3 的 MAC 地址;
- 发送方是路由器(如 R1),要把 IP 数据报转发到网络 N3 上的一台主句(如 H4),H4 与 R1 不是连接在同一个网络上的。
- R1 发送 ARP 请求分组(在网络 N2 上广播)找到连接在 N2 上的一个路由器 R2 的 MAC 地址;
- 剩余的工作由路由器 R2 完成
2.6. IP 数据报格式
IP 数据报由首部和数据两部分组成,首部的前一部分是固定的,共 20 字节,首部固定部分之后是一些可选字段,其长度是可变的;
固定字段
-
版本,占 4 位,指定协议 IP 的版本,例如 IPv4、IPv6; -
首部长度,占 4 位,可表示的最大十进制数值是 15,因为首部长度所表示数的大小是首部大小,所以最小值是 5(0101,单位是 32 位,即 4 字节),因为首部固定大小 20 字节,所以最小值是 5; -
区分服务 DS(Differentiated Services),占 8 位,在旧标准中叫做 服务类型; -
总长度,占 16 位,表示整个数据报的长度,首部长度 + 数据长度,最大值为 216 - 1 = 65535 字节,如果数据帧的长度超过下层(数据链路层)规定的最大长度(最大传送单元 MTU,常见的以太网规定 MTU 值是 1500 字节),需要把过长的数据报进行分片处理; -
标识(identification),占 16 位,IP 软件在存储器中维持的一个计数器,每产生一个数据报,就加 1,并将此值赋值给标识字段,由于 IP 是无连接服务,标识并无序号之意。其主要作用是方便分片发送的数据报能够正确拼接(分片发送的数据报的标识相同) -
标志(flag),占 3 位,目前只有两位有意义:
- 最低为记为 MF(More Fragment),MF = 1 表示后面 “还有分片” 的数据报,MF = 0 表示已经是若干数据报片中的最后一个
- 中间一位记为 DF(Don’t Fragment),DF = 1 表示 “不能分片”,只有 DF = 0 是才允许分片
-
片偏移,占 13 位,片偏移以 8 个字节为偏移单位,故除了最后一个数据报片外,其他每个分片的长度一定是 8 个字节(64 位)的整数倍; -
生存时间,占 8 位,生存时间字段常用的英文缩写是 TTL(Time To Live),表明数据报的寿命,单位是 秒,当 TTL = 0 时,就丢弃该数据报;现在技术的进步,已经将单位改为跳数,表明可以在互联网中最多经过多少个路由器,经过一个路由器 TTL 就减 1,显然最多经过 28 - 1 = 255 个路由器,当 TTL = 1 时表示这个数据报只能在本局域网中传送; -
协议,占 8 位,协议字段指出此数据报携带的数据使用何种协议,以便使目的主机的 IP 层知道应该将数据部分上交给那个协议进行处理; -
首部校验和,占 16 位,这个字段只检验数据报的首部,但不包括数据部分;数据报每经过一个路由器,都要重新计算首部校验和(一些字段如生存时间、标志、片偏移都可能发生变化); 首部检验和的计算方法如下:
反码算术运算:规则是由低位到高位逐列进行计算
0 + 0 = 0
0 + 1 = 1
1 + 0 = 1
1 + 1 = 1(高位进位 1)
最高位若产生进位,则在最低位 + 1
- 在发送方,先把 IP 数据报首部划分为许多 16 位字的序列,并把校验和置 0 ;使用反码算术运算把所有 16 位字相加之后,将所得到的和的反码写入检验和字段;
- 在接收方,把首部所有的 16 位字(包括首部校验和)再使用反码算术运算相加一次,将得到的和取反码,若首部未发生变化,则此结果必为 0;
-
源地址,占 32 位,发送 IP 数据报的主机的 IP 地址; -
目的地址,占 32 位,接收 IP 数据报的主机的 IP 地址;
可选字段
IP 数据报的可变部分是一个选项字段,用来支持排错、测量以及安全等措施,内容很丰富;但是实际上很少使用,因此新的 IP 版本 IPv6 就把 IP 数据报的首部长度做成固定的了。
3. IP 层转发分组
3.1. 基于终点的转发
基于终点的转发:分组在互联网上传送和转发是基于分组首部的目的地址;
注意:路由器不是根据分组中的终点(目的地址)查找转发表(互联网很大!!!,如果这样的话转发表会很大,查表很慢很慢很慢!)来查出下一跳路由器的。
由于 IP 地址由网络前缀和主机号组成,故而可以改为先查找目的网络(网络前缀),然后把分组在这个网络上直接交付目的主机;
一个路由器处理转发分组的过程如下:
- 路由器 R1 收到一个待转发的分组,从转发表得出下一跳路由器 R2的 IP 地址
- 把这个 IP 地址送交数据链路层的网络接口软件
- 网络接口软件把下一跳的路由器 R2 的 IP 地址转换成 MAC 地址(必须使用 ARP 协议),并将此 MAC 地址放在链路层的 MAC 帧首部,利用这个 MAC 地址传送到下一跳路由器 R2 的链路层
- 路由器 R2 从数据链路层取出 MAC 帧的数据部分交付给网络层进行处理;
当发送一连串分组时,查找转发表、调用 ARP 解析出 MAC 地址、把 MAC 地址写入 MAC 帧首部等过程都是由机器自动完成的(也是必须做的);
3.2. 最长前缀匹配
查找转发表的过程其实就是逐行寻找前缀匹配的过程;
在采用 CIDR 编址时,如果一个分组再转发表中可以找到多个匹配的前缀,那么就应当选择前缀最长的一个作为匹配的前缀,这个原则成为最长前缀匹配(longest prefix match),使用分类地址时不会出现最长前缀匹配问题。
网络前缀越长,其地址块就越小,因而路由就越具体(more specific)。可以按照网络前缀的长短对转发表进行排序,网络前缀长的排在前面,就可以更快的查找到;
转发表中还有两种特殊的路由需要注意:
- 主机路由,又称特定主机路由,这是对特定的目的主机的 IP 地址专门指明的一个路由;其网络前缀是 32 位,即 IP 地址 a.b.c.d 与 子网掩码(255.255.255.255)AND 运算后结果还是 a.b.c.d,把收到的分组转发到转发表所指定的下一跳,主机路由在转发表中都放在最前面;
- 默认路由,不管分组的最终目的网络在哪里,都由指定的路由器 R 来处理。其网络前缀是 0 位,即不论目的主机 IP 地址在哪里,都能与该路由匹配,(分组表中有一条映射关系 0.0.0.0/0 -> R),路由器把分组送交下一跳路由器 R 来处理(间接交付);
分组转发算法如下:
-
从收到的分组的首部提取出目的主机的 IP 地址 D(即目的地址) -
若查找到有特定主机路由(目的地址 D),就按照这条路由的下一跳转发分组;否则从转发表中下一行(也就是前缀最长的第一行)开始检查,执行 3; -
把这一行的子网掩码与目的地址 D 按位进行 AND 运算。 若运算结果与本行的前缀匹配,则查找结束,按照“下一跳”所指出的进行处理(或直接交付本网络上的目的主机,或通过指定的接口发送到下一跳路由器)。 否则,若转发表还有下一行,则对下一行进行检查,重新执行 3; -
若转发表中还有一个默认路由,则按照指明的接口,把分组传送到指明的默认路由器;否则,报告转发分组出错;
3.3. 二叉线索查找转发表
无分类编址的转发表一般存放在一种层次的数据结构中,然后自上而下地按层次进行查找,常用的是二叉线索(binary trie),它是一种特殊结构的树;
IP 地址从左到右的比特值决定了从根节点逐层向下层延伸的路径,二叉线索中的各个路径就代表转发表中存放的各个地址;
对二叉线索进行简化,只需找出每一个 IP 地址的唯一前缀(unique prefix),这个唯一前缀就可以代表该 IP 地址了;
二叉线索这个数据结构也就决定了二叉线索的根节点自顶向下的深度最多有 32 层;当搜索到一个叶节点时,就必须将寻找匹配的目的地址与该叶节点的子网掩码进行按位 AND 运算,看结果是否与对应的网络前缀相匹配;
二叉线索只是提供了一种可以快速在转发表中找到匹配的叶节点的机制,是否和网络前缀匹配还需要另行与子网掩码进行一次 AND 运算 。
为了提高二叉线索的查找速度,也使用了各种压缩技术,如上图中最后两个 IP 地址唯一前缀前 4 位相同,就可以跳过前 4 位,直接从第 5 位开始比较;
4. ICMP 协议
网络层使用了 网际控制报文协议 ICMP(Internet Control Message Protocol) 来更加有效地转发 IP 数据报和提高交付成功地机会。
ICMP 报文封装在 IP 数据报的数据部分,其报文格式为:
4.1. ICMP 报文分类
ICMP 报文有两种:ICMP 差错报告报文 和 ICMP 询问报文;
ICMP 报文的前 4 个字节固定,有三个字段:
- 类型,占 8 位,决定是差错报告报文还是询问报文
- 代码,占 8 位,进一步区分某种类型中的不同情况
- 校验和,占 16 位,检验整个 ICMP 报文
紧跟着的 4 个字节(32 位)与 ICMP 报文的类型有关,最后的数据字段其长度却决于 ICMP 的类型;常用的 ICMP 报文类型如下表:
ICMP 报文种类 | 类型的值 | ICMP 报文的类型 | 差错报告报文 | 3 | 终点不可达 | 11 | 时间超过 | 12 | 参数问题 | 5 | 改变路由(Redirect) | 询问报文 | 8 或 0 | 回送(Echo)请求或回送回答 | 13 或 14 | 时间戳(TimeStamp)请求或时间戳回答 |
差错报告报文
- 终点不可达: 当路由器或主机不能交付数据报时就向源站点发送终点不可达报文;
- 时间超过: 当路由器收到生存时间为零的数据报时,除了丢弃该数据报外,还要向源站点发送时间超过报文, 如果数据报分片了,就丢弃已经接收到的数据报分片并发送时间超过报文;
- 参数问题: 当路由器或目的主机收到的数据报的首部中有的字段的值不正确时,就丢弃该数据报,并向源站点发送参数问题报文;
- 改变路由(重定向): 路由器把改变路由报文发送给主机,让主机知道下次应将数据报发送给另外的路由器(找到了更好的路由)
不应发送 ICMP 差错报告报文的几种情况:
- 对 ICMP 差错报告的报文,不在发送 ICMP 差错报告报文
- 对第一个分片的数据报片的所有后续数据报片,都不发送 ICMP 差错报告报文
- 对具有多播地址的数据报,都不发送 ICMP 差错报告报文
- 对具有特殊地址(如 127.0.0.0 或 0.0.0.0)的数据报,不发送 ICMP 差错报告报文
询问报文
- 回送请求或回送回答: ICMP 回送请求报文是由主机或路由器向一个特定的目的主机发出的询问。收到此报文的主机必须给源主机或路由器发送 ICMP 回送回答报文。这种询问报文用于测试目的站是否可达以及了解其有关状态;
- 时间戳请求 或 时间戳回答: 在 ICMP 时间戳请求报文发出后,就能够收到对方响应的 ICMP 时间戳回答报文;利用在报文中记录的时间戳,发送方很容易计算出当前网络的往返时延;
4.2. ICMP 的应用
PING
ICMP 的一个重要应用就是 分组网间探测 PING(Packet InterNet Groper) ,用来测试两台主机之间的连通性;
PING 是应用层直接使用网络层 ICMP 的一个例子,它没有通过运输层的 TCP 或 UDP。
tracert
另一个非常有用的应用是 traceroute(UNIX 操作系统中的命令,Windows 中这个命令是 tracert),用来跟踪一个分组从源点到终点的路径;
tracert 的原理: 从源主机向目的主机发送一连串的 IP 数据报,数据报中封装的是无法交付的 UDP 用户数据报(确保主机或路由能够回发 ICMP 差错报告报文);
- 源主机发送第一个数据报 P1,其
TTL = 1 ,即 P1 到达路径上的第一个路由器 R1 时,路由器 R1 收下该数据报,然后 TTL - 1 ,由于 TTL = 0 了,因此 R1 把 P1 丢弃,并向源主机发送了一个 ICMP 时间超过的差错报文; - 接着源主机发送第二个数据报 P2,其
TTL = 2 ,P2 先到达路由器 R1,R1 收下后 TTL - 1 ,然后转发给路由器 R2,R2 收下后 TTL - 1 ,由于 TTL = 0 了,因此 R2 把 P2 丢弃,并向源主机发送了一个 ICMP 时间超过的差错报文; - ······
- 当数据报 Pn 到达目的主机后,此时
TTL = 1 ,主机不转发数据报,也不把 TTL - 1 ,但是由于 IP 数据报中封装的是无法交付的运输层的 UDP 用户数据报,因此向源主机发送 ICMP 终点不可达差错报告报文;
注意:可以看到截图中每一行有三个时间出现,是因为对应于每一个 TTL 值,源主机要发送三次同样的 IP 数据报;
5. IPV 6
解决 IP 地址耗尽的措施是采用具有更大地址空间的新版 IP,即 IPv6。
IPv4 在经历这么多年的发展已经耗尽了,我国在 2014 年至 2015 年也逐步停止了向新用户和应用分配 IPv4 地址,同时全面开始商用部署 IPv6。
IPv6 仍然支持无连接的传送,但将协议数据单元 PDU 称为 分组(packet),而不是 IPv4 的数据报(datagram)。
IPv6 主要变化如下:
- 更大的地址空间: IPv6 把地址从 Ipv4 的 32 位增大到 4 倍,即增大到 128 位,使地址空间增大了 296 倍;
- 拓展的地址层次结构: IPv6 由于地址空间很大,因此可以划分为更多的层次;
- 灵活的首部格式: IPv6 数据报的首部与 IPv4 的并不兼容,IPv6 有许多可选的拓展首部,可以提高路由器的处理效率(路由器对拓展首部不进行处理,除逐跳拓展首部外);
- 改进的选项: IPv6 允许数据报包含有选项的控制信息,IPv6 的 首部长度固定不变 ,选项放在 有效载荷 中;而 IPv4 的选项在首部的可变部分。
- 允许协议继续扩充: 须知:IPv4 的功能是固定不变的;
- 支持即插即用(即自动配置): IPv6 不需要使用 DHCP;
- 支持资源的预分配: IPv6 支持实时视像等要保证一定的带宽和时延的应用;
- IPv6 首部改为 8 字节对齐: 首部长度必须是 8 字节的整数倍,IPv4 首部是 4字节对齐;
5.1. IPv6 基本首部
IPv6 数据报由 基本首部(base header) 和 有效载荷(payload) 组成,有效载荷也称 净负荷。有效载荷允许有零个或多个 拓展首部(extension header) ,在后面就是数据部分。
所有的拓展首部并不属于 IPv6 数据报的基本首部。
IPv6 与 IPv4 相比,对首部中的某些字段进行了如下更改:
-
取消了首部长度字段,IPv6 的首部长度是固定的 40 字节 -
取消了服务类型字段,优先级和流标号字段实现了服务字段的功能 -
取消了总长度字段,改用有效载荷长度字段 -
取消了标识、标志和字偏移字段,这些功能已包含在分片拓展首部中 -
把 TTL 字段改称为 跳数限制 字段,但作用是一样的 -
取消了协议字段,改用下一个首部字段 -
取消了检验和字段,加快了路由器处理数据报的速度。
- 在数据链路层:对检测出有差错的帧就丢弃
- 在运输层:
- 当使用 UDP 时,若检测出有差错的用户数据报就丢弃
- 当使用 TCP 时,对检测出有差错的报文段就重传,直到正确传送到目的进程为止
因此在网络层的差错检测可以精简掉; -
取消了选项字段,用拓展首部来实现选项功能
IPv6 基本首部中个字段的作用:
- 版本(version): 占 4 位,指明协议版本,IPv6 对应的值是 6;
- 通信量类(traffic class): 占 8 位,区分不同数据报的类别或优先级
- 流标号(flow label): 占 20 位,支持资源预分配,允许路由器把每一个数据报于一个给定的资源分配相联系。提出 流(flow) 的抽象概念:“流”是互联网络上从特定源点到特定终点(单播或多播)的一系列数据报(如实时音频或视频传输),而在这个“流”所经过的路径上的路由器都保证指名的服务质量; 所有属于同一个流的数据报都具有同样的流标号。流标号对于实时视频/音频数据的传送特别有用。
- 有效载荷长度(payload length): 占 16 位,指明 IPv6 数据报除基本首部以外的字节数;
- 下一个首部(next header): 占 8 位,相当于 IPv4 协议的协议字段或可选字段;
- 若数据报中无拓展首部,该字段的作用和 IPv4 中协议字段相同,指明了数据应交付上层的哪一个协议;
- 若数据报中有拓展首部,该字段的值就标识后面第一个拓展首部的类型;
- 跳数限制(hop limit): 占 8 位,与 IPv4 生存时间字段相似,当跳数为 0 时就将数据报丢弃;
- 源地址: 占 128 位,数据报发送端的 IP 地址;
- 目的地址: 占 128 位,数据报接收端的 IP 地址;
5.2. IPv6 拓展首部
所有拓展首部的第一项都是 8 位的下一个首部字段,当使用多个拓展首部时,应按照下面的数据,将高层放在后面;
- 逐条选项
- 路由选择
- 分片
- 鉴别
- 封装安全有效载荷
- 目的站选项
5.3. IPv6 地址
IPv6 数据报的目的地址可以是以下三种基本类型地址:
- 单播(unicast): 单播就是传统的点对点通信;
- 多播(mulcast): 多播是一点对多点的通信,数据报发送到一组计算机中的而每一个,可以将 IPv4 的广播视为是多拨的一个特例;
- 任播(anycast): 任播的终点是一组计算机,但数据报只交付其中的一个,通常是按照路由算法得出距离最近的一个;
IPv6 把实现 IPv6 的主机或路由器均称为节点,IPv6 给节点的每一个接口指派一个 IPv6 地址,一个具有多接口的节点可以有多个单播地址;
IPv6 采用 冒号十六进制记法,且允许把数字前面的 0 省略(省略前导 0),如 0000 可以写成 0,同时允许 零压缩(zero compression),如下例:
FF05:0:0:0:0:0:0:B3 可压缩为:FF05::B3
任一地址中只能使用一次 0 压缩。
IPv6 取消了子网掩码,对于 IPv6 地址:2001:0DB8:0:CD30:123:4567:89AB:CDEF
- CIDR 记法:
2001:0DB8:0:CD30:123:4567:89AB:CDEF
其子网号为:2001:0DB8:0:CD30::/60
- 未指明地址:
0:0:0:0:0:0:0:0 可缩写为 :: ,该地址不能作为目的地址,只能将某台主机当作源地址使用,条件是这台主机还没有配置到一个标准的 IP 地址,这类地址仅此一个; - 环回地址:
0:0:0:0:0:0:0:1 可缩写为 ::1 ,作用与 IPv4 环回地址相同,这类地址仅此一个; - 多播地址: 功能同 IPv4
- 本地站点单播地址(cite-local unicast address): 内部网络使用了 TCP/IP 协议,但是没有连接到互联网上,可以在内部网络使用本地站点进行通信,但不能与互联网上的其他主机通信;
- 本地链路单播地址(link-local unicast address): 在单一链路上使用,当一个节点启用 IPv6 时就自动生成本地链路地址(没有链接在网络上),当需要把分组发送往单一链路的设备而不希望该分组被转发到此链路范围以外的地方时,可以使用这种特殊地址;
- 全球单播地址: 可以使用 n 位做子网前缀,剩下的 128 - n 作为接口的标识符(相当于 IPv4 主机号);也可以划分三级,n 为作为全球路由选择前缀,m 位作为子网前缀,128 -n - m 作为接口标识符;
5.4. IPv4 向 IPv6 过渡
IPv6 系统必须能够接收和转发 IPv4 分组,并且能够为 IPv4 分组选择路由(向后兼容),过渡策略有:使用双协议栈和使用隧道技术;
1. 双协议栈
双协议栈(dual stack) 是指在完全过度至 IPv6 之前,支持 IPv6 的主机(或路由器)同时装有 IPv4 和 IPv6 两种协议栈;
主要通过域名解析系统 DNS 的返回结果来决定使用哪种 IP 地址,双协议栈需要安装两套协议,代价较大,最好采用隧道技术;
2. 隧道技术
隧道技术的工作要点是: 在 IPv6 数据报要进入 IPv4 网络时,把 IPv6 数据报封装成 IPv4 数据报。
在途径 IPv4 网络时,将整个 IPv6 数据报作为 IPv4 数据报的数据部分封装起来;将 IPv4 首部的协议字段的值设置为 41,这样双协议栈的主机就知道 IPv4 数据报内封装的数据是一个 IPv6 数据报,从而使得在使用 IPv6 时可以正确得将数据报解析出来;
ICMPv6
ICMPv6 是适用于 IPv6 的网际控制报文协议,地址解析协议 ARP和网际组管理协议 IGMP 的功能都合并到了 ICMPv6 内,它要比 ICMPv4 复杂得多;
ICMPv6 是面向报文的协议,它利用报文来报告差错,获取信息,探测邻站或管理多播通信;
ICMPv6报文有:
- 差错报文
- 信息报文
- 邻站发现 ND(Neighbor-Discovery)报文,使用 ND 协议
- 多播听众交付 MLD(Multicast Listener Delivery)报文,使用 MLD 协议
6. 路由选择协议
6.1. 概述
路由选择协议的核心就是路由算法,即需要使用何种算法来获得路由表中的各项目;算法应有如下特点:
- 是正确的和完整的
- 在计算上简单,不应使网络通信量增加太多额外的开销;
- 能适应通信量和网络拓扑的变化,通常称为自适应性或稳健性
- 具有稳定性
- 是公平的,所有用户(除对少数优先级高的用户)都是平等的;
- 是最佳的,相对于某一种特定要求下的出的较为合理的选择;
从网路由算法是否能随网络的通信量或拓扑自适应地进行调整变化来划分,可分为两种策略:
- 静态路由选择策略,也称非自适应路由选择,适用于简单的小网络
- 动态路由选择策略,也称自适应路由选择,适用于较复杂的大网络
互联网采用的路由选择协议主要是自适应的(即动态的)、分布式路由选择协议;
可以把互联网划分为许多较小的 自治系统 AS(autonomous system),自治系统是在单一技术管理下的许多网络、IP 地址以及路由器;每一个 AS 对其他 AS 表现出的是一个单一的和一致的路由选择策略;
通过自治系统,互联网可以把路由选择协议划分为两大类:
- 内部网关协议 IGP(Interior Gateway Protocol): 一个自治系统内部使用的路由选择协议,目前用的最多的是:RIP、OSPF、IS-IS;有时也称自治系统内部的路由选择为:域内路由选择(interdomain routing)
- 外部网关协议 EGP(External Gateway Protocol): 自治系统之间的路由选择,目前用的最多的是:BGP 的版本 4(BGP-4); 有时也称自治系统之间的路由选择为:域间路由选择(intradomain routing)
6.2. 内部网关协议 RIP
工作原理
RIP(Routing Information Protocol) 是内部网关协议 IGP 中最先得到广泛应用的协议;中文译名是路由信息协议,RIP 是一种分布式的基于距离向量的路由选择协议;
RIP 的距离定义为:从一路由器直接连接的网络的距离定义为 1,与一台非相连的网络的距离定义为所经过的路由器的数量加 1;
可以看出 RIP 的距离与跳数很相似,RIP 允许一条路径最多只能包含 15 个网络,即当距离= 16 时相当于不可达。由此可见,RIP 只适用于小型网络;
RIP 协议的特点:
- 仅和相邻路由器交换信息;
- 交换的信息是当前本路由器所知道的全部信息,即自己现在的路由表;
- 按固定的时间间隔交换路由信息;
RIP 协议通过不断地与相邻路由器交换路由表,然后 “收敛”,最终每个路由器都知道从本路由到达本自治系统中任何一个网络地最短距离和下一跳路由器地地址;
距离向量算法
算法要点:
设 X 是节点 A 到 B 地最短路径地一个节点,若把路径 A ? B 拆分为两段路径:A ? X 和 X ? B,则每一段路径 A ? X 和 X ? B 也都分别是节点 A 到 X 和节点 X 到 B 地最短路径;
对于一个相邻路由器 X发送过来的 RIP 报文,执行以下步骤:
- 修改此报文中的所有项目,每个项目都有三个关键字:到目的网络 Net,距离是 d,下一跳路由器是 X:
- 把 “下一跳” 字段中的地址都改为 X;
- 把所有的 “距离” 字段都加 1;(与 a 相邻的路由 b 到该地址的路由 c 的距离为 d ,则路由 a 到达路由 c 的距离应为 d + 1)
- 对修改后的 RIP 报文中的每一个项目,进行以下步骤:
- 若原路由表中没有目的网络 Net,则把该项目添加到路由表中;(新的网络,需更新)
- 否则,查看下一跳路由器地址:
- 若下一跳路由器地址是 X,则把收到的项目替换原路由表中的项目(更新,以最新的为准);
- 否则,查看本路由表的中距离字段:
- 若收到的项目中的距离 d 小于路由表总的距离,则进行更新(这条路径更优);
- 否则,跳过该项目;(距离不变,更新也没用,距离大了更不是最优路径,不更新)
- 若 3 分钟还没有收到相邻路由器的更新路由表,则把此相邻路由器记为不可达的路由器,即把距离设置为 16;
- 返回;
RIP 协议使得每一个路由器到每一个目的网络的路由都是最短的。
RIP 报文由 首部和路由部分组成,在路由部分要填入 自治系统号 ASN(Autonomous System Number),还要指出 目的网络地址(包括网络的 子网掩码)、下一跳路由器的地址、到此网络的距离;
一个 RIP 报文最多可以包括 25 个路由,超过必须在用一个 RIP 报文来传送;
RIP 协议的特点是:好消息传播得快,坏消息传播得慢;
优点是:实现简单,开销小;
缺点是:只适用于小型网络,网络规模不大;路由器坏消息传播得慢;
由于路由器的路由表的建立需要时间,所以当网络上某个/某些路由损坏,需要经过较长的时间才能将此信息传送到所有的路由器(3 分钟才能确定相邻路由器不可达);
6.3. 内部网关协议 OSPF
基本特点
开放最短路径优先 OSPF(Open Shortest Path First),是为了克服 RIP 的缺点开发出来的,“最短路径优先”是因为使用了Dijkstra 提出的最短路径算法 SPF,
OSPF 只是一个协议名字,并不代表其他路由选择协议不是“最短路径优先”。
OSPF 使用 链路状态协议(link state protocol),其特点是:
- 向本自治系统中 所有路由器 发送信息,使用 洪泛法(flooding)。路由器通过所有输出端口向所有相邻的路由器发送信息,相邻路由器又将此信息发送往其所有相邻的路由器(刚刚发来信息的那个路由器除外);
- 发送的信息是本路由器相邻的所有路由器的链路状态;
- 当链路状态发生变化或每隔一段时间,路由器向所有的路由器用洪泛法发送链路状态信息;
各路由器之间频繁地交换链路状态信息,最终可以建立一个 链路状态数据库(link-state database) 即 全网的拓扑结构图,这个拓扑结构图在全网范围(自治系统内)是一致的(链路状态数据库的同步);OSPF 的更新过程收敛的快;
OSPF 将一个自治系统再划分为若干个更小的区域(area),使用层次结构的区域划分,在上层的区域叫做主干区域,其标识符为 0.0.0.0,作用是连通其他在下层的区域;
从其他区域来的信息都由 区域边界路由器 进行概括,下图中 R3、R4、R7 都是区域边界路由器,每个区域者少应该由一个区域边界路由器;在主干区域内的路由器都叫做 主干路由器,如 R3、R4、R5、R6、R7,主干路由器同时也可以是区域边界路由器;主干区域还有一个专门和本自治系统外的其他自治系统交换路由信息的路由器,称之为 自治系统边界路由器;
- OSPF 对于不同类型的业务可计算出不同的路由,时延敏感的业务就设置为非常高的代价(1 ~ 65535),也可以根据带宽来计算链路的代价;
- 如果到一个目的网络有多条代价相同的路径,可以将通信量分配给这几条路径,负载均衡(load balancing);
- 所有在 OSPF 路由器之间交换的分组都具有鉴别的功能,保证仅在可信赖的路由器之间交换链路状态信息;
- OSPF 支持可变长度的子网划分和无分类的编址 CIDR;
- 每一个链路状态由一个 32 位的序号,序号越大状态就越新,增长速率不得超过 5s/次,600 年内不会产生重复号;
分组类型
OSPF 有五种分组类型:
- 问候(Hello) 分组: 用来发现和维持邻站的可达性;
- 数据库描述(Database Description) 分组:向邻站给出自己的链路状态数据库中的所有链路状态项目的摘要信息;
- 链路状态请求(Link State Request) 分组: 向对方请求发送某些链路状态项目的详细信息;
- 链路状态更新(Link State Update) 分组: 用洪泛法对全网更新链路状态;
- 链路状态确认(Link state Acknowledgment) 分组: 对链路更新分组的确认;
OSPF 分组是作为 IP 数据报的数据部分来传送的(协议字段值为 89),而不是用 UDP;
6.4. 外部网关协议 BGP-4
边界网关协议 BGP 力求选择出一条能够到达目的网络前缀且比较好的路由,而并非要计算出一条最佳路由;BGP 采用了 路径向量(path vector)路由选择协议;
概述
一个自治系统 AS 至少要有一个边界路由器(或边界网关)和相邻 AS 的边界路由器直接相连;当两个边界路由器进行通信时,必须先建立 TCP 连接(端口号为 179),半永久性连接(双方交换玩信息后仍然保持着连接状态);
边界路由器之间的连接通常称为 eBGP 连接,e 代表外部 external;边界路由器应该把获得的 BGP 路由再转发给 AS 内部的其他路由器:在 AS 内部,两个路由器之间还需要建立 iBGP(也就是 iBGP 连接,i 代表内部 internal)iBGP 也使用 TCP 连接传送 BGP 报文。
BGP 协议规定,在一个 AS 内部所有的 iBGP 必须是全连通的,即使两个路由器之间没有物理连接,但它们之间仍有 iBGP 连接;
eBGP 是在不同 AS 的两个对等端之间的 BGP 连接,iBGP 是同一 AS 的两个对等端之间的 BGP 连接;
BGP 路由 = “前缀,BGP 属性” = “前缀,AS-PATH,NEXT-HOP” ,前缀即 BGP 路由终点(子网前缀),属性有以下两种重要的:
- AS-PATH(自治系统路径),是通告的 BGP 路由所经过的自治系统(自治号 ASN);
- NEXT-HOP(下一跳),是通告的 BGP 路由起点;
三种不同的自治系统 AS:
路由选择
- 本地偏好 LOCAL-PREF(LOCAL PREFerence)值 最高的路由要首先选择;否则,执行下一条;
- 选择具有 AS 跳数最少 的路由,但并不一定是最佳路由,路径上某个 AS 内部可能由更多次数的转发;若选择不出,则执行下一条;
- 使用 热土豆路由选择算法,让分组经过最少的转发次数离开本 AS;若选择不出,则执行下一条;
- 选择路由器 BGP 标识符的数值最小的路由,
BGP 报文
- OPEN (打开)报文,与 BGP 连接对等端建立关系(建立 TCP 连接后必须发送的报文);
- UPDATE(更新)报文,通告某一路由的信息,以及列出要撤销的路由(一次报文中:更新只能更新一条,撤销可以撤销多条);
- KEEPALIVE(保活)报文,周期性(保持时间的 1 / 3)地证实与对等端地连通性;
- NOTIFICATION(通知)报文,发送检测到地差错;
6.5. 路由器的构成
路由器是一个具有多个输入端口和多个输出端口的专用计算机,其任务是转发分组;
整个路由器的结构可以划分为两大部分: 路由选择 部分和 分组转发 部分;
路由选择部分也叫做 控制部分,或 控制层面,核心构件是路由选择处理机(任务:根据所选定的路由协议构造出路由表,同时定期地和相邻路由器交换路由信息而不断地更新和维护路由表;)。
路由器分组转发部分由三部分组成:输入端口、输出端口、交换结构;交换结构又称为 交换组织,其作用是:根据转发表将收到的分组从输入端口转发到输出端口;
三种转发方法:
- 通过存储器进行交换
- 通过总线进行交换
- 通过纵横交换结构(总线网)进行交换
7. IP多播
多播即一对多的通信;在互联网上进行多播就叫做 IP 多播,IP 多播所传送的分组需要使用多播 IP 地址;
- 能够运行多播协议的路由器称为 多播路由器(multicast router);
- 多播组的 IP 地址为 D 类 IP 地址;(多播地址只能用于目的地址,而 不能用于源地址),对多播数据报不产生 ICMP 差错报文
- IP 多播分为两种:
- 在本局域网上进行硬件多播
- 在互联网的范围进行多播
7.1. 局域网上进行硬件多播
多播组的 MAC 地址是由 MAC 地址和 D 类 IP 地址的后 23 位拼接起来的;
7.2. IGMP 协议与多播路由选择协议
网际组管理协议 IGMP(Internet Group Management Protocol) 让 连接在本地局域网 上的多播路由器知道 本局域网上 是否有主机参加或退出了某个多播组;
连接在局域网上的多播路由器还必须和互联网上的其他多播路由器协同工作,这就需要使用 多播路由选择协议;
- 多播转发必须动态地适应多播组成员的变化(这时网络拓补并未发生变化);
- 多播路由器在转发多播数据报时,不能仅仅根据多播数据报中的目的地址;
- 多播数据报可以由没有加入多播组的主机发出,也可以通过没有组成员接入的网络;
IGMP 协议
多播路由器的发送者和接收者都不知道一个多播组的成员有多少,以及这些成员哪些是主机;
多播路由选择协议
多播路由选择实际上就是找出以源主机为根节点的 多播转发树;
- 洪泛与剪除,反向路径广播 RPB
- 隧道技术
- 基于核心的发现技术,核心路由器
建议使用的多播路由选择协议:
- 距离向量多播路由选择协议 DVMRP
- 基于核心的转发数 CBT
- 开放最短通路优先的多播拓展 MOSPF
- 协议无关多播-稀疏方式 PIM-SM
- 协议无关多播-密集方式 PIM-DM
8. 虚拟专用网 VPN 和网络地址转换 NAT
8.1. 虚拟专用网 VPN
全球 IP 地址,需要向互联网的管理机构 申请 的 IP 地址都是全球 IP 地址;
专用 IP 地址(可重用地址),机构内部主机间通信,不能与互联网连接:
10.0.0.0/8 ,即从 10.0.0.0 到 10.255.255.255 ,相当于一个 A 类网络172.16.0.0/12 ,即从 172.16.0.0 到 172.32.255.255 ,相当于 16 个连续的 B 类网络192.168.0.0/16 ,即从 192.168.0.0 到 192.168.255.255 ,相当于 256 个连续的 C 类网络
采用专用 IP 地址的互连网络称为专用互联网(专用网)或本地互联网
有时一个机构的多个专用网之间需要交换信息,一般采用 虚拟专用网络 VPN(Virtual Private Network),利用公用的互联网作为多个专用网之间的通信载体;所有通过互联网传送的数据都必须加密;
两个专用网 A 和 B,网络地址分别为专用地址 10.1.0.0 和 10.2.0.0 ,需通过公用的互联网构建一个 VPN:
- A(B)内有(至少)一个路由器 R1(R2) 其具有合法的全球 IP 地址;
- 场所 A(B) 内主机通信不需要经过互联网,场所 A 与 场所 B 内的主机(X、Y)之间通信,必须经过路由器 R1 与 R2;
- 路由器 R1 发现由 X 发送至 Y 的数据报 P1(源 IP:10.1.0.1,目的 IP:10.2.0.3) 需经过互联网才能到达(根据目的 IP 地址得知),所以将 P1 加密,然后生成一份新的数据报 P2(源 IP:125.1.2.3,目的 IP:194.4.5.6),加密后的 P1 作为P2 的数据部分发送往路由器 R2
- 路由器 R2 将数据报 P2 的数据部分取出解密出 P1 然后根据目的 IP 转发至主机 Y
场所 A 和 B 的内部网络所构成的虚拟专用网 VPN 又称为 内联网(intranet VPN),表明场所 A 和 B 所属于同一个机构;若场所 A 和 场所 B 不属于同一个机构(如合作伙伴关系)那么这样的 VPN 就称为 外联网(extranet VPN);
内联网和外联网都是基于 TCP/IP 协议的。
还有一种 远程接入 VPN,适用于流动成员外地办公使用;
8.2. 网络地址转换 NAT
网络地址转换 NAT(Network Address Translation) 技术用来解决专用网内部主机需要与互联网上的主机通信(无需加密)的需求;
在专用网与互联网连接的路由器上安装 NAT 软件,这样的路由器称为 NAT 路由器,它至少有一个 有效的外部全球 IP 地址;
网络地址转换的主要工作就是代理,将专用网发送至互联网的数据报进行加工处理,建立一个 NAT 转换表,具体工作流程可以参考下例:
前提: 专用网主机 A、互联网主机 B、NAT 路由器 R(其内有全球 IP:172.38.1.5 )
- 由 A 发送至 B 的 IP 数据报 P1(源 IP:192.168.0.3,目的 IP:213.18.2.4)经过 NAT 路由器 R 时,R 通过内部的 NAT 转换表,找到对应的全球 IP 地址,然后改写数据报 P1 的源地址,发送 P2 (源 IP:172.38.1.5,目的 IP:213.18.2.4)至 B
- B 收到 P2 后做出回应,发送了数据报 P3(源 IP:213.18.2.4,目的 IP:172.38.1.5),经过 R 时,R 通过内部的 NAT 转换表,将 P3 中全球 IP 地址(即目的地址)转换为专用网地址,然后发送 P4(源 IP:213.18.2.4,目的 IP:192.168.0.3)至 A;
NAT 路由器具有 n 个全球 IP 地址时,可以同时有 n 个专用网主机接入到互联网。
目前经常把 IP 地址与端口号同时用上以提高 NAT 路由器内的全球 IP 地址的利用率,使得多个拥有本地地址的主机共用 NAT 路由器上的一个全球 IP 地址;
使用端口号的 NAT 也叫做 网络地址与端口号转换 NAPT(Network Address and Port Translation);
9. 多协议标签交换 MPLS
多协议标签交换 MPLS(MultiProtocol Label Switching),采用面向连接技术,使每个分组携带一个小整数(称之为 标签),分组经过交换机(标签交换路由器)时,用标签值来检索分组转发表(比查路由表快得多);
MPLS 的特点:
- 支持面向连接的服务质量
- 支持流量工程,均衡网络负载
- 有效地支持虚拟专用网 VPN
在 MPLS 域的入口处,给每一个 IP 数据报打上固定长度的标签,对打上标签的 IP 数据报用硬件进行转发,根据标签在第二层(链路层)用硬件进行转发;
MPLS 域是指该域中有许多相邻的支持 MPLS 技术的 标签交换路由器 LSR(Label Switching Router) ,这种路由器同时也支持路由选择;
10. 软件定义网络 SDN
协议 OpenFlow 可视为是在 SDN 体系结构中控制层面和数据层面之间的通信接口,它使得控制层面的控制器可以对数据层面中的物理设备或虚拟设备进行直接访问和操纵,这种控制 在逻辑上是集中式的,是 基于流的控制;
软件定义网络 SDN 并不是要改变网络的功能,而是一种新的体系结构,其要点是:
- 基于流的转发
- 数据层面与控制层面分离
- 控制层面用软件实现,并且是逻辑上的集中式控制
- 可编程的网络
SDN 控制器有以下三个层次:
- 通信层,大多采用 OpenFlow 协议,与数据层面的接口叫做南向接口
- 状态管理层
- 到网络控制应用程序层的接口(北向接口)
|