计算机网络(网络层)
网络层服务
概述
从发送主机向接收传送数据段
发送主机:将数据封装到数据包中
接收主机:向传输层交付数据段
每个主机和路由器都运行网络层协议
路由器检验所有穿越它的$IP$数据报的头部域,决策如何处理$IP$数据报
网络层的核心功能
转发(forwarding):将分组从路由器的输入端口转移到合适的输出端口
路由(routing):确定分组从源到目的的经过的路径
- 路由算法
某些网络的重要功能—连接建立
- 数据分组传输之前两端主机需要首先建立虚拟/逻辑连接,网络设备(如路由器)参与连接的建立
- 不同于传输层的两个应用进程之间,对中间网络设备透明,网络连接是两个主机之间,路径上的路由器等网络设备参与其中的
网络层服务模型
无连接服务:不事先为系列分组的传输确定传输路径,每个分组独立确定传输路径,不同分组可能传输路径不同
- 数据报网络:简化网络,复杂“边缘”
连接服务:首先为系列分组的传输确定从源到目的经过的路径,然后沿该路径传输系列分组,系列分组传输路径相同
- 虚电路网络:简化“边缘”,复杂网络
虚电路网络
虚电路($VC$)
一条从源主机到目的主机,类似于电路的逻辑(逻辑连接)
- 分组交换
- 每个分组的传输利用链路的全部带宽(不同于电路交换的复用)
- 源到目的路径经过的网络层设备共同完成虚电路网络功能
- 通信过程
- 呼叫建立 、数据传输、拆除呼叫
- 每个分组携带虚电路标识$VCID$,而不是目的地址
- 虚电路经过的每个网络设备都需要维护它的连接状态
- 链路、网络设备资源(如带宽、缓存)可以面向$VC$进行预分配来达到一些预期的服务性能
$VC$的具体实现
每条虚电路包括:
- 从源主机到目的主机的一条路径
- 虚电路号$VCID$,沿路每段链路一个编号。($VCID$反映链路的通信能力,不同链路的通信能力不同,$VCID$也不能相同)
- 沿路每个网络层设备,利用转发表记录经过的每条虚电路
同一条$VC$,在每段连路上的$VCID$通常不同,路由器转发分组是依据转发表改写/替换虚电路号
虚电路信令协议
$(signaling protocols)$
用于$VC$的建立、维护与拆除,建立过程中路由选择
典型的虚电路网络:ATM、帧中继(frame-relay)网络
数据报网络
无连接
每个分组携带目的地址
路由器根据分组的目的地址转发分组
- 基于路由协议/算法构建转发表
- 检索转发表
- 每个分组独立选路
数据报转发表
如果转发表的目的地址都是具体地址,则数量太过庞大,很难实现,所以转发表中存储目的地址
如果划分不那么完美
最长前缀匹配优先:优先选择与分组目的地址匹配前缀最长的入口
Internet网络层
一般来说,实现$IP$协议也要同时实现$ICMP$协议
ARP地址解析协议
ARP表:在LAN中的每一个IP节点维护一个表,存储LAN节点的IP/MAC地址映射关系
- TTL:经过这个时间以后该映射关系会被遗弃,典型值为20min
通过ARP表在已知目的接口IP地址的前提下确认其MAC地址
- ARP 进程在本局域网上广播发送一个ARP 请求分组(具体格式可参阅[COME06] 的第23 章)。图4-ll(a)是主机A 广播发送ARP 请求分组的示意图。ARP 请求分组的主要内容是:“我的IP 地址是209.0.0.5, 硬件地址是00-00-C0-15-AD-18 。我想知道IP 地址为209.0.0.6 的主机的硬件地址。”
- 广播MAC地址为全1
- 在本局域网上的所有主机上运行的ARP 进程都收到此ARP 请求分组。
- 主机B 的IP 地址与ARP 请求分组中要查询的IP 地址一致,就收下这个ARP 请求分组,并向主机A 发送ARP 响应分组(其格式见[COME06]), 同时在这个ARP 响应分组中写入自己的硬件地址。由千其余的所有主机的IP 地址都与ARP 请求分组中要查询的IP 地址不一致,因此都不理睬这个ARP 请求分组,见图4-ll(b) 。ARP 响应分组的主要内容是:“我的IP 地址是209.0.0.6, 我的硬件地址是08-00-2B-OO-EE-OA 。”请注意:虽然ARP 请求分组是广播发送的,但ARP 响应分组是普通的单播,即从一个源地址发送到一个目的地址。
- 主机A 收到主机B 的ARP 响应分组后,就在其ARP 高速缓存中写入主机B 的IP地址到硬件地址的映射。
当主机A 向B 发送数据报时,很可能以后不久主机B 还要向A 发送数据报,因而主机B 也可能要向A 发送ARP 请求分组。为了减少网络上的通信量,主机A 在发送其ARP 请求分组时,就把自己的IP 地址到硬件地址的映射写入ARP 请求分组。当主机B 收到A 的ARP 请求分组时,就把主机A 的这一地址映射写入主机B 自己的ARP 高速缓存中。以后主机B 向A 发送数据报时就很方便了。
从一个LAN路由到另一个LAN路由,发给LAN内的网关。
$IP$
$IP$数据报
格式
版本号,占4位
首部长度占4位:$IP$分组首部长度
- 以4字节为单位,乘以4才是首部长度,例如首部长度字段为5,则表示$IP$首部长度为20字节
$TOS$占8位:指示期望获得哪种类型的服务,也叫区分服务,只有在网络提供区分服务时使用,一般情况下不使用
总长度:$IP$分组的总字节数(首部+数据)
- 最大$IP$分组的总长度:$65535B$
- 最小的$IP$分组首部$20B$
- $IP$分组可以封装的最大数据为$65535 - 20 = 65515B$
标识$ID$:标识一个$IP$分组
- $IP$协议利用一个计数器,每产生一个$IP$分组计数器加1,作为该$IP$分组的标识
- 标识不足以唯一标识一个$IP$分组,还需要利用源、目的$IP$地址等才能唯一标识一个$IP$分组
标志位:
| 保留 | $DF$ | $MF$ |
| —— | —— | —— |$DF(Don’t Fragment)$: 为1禁止分片,为0允许分片
$MF(More Fragment)$:为1表示非最后一片,为0表示最后一片(或未分片)
片偏移:一个$IP$分组分片封装原$IP$分组数据的相对偏移量
- 以8字节为单位
$TTL$:$IP$分组在网络中可以通过的路由器数(或跳步数),路由器转发一次分组$TTL$减1,如果$TTL=0$,路由器则丢弃该$IP$分组
协议:指示$IP$分组封装的是哪个协议的数据包
- 可以实现复用/分解;例如6表示封装的是$TCP$段,17位表示封装的是$UDP$段
首部校验和:实现对$IP$分组首部的差错检测
- 计算校验和时该字段全置为0,采用反码算数运算求和,和的反码作为首部校验和字段
- 逐跳计算,逐跳校验:因为每次转发首部都会发生变化,例如$TTL$每次转发都会减1
选项字段:$1$~$40B$,携带安全、源选路径、时间戳和路由记录等内容,实际上很少被使用
填充:$0$~$3B$,目的是补齐整个首部,符合32位对齐,保证首部长度是4字节的倍数
$IP分片$
最大传输单元$MTU$:链路层数据帧可封装数据的上限
不同链路的$MTU$不同
当两条链路$MTU$不一样时,可能会发生大的向小的传输的情况
大的$IP$分组向较小的$MTU$链路转发时,可以被分片(如果不允许分片路由器会选择将分组丢掉)
1个$IP$分组分为多片$IP$分组
$IP$分片到达目的主机后进行“重组”
$IP$首部相关字段用于标识分片以及确定分片的相对顺序(字段描述见格式部分)
(如果目的主机没有收全,会等待一段时间后将所有分组都丢弃)
过程($IP$分组总长度为$L$,待穿法链路的$MTU$为$M$,$L > M$)
$DF = 0$
分片时每个分片的标识复制原$IP$分组的标识
通常分片时,除最后一个分片,其他分片均分为$MTU$允许的最大分片
一个最大分片可封装的数据应该是8的倍数,因此,一个最大分片可封装的数据为:
需要的总片数为:
$IP$编址
接口:主机/路由器与物理链路的连接
- 实现网络层功能
- 路由器通常有多个接口
- 主机通常只有一个或两个接口
$IP$地址:32比特($IPv4$)
- 标识主机、路由器的接口
- $IP$地址与每个接口关联
(点分十进制)
$IP$地址:
网络号—高位比特
主机号—低位比特
| $NetID$ | $HostID$ |
| ———- | ———— |
$IP$子网:
- $IP$地址具有相同网络号的设备接口
- 不跨越路由器(第三以及上层网络设备)可以彼此物理联通的接口
6
有类$IP$地址
- A 类、B 类和C 类地址的网络号字段(在图中这个字段是灰色的)分别为1 个、2 个和3 个字节长,而在网络号字段的最前面有1~3 位的类别位,其数值分别规定为0, 10 和110 。
- A 类、B 类和C 类地址的主机号字段分别为3 个、2 个和1 个字节长。
- D 类地址(前4 位是1110) 用于多播(一对多通信)。
- E 类地址(前4 位是1111) 保留为以后用。
B类网络可以指派的最小网络地址是128.1.00
C类网络可以指派的最小网络地址是192.0.1.0
特殊$IP$地址
全0用于在自身主机不知道自身的$IP$但仍然要传播分组的时候,一个例子是$DHCP$的工作过程
==xxr书上第二行是可以、不可以,从后面的ppt来看,xxr是对的==
私有$IP$地址
子网划分与子网掩码
将$IP$子网划分为更小范围的子网
$NetID$ | $SubID$ | $HostID$ |
---|---|---|
- $SubID$原主机号部分比特
子网掩码
- 形如$IP$地址,点分十进制形式
- 对应$NetID、SubID$位取1,$HostID$位取0
子网掩码+子网划分确定子网的大小
将$IP$分组的目的$IP$地址与子网掩码按位与运算,提取子网地址
一个C类地址的划分例子
$CIDR$与路由聚合
无类域间路由($Classless InterDomain Routing$)
- 消除了有类地址的界限
- 把网络号+子网号统一为一个可以任意长度的前缀
- 融合子网地址与子网掩码,方便子网划分
- $a.b.c.d/x$,其中$x$为前缀长度
提高$IPv4$地址空间分配效率
提高路由效率
将多个子网聚合为一个较大的子网
构造超网(一个较大的子网)
路由聚合($route aggregation$):面对较大的子网记录转发信息,节省路由表,提高路由效率
层级编制使得路由器信息通知更高效:
地址不一定连续,聚合的子网中有可能会缺少一部分,此时要在路由器中添加缺少的部分,利用最长前缀匹配正确转发
网络地址转换$NAT$
使用私有地址的主机要进行通信必须要进行地址转换
动机
- 只需/能从$ISP$申请一个$IP$地址
- $IPv4$地址耗尽
- 本地网络设备$IP$地址的变更,无需通知外界网络
- 变更$ISP$时,无需修改内部网络设备$IP$
- 内部网络设备对外部网络不可见,即不可直接寻址(安全)
实现
替换
- 利用($NAT \space IP$ 地址,新端口号)替换每个外出$IP$数据报的(源$IP$地址,源端口号)
记录
- 将每对($NAT \space IP$ 地址,新端口号)与(源$IP$地址,源端口号)的替换信息存储到$NAT$转换表中
替换
- 根据$NAT$转换表,利用(源$IP$地址,源端口号)替换每个进入内网$IP$数据报的(目的$IP$地址,目的端口号),即($NAT \space IP$ 地址,新端口号)
16比特的端口号字段可以同时支持60000多并行连接
主要争议:
- 路由器应该只处理第三层功能
- 违背端到端通信原则
- 应用开发者必须考虑到$NAT$的存在,例如$P2P$应用
- 地址短缺问题应该有$IPv6$来解决
$NAT$穿透问题
静态配置$NAT$,将特定端口的连接请求转发给服务器
利用$UPnP$互联网网关设备协议自动配置
- 学习到$NAT$公共$IP$地址
- 在$NAT$转换表中,增删端口映射
中继(如$Skype$)
- $NAT$内部的客户与中继服务器建立连接
- 外部客户也与中继服务器建立连接
- 中继服务器桥接两个连接的分组
$ICMP$
报文种类
(互联网控制报文协议)
支持主机和路由器:
- 差错报告
- 网络探询
两类报文:
- 差错报告报文(5种)
- 目的不可达
- 源抑制(当路由器发现自身缓存已满导致后续报文被丢弃,向源主机发送该报文,期望源主机降低发送速率)
- 超时/超期($TTL$)
- 参数问题(路由器认为首部参数有问题而丢弃)
- 重定向(路由器认为数据报不应该由自己来转发)
- 网络探询报文(2组)
- 回声($Echo$)请求与应答报文($Reply$)
- ping利用该种报文
- 时间戳请求与应答报文
- 回声($Echo$)请求与应答报文($Reply$)
几种不发送$ICMP$差错报告报文的特殊情况
- 对$ICMP$差错报告报文不在发送$ICMP$差错报告报文
- 除了第一个$IP$数据分片以外,对后续分片均不发送
- 多播$IP$数据报不发送
- 对具有特殊地址(如$127.0.0.1或0.0.0.0$)的$IP$数据报不发送
几种$ICMP$报文已不再使用
- 信息请求与应答报文
- 子网掩码请求与应答报文
- 路由器询问和通告报文
报文格式
$ICMP$报文封装到$IP$数据报中传输
差错报告报文数据封装
应用
$Traceroute$
$IPv6$
动机
- $IPv4$地址空间已分配殆尽
- 改进首部格式
- 快速处理/转发数据报
- 支持$QoS$
格式
$IPv6$数据报格式:
- 固定长度的40字节基本首部
- 不允许分片
- 优先级(priority):标识数据报的优先级
- 流标签(flow Label):标识同一“流”中的数据报
- 下一个首部:标识下一个首部,最后一个首部指向上层协议首部(如TCP首部)
改变
校验和被彻底移除,以减少每跳处理时间
选项机制改变,定义多个选项首部,通过“下一个首部”字段指示
$ICMPv6$:新版$ICMP$
- 附加报文类型,例如“$Packet \space Too \space Big$”
- 多播组管理功能
基本地址类型
地址表现形式(8组,每组4位16进制数1)
不在有广播地址,定义为特殊的多播
过渡
隧道(tunneling):$IPv6$数据报作为$IPv4$数据报的载荷进行封装,穿越$IPv4$网络
路由算法
网络抽象:图
关键问题:源到目的的最小费用路径是什么
路由算法:寻找最小费用路径的算法
分类
静态路由:
- 手工配置
- 路由更新慢,需要人工改动
- 优先级高
动态路由:
- 路由更新快
- 定期更新
- 即是响应链路费用或网络拓扑变化
全局信息:
- 所有路由器掌握完整的网络拓扑和链路费用信息
- 链路状态$LS$路由算法
分散信息:
- 路由器只掌握物理相连的邻居以及链路费用
- 邻居间信息交换、运算的迭代过程
- 距离向量($DV$)路由算法
链路状态路由算法
$Dijkstra$算法
所有结点掌握网络拓扑和链路费用
- 通过“链路状态广播”
- 所有结点拥有相同信息
计算从一个结点到达所有其它结点的最短路径,获得该结点的转发表
迭代:k次迭代后得到到达k个目的节点的最短路径
存在震荡可能
往往会采取一些措施避免例如随机延迟的链路状态更新
距离向量算法
($Distance \space Vector$)
$Bellman-Ford$方程(动态规划)
举例
第二列的(x,z)由7变为3,因为计算$c(x,y)+D{y}(x)$比$c(x,y)+D{z}(z)$更小
第三列因为y没有发生变化,所以不用更新
链路费用变化:节点检测本地链路费用变化,更新路由信息,重新计算距离向量,如果$DV$改变,通告所有邻居
好消息(变小)传播快
坏消息(变大)传播慢:无穷计数问题
毒性逆转:如果一个节点(z)到达某目的(x)的最小费用路径是通过某个邻居(y)则通告给该邻居节点到达目的的距离为无穷大
最大度量值:定义一个最大的有效费用值,超过则表示无穷
层次路由
聚合路由器为一个区域:自治系统$AS$
同一个$AS$内的路由器运行相同的路由协议
- 自制系统内部路由协议
- 不同自治系统内的路由器可以运行不同的$AS$内部的路由协议
网关路由器(gateway router)
- 位于$AS$边缘
- 通过链路连接其他$AS$的网关路由器
转发表由$AS$内部的路由算法与$AS$间路由算法共同配置
自治系统间路由
热土豆路由:将分组发送给最近的网关路由器
$RIP$协议
($Routing \space Information \space Protocol$)
$AS$内部路由协议也称为内部网络协议$IGP$
利用距离向量路由算法
- 距离度量:跳步数(max = 15 hops),每条链路一个跳步
- 每隔30秒,邻居之间交换一次$DV$,成为通告
- 每次通告:最多25个目的子网
用下一条来实现毒性逆转技术
链路失效、恢复
- 如果180秒没有收到通告,则邻居/链路失效,经过该邻居的路由不可用,需要重新计算路由
- 向邻居发送新的通告(如果发生转变)
- 邻居再一次向外发送通告(如果发生转变)
$RIP$路由表的处理
- 利用一个叫做$route-d$的应用层进程来管理
- 通告报文周期性地通过$UDP$数据报发送
$OSPF$协议
($Open \space Shortest \space Path \space First$)
开放
采用链路状态路由算法
- 链路状态分组扩散
- 每个路由器构造完整的网络拓扑图
- 利用$Dijkstra$算法计算路由
$OSPF$通告中每个入口对应一个邻居
$OSPF$在整个$AS$范围泛洪
- $OSPF$报文直接封装到$IP$数据报中
优点:
- 安全:所有$OSPF$报文可以被认证(预防恶意入侵)
- 允许使用多条相同费用的路径
- 对于每条链路,可以针对不同的$TOS$设置多个不同的费用度量(针对希望在这条链路上传输的分组设置低费用)
- 集成单播路由与多播路由,多播$MOSPF$与$OSPF$利用相同的网络拓扑数据
- 支持对大规模$AS$分层
(边界路由器可以有多个)
BGP协议
基础
边界网关协议(Border Gateway Protocol)是标准域间路由协议
BGP为每个AS提供了一种手段
- eBGP:从邻居AS获取子网可达信息
- iBGP:向所有AS内部路由器传播子网可达信息
- 基于可达信息与策略,确定到达其他网络的“好路径”
容许子网向Internet其余部分通告它的存在
BGP会话:两个BGP路由器(Peers)交换BGP报文:
- 通告去往不同目的前缀的路径(“路径向量”协议)
- 报文交换基于半永久的TCP连接
BGP报文:
- OPEN:与peer建立TCP连接,并认证发送方
- UPDATE:通告新路径(或撤销原路径)
- KEEPALIVE:再无UPDATE时,保活连接;也用于对OPEN请求的确认
- NOTIFICATION:报告先前报文的差错;也被用于关闭连接
分发路径信息
路径属性
通告的前缀信息包括BGP属性
- 前缀+属性 = “路由”
两个重要属性
- AS-PATH:包含前缀通告所经过的AS序列
- NEXT-HOP:开始下一个AS-PATH的路由器接口,指向下一跳AS
- 可能从当前AS到下一跳AS存在多条链路
这里从AS3发到AS1,下一跳是3a的接口IP地址
BGP路由选择
网关路由器收到路由通告后,利用其输入策略决策接受/拒绝该路由(基于决策路由)
路由器可能获知到达某目的AS的多条路由,基于一下准则选择:
- 本地偏好值属性:策略决策
- 最短AS-PATH
- 最新NEXT-HOP路由器(热土豆路由)
- 附加准则
提供商网络只期望为客户路由