计算机网络03:网络层
第三章 网络层
3.1 网络层概述
网络层:
- 将数据段(segment)从发送主机传递到接收主机
- 发送主机:将数据段封装到数据报(datagram)中
- 接收主机:向传输层交付数据端(segment)
与传输层的区别:
- 每个主机和路由器都需要运行网络层协议,不再是一个端到端的层次
- 每个路由器都需要检验所有穿越它的IP数据报的头部域
- 决策如何处理IP数据报
3.1.1 网络层核心功能
- 转发(forwarding)
- 将分组从路由器的输入端口转移到合适的输出端口
- 问题:作为网络层设备,如何得知对于每一个数据报,应该如何将其发送到合适的路由器?
- 转发表,记录了路由器如果收到数据报,这个数据报携带者地址信息,根据信息查找转发表,就可以得知如何将其转发
- 需要实现获取和维护转发表,由路由获取并记录
- 路由(routing):确定分组从原到目的地经过的路径
- 路由算法:

- 连接建立
- 并不是所有网络都需要
- 某些网络的重要功能:
- ATM
- 帧中继
- X.25
- 数据分组传输之前两端主机需要首先建立虚拟/逻辑连接
- 路径上的所有网络设备(如路由器)参与连接的建立
- 网络层连接与传输层连接的对比
- 网络层连接:两个主机之间(路径上的路由器等网络设备参与其中)
- 传输层设备:两个应用进程之间(对中间网络设备透明)
3.1.2 网络层服务模型
网络层为发送端到接收端的数据报传送通道提供什么样的服务模型(Service Model)?
网络架构 | 服务模型 | 保证带宽 | 保证分组不丢失 | 按序传输 | 具有时延上界 | 拥塞反馈 |
---|---|---|---|---|---|---|
Internet | 尽力服务(best effort),什么都不保障 | none | no | no | no | no |
ATM(异步传输模式网络) | CBR,固定比特率 | 固定带宽,constant rate | yes | yes | yes | 没有拥塞 |
ATM | VBR,可变比特率 | guaranteed rate | yes | yes | yes | no |
ATM | ABR,可用比特率 | guaranteed minimum | no | yes | no | yes |
ATM | UBR,不保证比特率 | none | no | yes | no | no |
两类典型的服务类型:
- 无连接服务 connection-less service
- 不会事先为系列分组的传输确定传输路径
- 每个分组独立确定传输路径
- 不同分组可能传输路径不同
- 典型应用:数据报网络(datagram network)
- 连接服务 connection service
- 首先为系列分组的传输确定从原到目的经过的路径(建立连接)
- 然后沿该路径(连接)传输系列分组
- 系列分组传输路径相同
3.2 虚电路网络和数据报网络
数据报网络和虚电路网络是典型的两类分组交换网络
- 数据报网络提供网络层无连接服务
- 虚电路网络提供网络层连接服务
- 类似于传输层的无连接服务(TCP)和面向连接服务(UDP),但网络层服务与其不同的是:
- 主机到主机服务
- 最关键的是网络核心实现,而不仅仅是端系统
3.2.1 虚电路网络
虚电路:一条从源主机到目的主机,类似于电路的路径(逻辑链接)
虚电路网络与电路交换的区别:
- 分组交换
- 每个分组的传输可以利用链路的全部贷款
- 源到目的路径经过的网络层设备共同完成虚电路功能
通信过程:
- 呼叫建立(call setup),与电路交换类似
- 数据传输
- 拆除呼叫
如何保证每个分组可以沿着虚电路进行传输?
- 每个分组携带虚电路标识(VCID),而不是目的主机地址
- 虚电路经过的每个网络设备(如路由器),维护每条经过它的虚电路连接状态
优点:
- 集成了电路交换和分组交换的优点,在分组交换的同时链路、网络设备资源(如带宽、缓存等)可以面向VC进行预分配
- 预分配资源=可预期服务性能
- 如ATM的电路仿真(CBR)
3.2.1.1 VC的具体实现
每条虚电路包括:
- 从源主机到目的主机的一条路径
- 虚电路号(VCID),沿路每段链路一个编号
-
如何定义、分配使用VCID?
-
作为链路,到底支持建立多少条虚电路,反映了这条链路的通信能力;链路带宽越大,允许支持的虚电路个数越大,不同链路支持的虚电路号也就不同。
-
不可能在每一段链路上的VCID都是统一的
-
局部化管理,同一段虚电路,在每一段链路上采用的虚电路号可能不同。
-
- 沿路每个网络层设备(如路由器),利用转发表记录经过的每条虚电路
沿某条虚电路传输的分组,携带对应虚电路的VCID,而不是目的地址。
同一条VC,在每段链路上的VCID通常不同
- 路由器转发分组时依据转发表改写/替换当前分组的虚电路号
3.2.1.2 VC转发表
路由器R1的VC转发表:
分组经过R1后,其携带的VCID会从12替换为22。
VC路径上每个路由器都需要维护VC连接的状态信息:
- 虚电路的建立:转发表增加入口
- 虚电路的拆除:转发表去除一项
3.2.1.3 虚电路信令协议 signaling protocals
用于VC的建立、维护和拆除
- 建立:存在路径选择问题,即如何选择通过哪些网络设备建立路径?
- 同样需要路由协议建立路由,只不过是一次完成的
应用于虚电路网络
- 如ATM、帧中继网络等
目前的Internet不采用虚电路信令协议。
虚电路网络利用协议建立虚电路过程:
3.2.2 数据报网络
-
在网络层提供无连接服务
-
每个分组携带目的地址
-
路由器根据分组的目的地址转发分组
- 基于路由协议/算法构建转发表
- 检索转发表
- 每个分组独立选择路径
- 路由器转发表更新后可能导致送达同一目的地的数据报所走的路径可能不同
数据报转发表:

问题:以Internet为例,数据报携带的目的网络地址为目的主机的IP地址,IP地址是一个32位的2进制数(IPv4),地址空间大约为40多个亿;如果转发表要记录IP数据报可能到达的每一个IP地址,转发表就会非常巨大,几乎不可行。
如何提高转发效率?
多数情况下,我们不针对某一个具体的主机的IP地址进行转发,而是针对地址范围进行转发:

符合某个地址范围的数据报,在某个输出链路上进行转发,相当于将转发表进行聚合:将很多具有共同地址范围的表项进行聚合。


某一块地址是一块连续地址的划分,上图的划分是很完美的。
问题:如果地址范围划分的不是这么“完美”会怎么样?
最长前缀匹配优先
例如,一个路由器的转发表如下:
- 11001000 00010111 00010110 10100001 应该从哪个接口转发?
- 通过比对转发表的目的地址范围,显然这个地址符合链路接口为0的转发入口。
- 如果有一条匹配成功的入口,就直接选择匹配成功的;
- 如果所有匹配都不成功,才选择其他路径(默认路径/缺省路由)
- 11001000 00010111 00011000 10101010 应该从哪个接口转发?
- 与接口1、接口2的地址范围都可以匹配
- 匹配比特数越少的地址范围越大,匹配比特数越多的地址范围越小
- 即匹配前缀越多,其描述的范围越具体,网络越小;匹配前缀越少,描述的地址范围越大。
- 显然应该选择匹配前缀数越多的接口,类似投递员应该投递给地址更详细的位置。
- 即选择接口1进行转发。
最长前缀匹配优先:
- 在检索转发表时,优先选择与分组目的地址匹配前缀最长的入口。
Internet的转发就遵循这个元组
3.3.3 数据报网络 or VC网络?
Internet网络(数据报网络)
- 计算机之间的数据交换
- 弹性服务,没有严格的时间需求
- 链路类型众多
- 特点、性能各异
- 统一服务困难
- “智能”端系统(计算机)
- 可以自适应、性能控制、差错恢复
- 简化网络,复杂边缘
ATM(虚电路网络)
- 电话网络演化而来
- 核心业务是实时对话
- 严格的时间、可靠性需求
- 需要有保障的服务
- “哑(dumb)”端服务(非智能)
- 电话机
- 传真机
- 简化边缘,复杂网络
虚电路服务与数据报服务的对比:
3.3 IP协议
IP协议:
-
IP协议为数据报在网络中的传递提供了路由器功能
-
每个数据报都有源地址和目的地址
-
IP协议决定了数据报是否到达其目的地或是否需要转发
- 如果必须转发,则IP可以确定该数据报的下一跳位置
-
IP不提供可靠性保证
- IP无法保证数据报一定会到达其指定目的地址
-
负责数据报的分段
-
数据报不能超过其正在运行的网络的最大大小
- 在创建数据报时并不知道这一点
主机、路由器网络层主要功能:
IP协议在处理/转发分组时会使用到路由表;IP协议是Internet网络层中非常重要的数据传输协议,涉及到寻址内容,规约寻址方式,定义数据报格式以及规定分组处理方式
出现差错,网络层需要将差错信息传输给路由器/主机:ICMP协议
- 伴随IP协议的运行提供差错报告
- 提供信令进行传输
- IP协议的伴随协议,实现IP协议同时也要实现ICMP协议
3.3.1 IPv4数据报结构
- IPv4:32位
- 点分十进制表示
- 例如:205.150.58.7
- IPv6:128位
- 点分十六进制表示
- 例如:2001:0503:0C27:0000:0000:0000:0000:0000
- 共有160亿个网络地址
将IP数据报展开:
IP数据报分为两部分:
- 固定部分
- 在所有的IP数据报中都固定大小
- 20字节
- 可变部分
- 长度不固定,最小可以为0字节
总体结构:
- 版本号
- 给出IP协议的版本
- 4位
- IPv4 \(\rightarrow\) 4, IPv6 \(\rightarrow\) 6
- 首部长度
- 给出整个IP分组的首部长度
- 4比特
- 每个值对应IP分组中的一行,共32比特
- 即首部长度域的值需要$\times$4才是真正的首部长度
- 若首部长度为5,则IP数据报的首部长度为4$\times$5=20字节
4比特可以表示的数值的最大数量为15(\(2^4-1\)),按照现有图示,可以得出作为固定部分需要5行$\times$4字节=20字节,如果包括选项部分,头部长度一定会超过20字节。此时4比特的首部长度域显然无法给出20的值,因此,IP协议标准规定,首部长度域换算成10进制,每个数对应的是4个字节,即以4字节为单位。
-
服务类型(TOS)
- 8比特
- 指示IP数据报在传输过程中期望获得那中类型的服务
- 1998年该字段改名为区分服务
- 只有在网络提供区分服务时使用
- 一般情况下不使用,通常IP分组的该字段(第二字节)的值为00H
-
总长度
- 整个IP数据报的长度(首部+数据),以字节为单位
- 16位,最大支持的长度为65535B
- 最小的IP分组首部:20B
- IP分组可以封装的最大数据:65535 - 20 = 65515B
-
标识、标志位、片偏移:与分片相关
-
生存时间(TTL)
- 8比特
- 指示IP分组封装的是哪个协议的数据包(TCP/UCP)
- 实现复用/分解
- 6 -> TCP;17 -> UDP;
-
首部校验和
-
16比特
-
对首部进行差错检测
-
计算校验和时,该字段置全0
-
采用反码算术运算求和,和的反码作为首部校验和字段
-
校验和运算是首部参与的,因为TTL在每次路由器转发时都要减1,首部校验和在每次路由器转发时都会重新计算,即逐眺计算,逐跳检验
-
-
源IP地址、目的IP地址
- 各32位
- 分别标识发送分组的源主机/路由器(网络接口)和接收分组的目的主机/路由器(网络接口)的IP地址
-
选项字段
- 范围在1~40B之间
- 携带安全、源选路径、时间戳、路由记录等内容
- 实际上很少使用
-
填充字段
- 范围在0~3B之间
- 补齐整个首部,符合32位对齐,即保证首部长度是4字节的倍数
3.3.2 IP数据报分片
最大传输单元 MTU
- 网络链路存在MTU——即链路层数据帧可封装数据的字节数的上限
- 不同链路的MTU不同
- 如果有两条MTU不同的链路,一个IP数据报在较大的MTU链路上传输时可以直接传输,而传输到MTU较小的链路上则有可能无法被装载到一个数据帧中。
分片
- 大IP分组向较小MTU链路转发时,路由器可以将达分组进行分片(fragmented)
- 注意:路由器不是一定会将其分片,是否分片取决于数据分组中的某个标志位如何设置
- 如果标志位不允许分片而路由器需要将其分片,路由器会将该分组丢弃,同时向源主机发送ICMP报文
- 如果可以分片,则路由器会将大分组切分为小分组
- 到达目的主机后需要由目的主机将这些小分组重组(reassembled)
- 即路由器只分不装,目的主机负责重组
如何区分当前分组是否分片?如果是分片,那它是哪一个分组的分片?片之间的相对顺序?
- IP首部的相关字段用于标识分片以及确定分片的相对顺序
如果一个分片丢失,目的主机等待一段时间后如果接收不全,就会将该分组的所有分片丢弃。
IP首部参与分片的标识:
- 标识 ID
- 16比特
- 标识一个IP分组
- IP协议利用一个计数器,每产生一个IP分组则计数器+1,作为该分组的标识
- 当然仅仅使用ID还无法唯一标识分片,还需要源主机地址、目的主机地址、协议等多个字段共同决定
- 标志位 fragflag
- 3比特
- 保留部分:未使用
- DF(Don’t Fragment)
- 标识一个路由器是否允许对分组进行分片
- DF=1 -> 禁止分片
- DF=0 -> 允许分片
- MF(More Fragment)
- 标识当前分片是否有后续分片
- MF=1 -> 不是最后一片
- MF=0 -> 最后一片/未分片
- 到底是最后一片还是未分片,需要结合片偏移判断
- 片偏移 offset
- 13比特
- 给出分片的IP分组封装源IP数据报中的数据的相对偏移量
- 若未分片,则该字段一定为0
- 说明了封装的是源IP数据报的哪一段数据
- 根据相对大小就可以排序每一片
- 在IPv4的分组格式中,片偏移量的值以8字节为单位
- 分片过程中,除了最后一片,前面所有的分片封装的数据字节数一定是8的倍数
IP分片过程:
- 假设源IP分组总长度为\(L\),待转发路径的MTU为\(M\)
- 若\(L>M\),且\(DF=0\),则可以/需要分片
- 分片时每个分片的标识字段复制源IP分组的标识字段值
- 通常分片时,除了最后一个分片,其他分片均分为MTU允许的最大分片
- 一个最大分片可封装的数据应该是8的倍数,因此一个最大分片可封装的数据长度为:
- \(-20\)表示减去20字节的IP首部
- 需要的总片数:
- 每片的片偏移字段取值为:
- 每片的总字段长度为:
- 每片的MF标志位为:
例如:
- 4000字节数据报
- 输出链路MTU=1500B
- DF=0
原数据报:

分片后:

IP路由操作的命令
- winipcfg(ipconfig)
使用环境:Windows系统
使用格式:winipcfg [/?] [/all]
参数:
/?
:显示winipcfg的格式和参数的英文说明/all
:显示所有的有关IP地址的配置信息
主要功能:显示用户所在主机内部的IP协议的配置信息
C:\Users\lenovo>ipconfig /all
Windows IP 配置
主机名 . . . . . . . . . . . . . : Lethereat
主 DNS 后缀 . . . . . . . . . . . :
节点类型 . . . . . . . . . . . . : 混合
IP 路由已启用 . . . . . . . . . . : 否
WINS 代理已启用 . . . . . . . . . : 否
以太网适配器 VMware Network Adapter VMnet1:
连接特定的 DNS 后缀 . . . . . . . :
描述. . . . . . . . . . . . . . . : VMware Virtual Ethernet Adapter for VMnet1
物理地址. . . . . . . . . . . . . : 00-50-56-C0-00-01
DHCP 已启用 . . . . . . . . . . . : 否
自动配置已启用. . . . . . . . . . : 是
本地链接 IPv6 地址. . . . . . . . : fe80::993a:5107:1579:c306%10(首选)
自动配置 IPv4 地址 . . . . . . . : 169.254.195.6(首选)
子网掩码 . . . . . . . . . . . . : 255.255.0.0
默认网关. . . . . . . . . . . . . :
DHCPv6 IAID . . . . . . . . . . . : 1140871254
DHCPv6 客户端 DUID . . . . . . . : 00-01-00-01-22-FC-1D-05-8C-16-45-17-B6-93
DNS 服务器 . . . . . . . . . . . : fec0:0:0:ffff::1%1
fec0:0:0:ffff::2%1
fec0:0:0:ffff::3%1
TCPIP 上的 NetBIOS . . . . . . . : 已启用
- netstat
适用环境:Windows系统
使用格式:netstat [-r] [s] [-n] [-a]
参数:
- -r:显示本机路由表的内容
- -s:显示每个协议的使用状态(包括TCP、UDP、IP)
- -n:以数字表格形式显示地址和端口
- -a:显示所有主机的端口号
主要功能:使用户了解到自己的主机是如何与因特网连接的
C:\Users\lenovo>netstat -n
活动连接
协议 本地地址 外部地址 状态
TCP 127.0.0.1:1024 127.0.0.1:1025 ESTABLISHED
TCP 127.0.0.1:1025 127.0.0.1:1024 ESTABLISHED
TCP 127.0.0.1:1026 127.0.0.1:1027 ESTABLISHED
TCP 127.0.0.1:1027 127.0.0.1:1026 ESTABLISHED
TCP 127.0.0.1:1028 127.0.0.1:1029 ESTABLISHED
TCP 127.0.0.1:1029 127.0.0.1:1028 ESTABLISHED
TCP 127.0.0.1:1030 127.0.0.1:1031 ESTABLISHED
TCP 127.0.0.1:1031 127.0.0.1:1030 ESTABLISHED
TCP 127.0.0.1:1032 127.0.0.1:1033 ESTABLISHED
TCP 127.0.0.1:1033 127.0.0.1:1032 ESTABLISHED
TCP 127.0.0.1:1036 127.0.0.1:1037 ESTABLISHED
TCP 127.0.0.1:1037 127.0.0.1:1036 ESTABLISHED
3.4 IPv4编址
IP分组:
- 源地址(SA) -> 从哪儿来
- 目的地址(DA) -> 到哪儿去
IP数据报从主机的网络接口发出,到达目的主机的网络接口
接口:主机/路由器与物理链路的连接
- 实现网络层功能
- 路由器通常有多个接口
- 主机通常只有一个或两个接口
IP地址:32位(IPv4)编号标识主机、路由器的接口
- 32位地址记忆起来很困难
- 通常会将32位的IPv4地址分成4个8位组,每8比特单独转换为10进制,再用小数点连起来
- 11011111 00000001 00000001 00000001 -> 223.1.1.1
- 点分十进制表示法
IP地址与每个接口关联,习惯上称之为“某主机的IP地址”(该主机只有一个接口)
问题:如何为接口分配IP地址?
- 如果随机分配,无规律可循,作为网络中实现准确数据报传递的数据报传递的路由器,转发表会变得非常复杂
- 子网划分
3.4.1 子网
IP地址可分为两部分:
- 网络号(NetID)——高比特位
- 主机号(HostID)——低比特位

- 遵循基本原则:保证分配到某个区域网络中的接口的IP地址的网络号相同

具有相同网络号的接口构成了一个IP子网。
- 从网络层角度看,利用网络好可以描述这个区域的网络
IP子网:
- IP地址具有相同网络号的设备接口
- 不跨越路由器(第三级以上网络设备)可以彼此物理联通
- 即跨越路由器就不是一个IP子网
问:图中网络有多少个IP子网?

- 可以将网络层之上的设备去除(路由器、主机),接口保留,可以得到网络中存在很多“孤岛”
- 6个子网
如何确定网络号和主机号各自的长度?
3.4.2 有类IP地址
有类编址,将整个32位地址空间进行划分——二分法
-
A类地址
- 网络号:高比特位前8位,即第一个8位组固定为0
- 网络空间大小为\(2^7\),占据所有IPV4地址空间的50%
- 0.0.0.0 ~ 127.255.255.255范围内的网络地址为A类地址
-
B类地址
- 网络号:高比特位前16位,即前两个8位组固定为10
- 网络空间大小为\(2^{14}\),占据所有IPV4地址空间的25%
- 128.0.0.0 ~ 191.255.255.255范围内的网络地址为B类地址
-
C类地址
- 网络号:高比特位前24位,即前三个8比特位固定为110
- 网络空间大小为\(2^{21}\),占据所有IPV4地址空间的12.5%
- 192.0.0.0 ~ 223.255.255.255范围内的网络地址为C类地址
-
D类地址
- 32位全部为网络号,8比特位固定为1110
- 网络空间大小为\(2^{28}\),占据所有IPV4地址空间的6.25%
- 用作特殊目的,标识网络中一组主机,这组主机理论上可以分布在互联网的任意地方,只能作为目的地址
- 这种地址称为多播地址/组播地址
- 224.0.0.0 ~ 239.255.255.255
-
E类地址
- 32位全部为网络号,8比特位固定为1111
- 网络空间大小为\(2^{28}\),占据所有IPV4地址空间的6.25%
- 作为研究使用
- 240.0.0.0 ~ 255.255.255.255
A、B、C类地址可以用于标识网络中的一个网络接口。
-
A类地址可区分的网络数比较少,但每一个A类Ip子网可区分的主机数很大。因此A类网络数很少,但每个网络很庞大。C类则相反,可区分的网络数比较多,但每个网络可区分的主机数比较少。B类网络比较折中。
-
A、B、C类地址中有些地址有特殊作用,不能被分配。
特殊地址
NetID | HostID | 作为IP分组源地址 | 作为IP分组目的地址 | 用途 | 备注 |
---|---|---|---|---|---|
全0 | 全0 | 可以 | 不可以 | 在本网范围内表示本机;在路由表中用于表示默认路由(相当于表示整个Internet网络) | 当主机不明确自己的IP地址,但还需要发送分组时,源IP地址则为0.0.0.0 |
全0 | 特定值 | 不可以 | 可以 | 表示本网内某个特定主机 | 默认源主机IP与发送主机IP相同 |
全1 | 全1 | 不可以 | 可以 | 本网广播地址(路由器不转发) | 255.255.255.255,受限广播地址 |
特定值 | 全0 | 不可以 | 不可以 | 网络地址,表示一个网络 | |
特定值 | 全1 | 不可以 | 可以 | 直接广播地址,对特定网络上的所有主机进行广播 | |
127 | 非全0或非全1的任何数 | 可以 | 可以 | 用于本地软件环回测试,称为环回地址 | 常用127.0.0.1 |
私有IP地址
只用于内部网络,在公共互联网上这部分地址无效。
Class | NetIDs | Blocks |
---|---|---|
A | 10 | 1 |
B | 172.16 ~ 172.31 | 16 |
C | 192.168.0 ~ 192.168.255 | 256 |
IP地址的使用范围
Class | 最大网络数 | 第一个可用网络号 | 最后一个可用网络号 | 每个网络中最大主机数 |
---|---|---|---|---|
A | 126(\(2^7-2\)) | 1 | 126 | 16,777,214 |
B | 16,383(\(2^{14}-1\)) | 128.1 | 191.255 | 65,534 |
C | 2,097,151(\(2^{21}-1\)) | 192.0.1 | 223.255.255 | 254 |
IP地址的特点
- IP地址是一种分等级的地址结构,分两个等级的好处是:
- IP地址管理机构在分配IP地址时只分配网络号,而剩下的主机号则由得到该网络号的单位自行分配,这样就方便了IP地址的管理
- 路由器仅根据目的主机所连接的网络号来转发分组(而不考虑目的主机号),这样就可以使得路由表中的项目数大幅减少,从而减少了路由表所占的存储空间。
- 实际上IP地址是标志一个主机(或路由器)和一条链路的接口
- 当一个主机同时连接到两个网络上时,该主机就必须同时具有两个相应的IP地址,其网络号
net-id
必须是不同的,这种主机称为多归属主机(multihomed host)。 - 由于一个路由器至少应当连接到两个网络(这样它才能将IP数据报从一个网络转发到另一个网络),因此一个路由器至少应当有两个不同的IP地址。
- 当一个主机同时连接到两个网络上时,该主机就必须同时具有两个相应的IP地址,其网络号
- 用转发器或网桥连接起来的若干个局域网仍为一个网络,因此这些局域网都具有同样的网络号net-id。
- 所有分配到网络号net-id的网络,范围很小的局域网,还是可能覆盖很大地理范围的广域网,都是平等的。
- 中国大陆地区拥有IP地址23846144个,合大约1.4个A类地址
- 在IP地址的主要三种类型里,各保留了三个区域作为私有地址,其地址范围如下:
- A类地址:10.0.0.0~10.255.255.255
- B类地址:172.16.0.0~172.31.255.255
- C类地址:192.168.0.0~192.168.255.255
IP层转发分组的流程
- 有4个A类网络通过三个路由器连接在一起,每个网络上都可能有成千上万个主机
- 可以想象,若按照目的主机号来制作路由表,得出的路由表就会过于庞大
- 但若按主机所在的网络地址来制作路由表,则每个路由器中的路由表就只包含4个项目,这样就可使得路由表大大简化
在路由表中,对每一条路由,最重要的是<目的网络地址,下一跳地址>

根据目的网络地址就能确定下一跳路由器,这样做的结果是:
- IP数据报最终一定可以找到目的主机所在目的网络上的路由器(可能要通过多次的间接交付)
- 只有到达最后一个路由器时,才试图向目的主机进行直接交付
特定主机路由
- 这种路由是为特定目的主机指明一个路由
- 采用特定主机路由可使网络管理人员能更方便地控制网络和测试网络,同时也可在需要考虑某种安全问题时采用这种特定主机路由。
默认路由
- 路由器还可采用默认路由以减少路由表所占用的空间和搜索路由表所用的时间。
- 这种转发方式在一个网络只有很少的对外连接时是很有用的。
- 默认路由在主机发送IP数据报时往往更能显示出它的好处。
- 如果一个主机连接在一个小网络上,而这个网络只用一个路由器和因特网连接,那么在这种情况下使用默认路由是非常合适的。
注意:
-
IP数据报的首部中没有地方可以用来指明“下一跳路由器的IP地址”。
-
当路由器收到待转发的数据报,不是将下一跳路由器的IP地址填入IP数据报,而是送交下层的网络接口软件。
-
网络接口软件使用ARP负责将下一跳路由器的IP地址转换成硬件地址,并将此硬件地址放在链路层的MAC帧的首部,然后根据这个硬件地址找到下一跳路由器。
分组转发算法
-
从数据报的首部提取目的主机的IP地址D,得出目的网络地址为N。
-
若网络N与此路由器直接相连,则把数据报直接交付目的主机D;否则是间接交付,执行(3)。
-
若路由表中有目的地址为D的特定主机路由,则把数据报传送给路由表中所指明的下一跳路由器;否则,执行(4)。
-
若路由表中有到达网络N的路由,则把数据报传送给路由表指明的下一跳路由器;否则,执行(5)。
-
若路由表中有一个默认路由,则把数据报传送给路由表中所指明的默认路由器;否则,执行(6)。
-
报告转发分组出错。
3.4.3 IP子网划分与子网掩码
子网划分 subnetting

显然,在实际网络中,A类网络和B类网络都过于庞大,需要对其进行划分。
如何将一个IP子网划分为更小范围的子网?
- 子网划分
IP地址从两部分分化为三部分:
- 网络号 NetID——高比特位
- 子网号 SubID——原网络的主机号部分比特
- 主机号 HostID——低比特位

借用主机号的高比特位进行子网划分:

子网划分后利用路由器将其互联在一起。
例如:

在划分子网时需要给其他路由器发送一个通告,告知自己已经划分子网。划分子网后对外仍然是一个整体网络:

路由器R1的路由表,在划分子网后会增加三项,分别对应三个子网的接口。
通常会将NetID与SubID合到一起,称为子网部分(subnet part),HostID称为主机部分(host part)。
如何决定网络中有多少子网?——孤岛划分
如何确定是否划分了子网?利用多少位划分子网?
- 子网掩码
子网掩码
本地管理员必须能够决定将多少比特分配给SubID部分,一般以8比特为界限。
- 根据所需的网络数量和网络中的主机数量进行合理划分。
- 如何确定一个网络是否进行了子网划分?——子网掩码
子网掩码地址构造形如IP地址:
- 32位
- 点分十进制
取值:
- NetID、SubID都取1
- HostID都取0
例如:
- A类网络若未进行子网划分,其默认的子网掩码为255.0.0.0
- B类网络若未进行子网划分,其默认的子网掩码为255.255.0.0
- C类网络若未进行子网划分,其默认的子网掩码为255.255.255.0
- 借用3比特划分子网的B类网络的子网掩码:255.255.224.0
- 224:第三个8位字节的前三位都为1,后5位都为0,即224
子网地址+子网掩码 \(\rightarrow\) 准确确定子网大小
例如:
- 子网201.2.3.0,255.255.255.0,划分为等长的4个子网
- 思路:借用1比特,可划分2个子网;则划分为4个子网需要借用2比特
- 则分配子网的子网掩码为255.255.255.192(\(192_{10}=11000000_{2}\))
- C类网络的前24位都是NetID,故分配子网的IP前3个8比特位的值都是201.2.3
- 最后一个8比特位的值需要划分成SubID+HostID
- 第一个子网的IP地址为201.2.3.0(00000000)
- 第二个子网的IP地址为201.2.3.64(01000000)
- 第三个子网的IP地址为201.2.3.128(10000000)
- 第四个子网的IP地址为201.2.3.192(11000000)
路由器如何确定应该将IP分组转发到哪个子网?
- 将IP分组的目的IP地址与子网掩码按位与运算,提取子网地址
例如:
- 目的IP地址:172.32.1.112,子网掩码:255.255.254.0
-
则此IP分组到达的目的子网的子网地址为172.32.0.0(子网掩码:255.255.254.0)
-
地址范围:172.32.0.0 ~ 172.32.1.255
- 网络域固定
- 主机域从全0到全1
-
可分配地址范围:172.32.0.1 ~ 172.32.1.254
- 整个地址范围去除不能分配的地址
- 在本例中去除主机域全0地址,去除主机域全1地址
- 可分配IP地址数:\(256*2 - 1 - 1=510\)
-
广播地址:172.32.1.255
- 即主机域全1
一个C类网络划分子网举例

-
左侧一列对应每一个子网的子网地址
-
右侧一列对应每一个子网的广播地址
- 二者都不能分配
-
子网划分后不能分配的IP数变多,有点类似条形磁铁,整块条形磁铁只有两端有磁性,将其一分为二后,每一段的两端都有磁性,则总共有四段有磁性。
子网掩码是一个重要属性
- 子网掩码是一个网络或一个子网的重要属性
- 路由器与相邻路由器交换路由信息时,必须将自己所在网络(或子网)的子网掩码告诉相邻路由器
- 路由器的路由表中的每一个项目,处理要给出目的网络地址外,还必须同时给出该网络的子网掩码
- 若一个路由器连接在两个子网上就用有两个网络地址和两个子网掩码
例如,已知IP地址为141.14.72.24,子网掩码为255.255.192.0,试求网络地址?
- 由IP可得,其为一个B类网络;默认子网掩码应为255.255.0.0
- 因此将IP地址的第三个8位组与子网掩码的第三个8位组进行与运算:
如果将子网掩码改成255.255.224.0,得到的结果相同。
- 不同的子网掩码得出相同的网络地址,但不同的掩码的效果是不同的。
- 这有点类似于两栋楼A和B,A楼的201室和B楼的201室,其房间号都是201,但位于不同的建筑中。
从这其中可以看到,子网掩码1比特位不能太少,否则可能不同子网的两台主机IP地址与mask进行与运算后可能相同。
网络地址是一个网络的标识,IP地址是唯一标识一个接口的地址。
例子:
SubID向HostID借用3位,且SubID不能全0不能全1,则子网标识符可以取:
- 199.1.10.00100000 -> 199.1.10.32
- 199.1.10.01000000 -> 199.1.10.64
- 199.1.10.01100000 -> 199.1.10.96
- 199.1.10.10000000 -> 199.1.10.128
- 199.1.10.10100000 -> 199.1.10.160
- 199.1.10.11000000 -> 199.1.10.192
主机号长度为5个比特,主机地址空间中有\(2^5=32\)个IP地址,是否32个IP地址都可以被分配?
- 全0和全1都是不可分配的
- 全0表示当前子网
- 全1表示子网内的所有主机,用来广播
子网划分步骤
子网划分需要先知道网络号,给定一个网络号后进行网络地址划分,需要回答以下问题:
- 主机号中有多少比特可以借用?
- 子网掩码?
- magic number/乘数?
- 前三个子网的地址?
根据子网掩码确定哪些是网络地址域,哪些是主机域;在路由表中需要把子网掩码列出来,还有一种方式就是采用网络前缀形式:
- \(a.b.c.d/x\)
- \(x\)表示网络号字段+子网字段的长度
1. 需要借用多少比特?
看地址中有多少个主机号字段
- A类网络:24 bits
- B类网络:16 bits
- C类网络:8 bits
最少借2位,给主机号字段最少留2位
需要多少子网/多少主机?
- host bits = bits borrowed + bits left
- HB = BB + BL
例如,子网划分后需要有\(x\)个子网:
- \(2^{BB} - 2 \geq x\)
例如,子网划分后需要有\(x\)个主机数:
- \(2^{BL} - 2 \geq x\)
例如,有一个C类网络,地址为210.93.45.0(网络地址,不是IP端口地址)
- 划分至少5个子网,需要借多少bit?
- \(2^{BB}-2 \geq 5\)
- \(BB=3\)
- 剩余的主机号有多少位?
- BL = 8 - 3 = 5
- 每个子网可以给多少主机分配IP地址?
- \(2^5-2=30\)
例如。一个B类网络185.75.0.0,划分子网,使得每个子网有不超过126台主机,主机号需要保留多少bit?
- \(2^{BL}-2 \leq 126\)
- BL = 7
2. 子网掩码是多少?
例如一个C类地址,需要借3位,则子网掩码为:255.255.255.224(11100000)
其他类的地址以此类推即可。
3. magic number是多少?
magic number决定子网地址,大小 = 256 - 最后一个非零的8比特数
例如,255.255.255.224,则magic number = 256 - 224 = 32,则第一个可用子网应该以32为基数
C类网络借用位数与非零8比特数、主机数(\(2^{BL}-2\))的关系:
4. 确定子网地址
需要将magic number作为一个乘数:
例如C类网络210.92.45.0/24,需要在第四个8比特位上借用比特
magic number = 32时:
- 第一个子网号:210.93.45.32(1 * 32)
- 第二个子网号:210.93.45.64(2 * 32)
- 第三个子网号:210.93.45.96(3 * 32)
- ……
不采用magic number的方法:
C类默认子网掩码:255.255.255.0,每个子网主机数可以决定需要借用多少比特
若借用3比特,则子网掩码变为:255.255.255.224(11100000)
- 第一个子网号:210.93.45.32(00100000)
- 第二个子网号:210.93.45.64(01000000)
- 第三个子网号:210.93.45.96(01100000)
- ……
即借用3位后可以划分子网地址的个数为\(2^3-2=6\)个,这六个子网地址的差别仅仅体现在借用三位的每一位是1还是0上。由此可以确定划分每个子网的准确地址。
主机&广播地址
主机数需要-2,因为一个是网络地址,一个是广播地址
210.93.45.32,可以使用的地址范围是不是可以直接到x.x.x.63?的32个地址都可用?
- 32、63都不可以分配
可用:33-63
B类子网:
假设有一个网络:192.168.0.0/24,现在需要两个子网,那么使用/26而不是/25。得到两个可用的子网:192.168.0.64和192.168.0.128。
- 对于192.168.0.0/24:
- 网络地址是192.168.0.0,广播地址为192.168.0.255
- 对于192.168.0.0/26:
- 网络地址192.168.0.0,广播地址为192.168.0.63(00111111)
- 对于192.168.0.64/26:
- 网络地址为192.168.0.64(01000000),广播地址为192.168.0.127(01111111)
- 对于192.168.0.128/26:
- 网络地址为192.168.0.128(10000000),广播地址为192.168.0.191(10111111)
- 对于192.168.0.192/26
- 网络地址为192.168.0.192(11000000),广播地址为192.168.0.255(11111111)
一家集团公司有12家子公司,每家子公司又有6个部门,上级给出一个172.16.0.0/16的网段,需要给每家子公司及其部门分配网段。
-
划分各个子公司的网段
- \(2^{BB}-2 \geq 12\),BB=4
- 172.16.0.0/16借4位后:255.255.240.0
- magic number = 256 - 240 = 16
- 划分:
- 172.16.0.0/20
- 172.16.16.0/20
- 172.16.32.0/20
- 172.16.48.0/20
- ……
-
对每个子网划分6个小子网
- 借了4比特后:BL=20
- \(2^{n} -2 \geq 16\)
- n=3,再借3位
- 子网掩码:255.255.254.0(共借7位)
-
广播地址?可用地址范围?
练习:
- 哪一类网络?
- 借了多少比特?
- 非零8比特数?
- magic number?
-
192.168.15.0/26
- C类网络
- 借了26-24=2位
- 子网掩码:255.255.255.192(11000000)
- 非零8比特数:192
- magic number: 256 - 192 = 64
B类网络借的是第三个8比特位,计算子网号时改变的是第三个8比特位
逻辑与运算
子网划分之后的分组如何进行转发?
每个到达的分组需要根据IP地址和子网掩码进行与运算,来决定其子网是哪一个。
如果分组的MAC地址与发送分组的主机的目的MAC地址和子网掩码进行与运算,如果网络地址相同,路由器不会对其进行转发。
与运算后发现子网地址不同, 则进行转发
例如:
假设主机1要给主机2发送数据:
- H1并不知道H2连接在哪个子网上,只知道目的地址为128.30.33.128
- H1需要知道自身的网络地址是什么,即源主机知道其所在的网络地址为128.30.33.0,子网掩码为255.255.255.128
- 与H1直接相连的路由器,有转发表,记录如果受到分组的目的地址为128.30.33.0, 子网掩码为255.255.255.128,就从接口0进行转发;如果……
- H1首先检查目的主机128.30.33.138是否连接在本网络上
- 如何判断?将目的主机地址与本网络的子网掩码进行与运算,结果与本网络地址相同则说明目的主机连接在本网络上。
- 如果是,则直接交付
- 否则送交路由器R1(网关路由器),并逐项查找路由表
- 发送到R1后,R1让IP地址分别与转发表中每一项的子网掩码进行与运算,如果结果匹配则将其发送到对应接口。
在划分子网的情况下路由器转发分组的算法:
- 从受到的分组的首部提取目的IP地址\(D\)
- 先用各网络的子网掩码和\(D\)逐比特进行逻辑与,看是否和相应的网络地址匹配。如果匹配,则将分组直接交付。否则就是间接交付,执行(3).
- 若路由表中有目的地址为\(D\)的特定主机路由,则将分组传送给指明的下一跳路由器;否则执行(4)。
- 对路由表中的每一行的子网掩码和\(D\)逐比特进行逻辑与,若其结果与该行的目的网络地址匹配,则将分组传送给该行的下一跳路由器;否则执行(5)
- 若路由表中有一个默认路由,则将分组传送给路由表中所指明的默认路由器;否则执行(6)
- 报告转发分组出错。
3.5 IP地址分配
一台主机进入子网,如何获取IP地址?
3.5.1 硬编码
- windows
- unix
3.5.2 DHCP
DHCP(Dynamic Host Configuration Protocals)
-
从一个DNS服务器自动获取IP地址
-
即插即用,主机进入后可以自动运行DHCP协议,获取IP地址
-
分配IP的同时还需要分配子网掩码、网关、DNS服务器名称、DNS的IP地址、租赁期
-
允许地址重用,主机离开网络后可以将其IP地址回收,可以分配给其他主机使用
-
支持移动用户
DHCP是如何获取IP地址的?
主机到达后,并不知道谁可以提供IP分配
- 发送DHCP发现报文(DHCP Discover msg)
- 网络中不止一个DHCP服务器,与到达主机在同一个子网内的所有DHCP服务器都会收到发现报文
- DHCP给整个网络广播一个DHCP提供报文(DHCP offer) msg
- 主机收到响应后,需要从多个DHCP服务器中选择一个合适的IP地址,再给该服务器发送DHCP请求报文(DHCP request)
- DHCP回复DHCP确认报文(DHCP ack)
例如,一台DHCP服务器,223.1.2.5
- DHCP discover:
- 主机源IP地址:0.0.0.0,68(port)
- 目的IP地址:子网广播地址,255.255.255.255,67
- 携带信息:yiaddr
- 事务ID:654
- DHCP offer:
- DHCP服务器的IP:223.1.2.5,67
- 目的IP地址:也是广播的,因为到达主机没有IP地址,255.255.255.255,68
- 可以提供的IP地址:223.1.2.4
- 所响应事务的ID:654
- 租赁期:3600s
- DHCP request
- 主机收到多个DHCP offer后选择一个
- 源IP地址:广播,0.0.0.0,68
- 目的地址:255.255.255.255,67
- 携带信息,选择的IP地址:223.1.2.4
- 事务号:655
- 选择的IP地址的租赁期:3600s
- DHCP ack:
- 源IP:223.1.2.5,67
- 目的地址:仍然是广播地址,255.255.255.255,68
- 可以提供的IP地址:223.1.2.4
- 所响应事务的ID:655
- 租赁期:3600s
DHCP发现、提供、请求、确认的目的IP地址都是受限广播地址
DHCP服务不只是分配子网内的IP地址:
- 还有第一跳路由器的IP地址(默认网关IP地址)
- DNS服务器的名称和IP地址
- 指出所在子网掩码
例子:
到达的主机需要用DHCP协议获取自己的IP地址、第一条路由器地址(默认网关)、DNS服务器地址
-
DHCP采用CS模式,报文封装到UDP的报文段中
-
将UDP报文段封装到IP数据报
-
再封装到链路层成帧
网络层涉及的目的IP地址是受限广播地址,对其进行链路层地址转换,其目的帧地址就应该是48位全1的MAC地址
子网内所有的端系统都会受到DHCP广播,但只有HDPC服务器才会做出响应
DHCP服务器端从帧进行分用,将帧的有效数据交付给网络层的IP数据报 -> UDP -> 应用层,给DHCP应用
DHCP服务器在形成DHCP确认报文,包含了分配给主机的IP地址、默认网关、DNS服务器的名称和IP地址
需要在DNS服务器对数据进行封装,再转发给客户端,客户端再对其进行分用,此时主机就知道了自己的IP地址等等
采用DHCP服务,不仅仅可以得到IP地址,还可以得到默认网关、DNS服务器的名称和IP地址
上面的方式是在一个网络区域内到达主机,如何获取IP地址
对于家庭用户来说,得到地址需要ISP分配,最上层的ISP需要和ICANN组织申请IP地址
IPv4地址不足,如何缓解?
3.6 IPv4地址枯竭
- 采用可变长度的子网掩码
- 无类别域间路由
- 网络地址转换,NAT
3.6.1 可变长子网掩码
例如,子网地址172.16.32.0/20,10101100.00010000.00100000.00000000
划分子网后根据网络规模限制,比如网络不是等大的,第一个子网1000台主机,第二个子网100台主机,显然如果采用普通子网划分,应该以1000为标准进行划分,但存在浪费问题
可变长子网掩码:
- 先借用4比特进行子网划分
- 部分子网用不到全部主机,则对其进行进一步的子网划分:
- 第一个子网:
3.6.2 CIDR
无类别域间路由 Classless InterDomain Routing
- 有类IP地址只是将32位IP地址划分为两部分:网络号和主机号 -> 网络号+子网号+主机号
- CIDR:没有类别和划分子网,直接将网络看作两部分:子网部分和主机部分
- 其地址为任意长度
- 格式:\(a.b.c.d/x\),其中\(x\)为子网号部分的位数
如果将其看作一个网络,相当于包含了两个C类网络的网络地址:200.23.16.0/24 + 200.23.17.0/24
其可以表示的地址数量为\(2^{classNetHostPartLength - HostPartLength}\)
例如,128.14.32.0/20表示的地址(\(2^{12}\)个地址):
路由聚合 route aggregation
一个CIDT地址块可以表示多个地址,这种地址的聚合称为路由聚合,使得路由表中的一个项目可以表示很多个原来传统分类地址的路由。
路由聚合也称为构成超网(supernetting)
CIDR虽然不使用子网,但仍然使用掩码这一名词(但不叫子网掩码)
对于/20
地址块,它的掩码是20个连续的1,斜线记法中的数字就是掩码中1的个数
10.0.0.0/10可以简写为10/10,就是将点分十进制中低位连续的0省略
10.0.0.0/10隐含第指出IP地址10.0.0.0的掩码是255.192.0.0,此掩码可表示为:
CIDR记法的其他形式
网络前缀的后面加一个*的表示方法
- 如00001010 00*,在*之前是网络前缀,而*表示IP地址中的主机号,可以是任意值
构成超网
前缀长度不超过23位的CIDR地址块都包含了多个C类地址
这些C类地址合起来就构成了超网
CIDR地址块中的地址数一定是2的整数次幂
网络前缀越短,其地址块包含的地址数就越多,而在三级结构的IP地址中,划分子网是将网络前缀变长
例如:
此ISP有64个C类网络,如果不采用CIDR技术,则没一个路由器的路由表中需要有64个表项
层次编址
使用单个网络前缀通告多个网络的能力称为地址聚合或路由聚合或路由摘要
-
200.23.16.0/23:200.23.0001000*
-
200.23.18.0/23:200.23.0001001*
-
……
-
200.23.30.0/23: 200.23.0001111*
可以发现,这些网络地址的前20位都是相同的,在建立路由表时发送通告可以以一个大的地址块:凡是目的地址为200.23.16.0/20的数据报,都可以接收。下面的ISP同理。
如果地址块不连续?
如果发送的目的IP地址是到达Org1的区域的某台主机,如果没有下面ISP,仍然用上面的ISP,则无法找到对应的主机。因为上面ISP的网络地址是可以匹配目的主机地址的。
此时需要增加通告,使得下面的ISP路由器上也要发送自己的网络地址通告,这样Internet路由表就有了两项,IP地址如果和子网掩码进行与运算,根据最长前缀匹配算法,可以找到正确路由。
例如,收到的分组的目的地址\(D=206.0.71.128\),路由表中的项目:
- 206.0.68.0/22 ISP
- 206.0.71.128/25 某一个系的表项
匹配过程:
- 查找路由表中的第一个项目
\(M\)=206.0.68.0/22 = 11111111 11111111 11111100 00000000
其有22个连续的1,只需要把\(D\)的第三个字节转换为2进制:
与206.0.68.0/22匹配。
- 第二个项目
\(M\)=206.0.71.0/22 = 11111111 11111111 11111111 10000000
具有25个连续的1,只需要把\(D\)的第四个字节转换为2进制:
与206.0.71.0/25匹配。
根据最长匹配原则,选择更具体的一个地址,即第二个地址
3.6.3 NAT技术
IP地址从区域ISP获得,其地址由上层ISP获得,顶层ISP由ICNAA获得地址块
对于A、B、C类网络,部分地址不能作为公网地址,只能作为私有地址
如何让私有IP地址之间可以互相通信?——NAT 网络地址转换
例如:
一台源主机10.0.0.1,属于A类私有地址,要与网络通信首先要进行地址转换
- 如果源主机和目的主机都在10.0.0.0/24这个子网内,则可以直接转发
- 如果源主机和目的主机不在同一子网内,所有发送的数据报都需要在NAT是能的路由器进行地址转换
- 将私有IP地址转换为NAT路由器的公网IP地址
动机:
- 从外部来看,整个局域网络,只使用一个IP地址
- 家庭内部地址不需要ISP进行分配,在局域网内的所有设备只需要一个公网IP地址
- 内部网络地址都是使用私有地址,内部网络的IP地址无论发生何种变化,对外界都是透明的,不需要发送通告
- 如果需要更换ISP,不需要修改内部网络设备的IP地址
- 在局域网络内部的设备,对外网是不可见的
- 外部网络主机不能直接寻址内网设备
- 提高了安全性
实现
NAT一般集成在路由器上
- 替换
- 当内网数据包到达NAT路由器,首先对数据包的源IP地址和端口号替为NAT路由器向外发送的IP地址和新生成的端口号
- 远端服务器并不知道这个数据包的源IP和端口号,只知道替换后的IP和端口号
- 记录
- 需要在NAT路由器的NAT转发表中记录源IP地址和port到NAT的IP和port映射
- 替换
- 当远端主机要反馈消息时,数据报经过NAT路由器时需要将其替换为源IP和port
实例:
私有网络IP地址,只有128.76.29.7是公网IP
- 主机10.0.0.1要发送数据报给128.119.40.186,port=80
- src=10.0.0.1, port=3345
- dest=128.119.40.168, 80
- 到达NAT使能路由器后:
- 需要将源IP地址替换为公网IP地址
- src=138.76.29.7
- 端口号替换
- port=5001
- 目的IP和port不变
- 远端主机做出响应
- 对新的端口号和IP做出响应
- src=128.119.40.186,80
- dest=138.76.29.7,5001
- NAT替换
- src=128.119.40.186,80
- dest=10.0.0.1,3345
NAT地址转换,解决的手段
- NAT利用了端口号,端口号是传输层的一个域
- 16位
- 可以区分6万多个端口,可以区分的连接数量位为六万多个
- 可以支持100多台主机
- 路由器实现下三层,最高网络层
- 对端口号来说,报文段的域
- NAT技术及修改了网络层IP也修改了第四层报文段,违反了分层结构
- 违反了端到端的通信原则
- 传输层实现端到端,端口号是传输层,原则上中间设备不应该修改端口
- NAT使得端到端应用开发必须考虑到NAT
- 人们认为解决地址枯竭问题应该是IPv6的工作,而不能通过破坏原则来实现
3.7 IPv6
为什么需要IPv6?
- 32位的IPv4地址分配殆尽
- 需要增长地址长度,扩大地址空间
- 对新的IP协议首部进行改进,提高数据报的处理和转发速率
- QOS 带有服务质量的首部
数据报格式
- 固定长度的40字节首部
- 不允许分片
3.7.1 IPv6首部
ver
- 4bite
- 版本号字段 -> 6
priority 优先级
- 8比特
- 相当于v4的TOS字段,标识数据报优先级,区别对待不同的数据报
flow label 流标签
- 标识一系列的流
- 根据不同的流标签可以提供不同的服务
payload len 载荷长度
- 16比特
- 最大载荷65535字节
- 实际上可选首部放到了数据部分,载荷长度既包含上一层报文段,也包括下一个首部 next header
next header
- 标识可选首部的位置/上层协议的首部
hop limit
-
条数限制
-
ICMP -> ICMP6
source address 源IPv6地址
- 128比特
destination address 目的IPv6地址
- 128比特
data 数据部分
与IPv4的不同:
- checksum 校验和
- IPv6中去除
- 每到达一个路由器不需要重新计算校验和
- options
- IPv6允许,但在首部之外,通过 next header标识其位置
- ICMPv6
- 错误报文
- 并不支持在路由器对大的数据报进行分片
- 如果确实太大,会将其丢弃,生成ICMPv6报文,向源主机发送,由源主机对其进行分片
- IGMP
- 互联网多播组管理协议
- IPv6中将这个协议的功能集成在了ICMPv6中
3.7.2 从IPv4到IPv6
所有路由器同时更新到IPv6?
- 不现实
- Internet需要长时间混合IPv4和IPv6
遵循IPv6的路由器发送到IPv4路由器如何进行数据交互?
- 隧道技术 tunneling
Tunneling
- 将IPv6数据报作为IPv4的报文段的一个有效数据载荷,通过它进行承载
例如:
3.8 路由选择算法
网络层提供三个核心功能:
- 转发
- 路由选择
- 建立连接
路由算法 -> 转发表 -> 转发
3.8.1 路由协议
目标:
- 从一点到另一点如何选择一条成本最低的路
- 路径:一系列路由器
- 路由选择:top-10 网络问题
3.8.2 图的抽象
图的权重
3.8.3 分类
根据更新规律:
- 静态路由
- 网络管理员手工配置
- 动态路由
- 路由表可以用路由算法动态更新
- 可以对链路的拓扑结构和成本的改变快速做出响应,周期计算
根据网络拓扑信息规模:
- 全局算法
- 所有路由器都需要有整个网络的完整拓扑结构和链路成本
- 例如链路状态算法
- 分散算法
- 路由器不需要知道整个网络的拓扑结构
- 只需要知道与其相邻的节点的IP地址、成本等信息
- 到达远端路由器需要有一个迭代计算过程,与邻居节点交换信息实现路由选择
- 例如距离向量算法
3.8.4 链路状态算法 Link state algorithms
Dijkstra算法
-
连接关系
-
链路成本
-
采用广播机制使得每个节点都可以知道整个网络的信息
迭代机制,每次迭代可以找到一个节点到目的节点的最小路径
标识:
- \(c(x,y)\):节点x到节点y的链路成本,如果两个节点不相邻则为\(\infty\)
- \(D(v)\):从源节点到目的节点\(v\)路径的当前成本
- \(p(v)\):从源节点到达目 的节点\(v\)链路上的\(v\)节点的前序节点
- \(N'\):已经确定最小成本路径的节点集合
Initialization:
N' = {u}
for all nodes v
if v adjacent to u
then D(v) = c(u,v)
else D(v) = inf
Loop
find w not in N' such that D(w) is a minimum
add w to N'
update D(v) for all v adjacent to w and not in N':
D(V) = min(D(v), D(w) + c(w,v))
until all nodes in N'
例子:找到节点u到其他节点的最短路径
过程:
震荡问题 Oscillations
假设有一个环形图:
-
每个节点都会有一定的传输数据承载信息量,边的权值就是承载的数据量
-
即数据经过B后就会给链路增加1权值,经过C增加e权值,经过D增加1权值
- 初始状态:C通过B将数据转发给A,B将数据直接给A,D直接给A
C到B的传输权值就是e,B到A的传输权值是1,则BA链路承载的权值就是1+e
已知每条链路上的链路成本,CB->e, BC->1+e,BA->1
每个路由器到A应该走哪条路径?
显然,B->C->D->A, C->D->A, D->A
下一个时刻:
此时DA->2+e, CD->1+e, BC->1
每个路由器到达A应该走的路径:
D->C, C->B->A, B->A
下一个时刻:
此时BA->2+e,CB->1+e,DC->1
路径:
B->C,C->D,D->A
下一时刻:
由此可见,路径选择是左右左右……
存在震荡问题:当B通过计算权重确定了一条路径,并开始传输时,如果只传输了一部分,在重新计算权重后更换了路径,又有其他路由器发送了数据到B,这样不停迭代,会有数据报永远无法到达A。
如何避免?
链路状态的分析速率过快,引入随机延时
3.8.5 距离向量算法 Distance Vector Algorithm
Bellman-Ford equation (动态规划)
\(d_x(y)\): cost of least-cost path from x to y
\(d_x(y) = min\{c(x,v) + d_v(y)\}\)
例如:
已知\(d_v(z)=5\),\(d_x(z)=3\),\(d_w(z)=3\)。
则有:
-
\(D_x(y)\):作为x到y的最小成本的估计值,不一定等于\(d_x(y)\)
-
距离向量:\(D_x=[D_x(y): y \in N]\)
-
源节点x需要告知到达每个节点的成本
-
x维护\(D_x=[D_x(y): y \in N]\)
-
源节点x维护其邻居节点的距离向量
- 对于x的每个邻居节点v,x需要维护:\(D_v=[D_v(y): y \in N]\)
-
基本思想
- 每个节点都周期性发送自身的距离向量给其邻居
- 当节点收到新的距离向量的评估,或其到邻居节点的成本发生改变,就需要更新自身的估计值
- \(D_x(y) \leftarrow min_v\{c(x,v) + D_v(y)\} \space for \space each \space node \space y \in N\)
- 当前距离向量的估计如果发生改变,需要将改变后的距离向量的估计值告知邻居节点
- 在一定条件下,\(D_x(y)\)就会趋近于真正的\(d_x(y)\)
-
特征
- 异步迭代
- 每个路由器重新估计距离向量的动作是独立的
- 分布式
- 每个节点只有当其距离向量的值发生变化时才会通知邻居
- 异步迭代
例如:
箭头表示告知
距离向量算法特征
- 节点通过探测报文发现链路成本是否变化
- 如果变化则需要更新距离向量,同时通知其邻居节点
-
假设在\(t_0\)时刻,y检测到原来y到x的成本由4变成了1(好消息),需要更新DV,同时发送给x和z
- 为了简便,只考虑y和z到达x的情况
-
在\(t_1\),z收到了y的DV值,z通过方程计算z到x的DV:
则z经过y进行转发,此时z更新DV值,通告给y
则有:
即\(D_y(x)\)的值没有发生变化,y不会再根据z通告给它的DV再次更改自己的DV值,此时DV算法收敛
好的消息传播得更快
- 如果y到x的成本由4变成了60(坏消息):
可能形成无穷计数问题(count to infinity)
只考虑y和z到达x的情况:经过44次迭代才能够到达最后的稳定状态
\(t_0\)时刻:
y到x的成本发生改变,\(D_y(x)\)重新计算:
\(t_1\)时刻:
y将其DV通告给z,\(D_z(x)\)重新计算:
则有:
以此类推,\(D_y(x)\)和\(D_z(x)\)会不断增加,直到\(D_y(x)=50, D_z(x)=51\),经过44次迭代才会达到稳定状态
由环路引起的无穷计数问题
毒性逆转 poissioned reverse
如果z到达x是通过y转发的:
- z会把“z到x的距离是无穷大”这个消息告诉y
例如:
\(t_0\)时刻:
z通告y\(D_z(x)=\infty\)
计算\(D_y(x)\):
则有:
y通告z,z再计算其DV:
则有:
以此类推:
达到稳定状态,算法收敛
毒性逆转也不一定能够消除无穷计数问题
3.8.6 LS vs DV
消息传递的时间复杂度
-
LS
- 宏范发送消息,\(O(nE)\)
-
DV
- 邻居交换信息,但收敛时间未知
收敛速度
- LS
- \(O(n^2)\),需要\(O(nE)\)次消息传递
- 震荡问题
- DV
- 收敛时间可变,无穷计数问题
健壮性:如果有路由器失效
- LS
- 广播出错的链路成本
- 每个节点只计算自己的路由表,不会通告出错信息
- DV
- 更新自身的同时需要将自己的DV通告给邻居
- 错误可能传播到整个网络