持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第4天,点击查看活动详情
1.网络层概念&前置知识
源主机当中,网络层取得运输层(自顶向下第二层)的报文段封装成数据报,向相邻路由器发送,最后到目的主机,网络层提取出报文段交给运输层。
网络层与传输层服务:
- 网络层:在两台主机之间(如果是VC,也可能涉及干预路由器)
- 传输层:在两个进程之间
网络层的两个关键功能:
- 转发(forwarding):数据报从路由器的输入链路转发到输出链路
- 路由选择(routing):确定数据包从源到目的采用的路径
网络层可以分解为两个平面:
- 数据平面:每台路由器功能,主要是转发
- 控制平面:网络范围的逻辑,主要是routing
某些网络架构中的第三个重要功能: Asynchronous Transfer Mode(ATM)ATM网络_百度百科, frame relay帧中继_百度百科 (baidu.com)
在数据报流动之前,两个终端主机和干预路由器建立虚拟连接
网络服务模型:
提供的服务:
- 单个数据报:确保交付、具有时延上界的确保交付
- 数据报流:有序数据报(分组)交付、确保最小带宽、安全性
网络层两种传输方式:
- 数据报(datagram)网络提供网络层无连接服务
- 虚拟电路(VC)网络提供网络层连接服务,类似于传输服务,但:
- service: host-to-host端到端
- no choice:网络提供一个或另一个,但不是两者兼而有之
- implementation: in network core
1.1 Virtual circuits 虚电路
一个VC包含了:
- 从源到目标的路径
- VC 编号,路径上每个链路对应一个编号
- 沿路径的路由器中的转发表中的条目
属于 VC 的数据包携带 VC 编号(而不是 dest 地址)。
可以更改每个链路上的 VC 编号,新的VC编号来自转发表
VC的应用:用于设置、维护拆解VC, 用于 ATM、帧中继、X.25,但是在当今的互联网中未使用
实现:
- 呼叫设置,在数据流动之前对每个呼叫进行拆解
- 每个数据包都携带 VC 标识符(不是目标主机地址)
- 源-dest 路径上的每个路由器都为每个通过的连接维护“状态”
- 链路、路由器资源(带宽、缓冲区)可以分配给 VC(专用资源 = 可预测的服务)
ATM Asynchronous Transfer Mode 的要求(为什么需要VC传输):
- 严格的时序、可靠性要求
- 需要有保障的服务
- “哑”端系统
- 电话
- 网络内部的复杂性
1.2 Datagram networks 数据报网络
在网络层没有呼叫设置
路由器:
- 没有关于端到端连接的状态
- 没有网络级的“连接”概念
- 使用目标主机地址转发的数据包
- 同一source-dest 对之间的数据包可能采用不同的路径
最长前缀匹配原则 Longest prefix matching 在转发表当中优先匹配较长的前缀
互联网的要求(为什么使用数据报传输)
- 计算机之间的数据交换没有严格的时序要求。
- “智能”终端系统(计算机)可以自适应,执行控制,错误恢复
- 内部网络简单,“边缘”的复杂性
- 多种链接类型、不同的特性,因此统一服务难
2.路由器工作原理
路由器的层次为网络层、链路层、物理层
路由器的两个关键功能:
- 路由选择routing。运行路由算法/协议(RIP、OSPF、BGP)
- 转发forwarding。将数据报从传入链路转发到传出链路
2.1 交换结构
三种交换方式:
- 经内存交换
- 在 CPU 直接控制下进行切换的传统计算机
- 数据包复制到系统内存
- 速度受内存带宽限制(每个数据报 2 次总线交叉)
- 经总线交换
- 通过共享总线输出端口内存
- 总线争用:一次只有一个分组通过总线,切换速度受总线带宽限制
- 经互联网络交换:
- 克服总线带宽限制,2n条总线连接n个输入端口,n个输出端口
- 交叉点通过交换结构控制器控制
2.2 输入端口
输入端口结构
- 其中线路端接属于物理层,处理bit级输入
- 数据链路处理(协议,拆封):数据链路层 ethernet以太网
- 查找,转发,排队:输入端口内存中查找转发表
输入排队
交换结构交换速度慢于数据报到达输入端口速度,产生输入排队
Head-of-the-Line (HOL) blocking 线路前部阻塞:即使输出端口空闲,在输入端口中排队的分组也得等前面的分组
排队后果:延迟(delay)和损失(loss)
2.3 输出端口
输出端口结构同输入端口结构
当数据报从交换结构到达输出端口的速度快于传输速率时,需要缓冲,产生输出排队,有排队延迟(delay)
如果没有足够缓存,将会丢弃尾巴(drop-tail),造成loss,属于主动队列管理(Active QueueManagement,AQM)算法
N个流流经一条链路容量为C的链路所需buffer:
packet schduler(分组调度)在排队的数据报中进行选择以进行传输
3.IP(网际协议)
3.1 IP数据报结构
英文版对照:
ip数据报格式解析查看IP数据报_bug掌柜的博客-CSDN博客_ip数据报
3.2 IP分片
- 网络链路具有 MTU(最大传输单元)
- 因此IP数据报在网络内分片,一个数据报变成多个数据报
- 在最终目的地“重新组装”
- IP header用于识别、排序相关片段
注意偏移量的计算,记得还有20bytes的IP数据报头
3.3 Subnets 子网
IP地址分为子网部分(高阶位) 主机部分(低位)
什么是子网?
- 可以在没有路由器干预的情况下物理地相互联系
- 具有相同 IP 地址子网部分的设备接口
要确定子网,请将每个接口与其主机或路由器分离,从而创建隔离网络的孤岛。每个隔离的网络称为子网。
CIDR(Classless InterDomain Routing):无类域间路由
任意长度地址的子网部分 地址格式:a.b.c.d/x,其中 x 表示地址子网部分中的x位
Routing with subnetting
当路由器收到带有 D (142.10.2.10) 的 IP 数据报时:
- 没有子网划分(subnetting),142.10 是网络 ID,2.10 是主机 ID。
- 使用子网划分时,142.10 是网络 ID,2 是子网 ID,10 是主机 ID。
- 分层寻址(带子网划分)允许路由信息的高效播发。
问:网络如何获取 IP 地址的子网部分?
答:获取其提供商 ISP 地址空间的已分配部分
问:ISP 如何获取地址块?
答:ICANN:Internet Corporation for Assigned Names and Numbers 负责分配地址 管理域名解析 分配域名,解决争议
问:主机如何获取 IP 地址?
答:由系统管理员在文件中硬编码或者 DHCP(动态主机配置协议)
DHCP(动态主机配置协议)
DHCP 概述:客户端-服务器协议
- 主机广播“DHCP discover”消息
- DHCP 服务器响应“DHCP offer”消息
- 主机请求 IP 地址:“DHCP request”消息
- DHCP 服务器发送地址:“DHCP ack” msg
3.4 NAT: Network Address Translation(网络地址转换)
对外部来说,本地网络仅使用一个IP地址:
- 可以在不通知外界的情况下更改本地网络中设备的地址
- 可以在不更改本地网络中设备地址的情况下更改ISP
- 本地网络内的设备不能明确寻址,外部世界可以看到(增加安全性)。
但在NAT路由上面,内网的每个主机不同进程会映射到不同的端口号
- 传出数据报:将每个传出数据报的(源 IP 地址、端口号)替换为(NAT IP 地址、新端口号),远程客户端/服务器将使用(NAT IP 地址,新端口 #)作为目标地址进行响应。
- 在 NAT 转换表中记住每个(源 IP 地址、端口号)到(NAT IP 地址、新端口 #)的转换对
- 传入数据报:将每个传入数据报的 dest 字段中的(NAT IP 地址、新端口 #)替换为存储在 NAT 表中的相应(源 IP 地址、端口 #)
路由器WAN(Wide Area Network),LAN(Local Area Network),路由转发表如图
NAT traversal problem
背景:客户端想要连接到地址为 10.0.0.1 的服务器,客户端不能将 10.0.0.1用作目标地址。
-
解决方案 1:静态配置 NAT 以将给定端口的传入连接请求转发到服务器(固定的映射) 例如,(123.76.29.7,端口 2500)始终转发到 10.0.0.1 端口 25000
-
解决方案 2:通用即插即用Universal Plug and Play (UPnP) 互联网网关设备Internet Gateway Device (IGD) 协议。
实现:允许 NAT 的主机: 学习公共 IP 地址 (138.76.29.7) 枚举现有端口映射 添加/删除端口映射(带租用时间) 即,自动执行静态 NAT 端口映射配置
- 解决方案 3:中继relaying(在 Skype 中使用) NATed 服务器建立与中继的连接 外部客户端连接到中继 中继将数据包桥接到连接之间
3.5 ICMP:Internet Control Message Protocol
主机和路由器用于传达网络层信息的协议
- 错误报告:无法访问的主机、网络、端口、协议 回显请求/回复(由 ping 使用)
- 网络层“高于”IP: IP 数据报中携带的 ICMP 消息
- ICMP 消息(ICMP message):类型type、代码code加上导致错误的 IP 数据报的前 8 个字节
实现:
- 源将一系列 UDP 段发送到 dest 首先有 TTL =1 第二个有TTL=2,依此类推。
- 当第 n 个数据报到达第 n 个路由器时: 路由器丢弃数据报 并发送到源 ICMP 消息(类型 11,代码 0,TTL已过期expired),消息包括路由器的名称和IP地址
- 当 ICMP 消息到达时,源计算 RTT Traceroute,执行此操作 3 次
- 停止标准(criterion) :UDP 段最终到达目标主机 目标返回 ICMP“主机无法访问”数据包(类型 3,代码 3) 当源获得此 ICMP 时,停止。
3.6 ipv6
动机:
- 32位地址空间即将完全分配。
- 标头格式有助于加快处理/转发速度
- 标头更改以方便 QoS(Quality of Service,服务质量qos_百度百科 (baidu.com))
IPv6 数据报格式: 固定长度 40 字节首部,不允许分片(fragmentation)
- 优先级Priority:确定流中数据报的优先级
- 流标签flow header:标识同一“flow”中的数据报。(flow没有明确定义)。
- 下一个标头next header:标识数据的上层协议
- 校验和checksum:完全删除以减少每个跃点的处理时间
- 可选字段option:可以有,但是在header字段之外,由“next header”字段指示
- ICMPv6:ICMP 的新版本 其他消息类型,例如“大数据包” 组播组管理功能
ipv4到ipv6的迁移——Tunneling 建隧道
两台IPV6路由器之间的IPV4路由器集合称作tunnel隧道
封装ipv6报文成为ipv4报文在ipv4路由器间传输
4.Routing Algorithm
4.1 Outline概述
- 静态 static
- 动态 dynamic 路线更改更快,定期(periodic)更新,响应连接开销变化
- 集中式 centralized/global
- 所有路由器都有完整的拓扑结构和链路成本信息
- Link State 链路状态 —— OSPF
- 分布式 decentralized
- distance vector 距离向量 —— RIP
- 路由器知道物理连接的邻居,到邻居的链路成本
- 迭代计算过程,与邻居交换信息
- 外网 external
- eBGF
- 内网 internal
-
iBGF
-
4.2 Graph abstraction
抽象为带权无向图 记住邻居 neighbor(物理连接) / 邻接 adjacent间的区别
4.3 link state
本质上就是迪杰克斯拉算法,寻找一个点到所有点的最短路径
算法复杂度:n个节点
每次迭代:需要检查所有节点,w,而不是N
次比较: 可实现更高效的实现:
局限性:需要实现知道所有链接的开销
4.4 Distance Vector
Bellman-Ford Equation (dynamic programming动态规划)
表示从 x 到 y 的最短路径的cost
动态规划状态转移方程:
解释:x到y的最短路径,相当于遍历x相邻边v的最短然后加上v到y的最短
basic idea: 每个节点定期向邻居发送自己的距离矢量估计值,当节点 x 从邻居处接收到新的 DV 估计值时,它会使用 B-F 方程更新自己的 DV:
迭代,异步 Iterative, asynchronous:
- 每个本地迭代由以下原因引起: 本地链路成本更改 来自邻居的 DV 更新消息
- 分布式: 每个节点仅在其 DV 更改时才通知邻居,如有必要,邻居会通知它的其他邻居
- wait->recompute->notify
- 节点检测本地链路成本变化
- 更新路由信息,重新计算距离矢量
- 如果 DV 更改,通知邻居(算出来没更改就不用通知)
举例:不会往回找,而且最后找到
问题:链路开销改变
某一链路开销变大时,由于路由的最低开销仍没有改变,更新时可能发生更新需要多次迭代的无穷计数(count-to-infinity)问题
解决方法:Poisoned reverse 毒性逆转
例子:
准备:x与y之间开销变大,而z先前通过y到x,这时z欺骗y说是无限的,因此让y去更新 而不会尝试通过z到x ,从而使y能够把y与x的直接开销变成60这个消息告诉z
- t0时刻,x与y间直接链路开销变成60,y通知z开销改变,但是由于前面z欺骗y ,因此这时候y还不会尝试通过z到x
- t1时刻,z得知开销改变,马上切到
- t2时刻,z通知y ,y再更新
- t3时刻,因为z在y到x的最小路径上,因此欺骗z说毒化从z到x的逆向路径
算法对比:
- 报文复杂性(Message complexity)和收敛速度(Speed of Convergence)
- LS:收敛速度为, 算法需要 消息 ,可能有振荡
- DV:收敛时间各不相同 可能产生路由环路 无穷计数问题
- 健壮性(Robustness):如果路由器出现故障会发生什么情况?
- LS: 节点可能会公布不正确的链接成本 每个节点仅计算自己的表
- DV: DV 节点可能会公布不正确的路径成本 因为其他人使用的每个节点的表,错误会通过网络传播
DV应用:RIP ( Routing Information Protocol 路由信息协议)
实现路由之间的信息互通,是DV算法在实际中的使用载体
RIP advertisements(RIP通告):用来向其他路由传达路由信息,比如路由表更改,挂载在使用UDP协议的IP数据报上
距离向量:通过 RIP 响应消息(也称为advertisement)每 30 秒在邻居之间交换一次
每个advertisement:AS内最多25个目标网络的列表
4.5 Hierarchical routing(autonomous systems自治系统)
将路由器聚合到区域,“自治系统autonomous systems”(AS) 解决的是规模问题和ISA需要管理自治问题 同一 AS 中的路由器运行相同的路由协议,称作自治系统内部路由选择协议intra-autonomous systems routing protocol 不同 AS 中的路由器可以运行不同的 AS 内部路由协议
自治系统内部协议-OSPF (Open Shortest Path First开放最短路优先)
open代表公众公开可用
使用Link State算法,通告类似于RIP,但传播到整个AS不仅仅是相邻的,且不需要UDP和TCP直接挂载IP上面
特点:
- 安全性:所有 OSPF 消息都经过身份验证(以防止恶意入侵)
- 允许多个相同成本的路径(RIP 中只有一个路径) 集成的单播和组播路由支持: 多播 OSPF (MOSPF) 使用与 - OSPF 相同的拓扑数据库
- 支持单个AS中的层次结构。
两级层次结构:局部(local)区域、骨干(backbone)。
- 仅在区域内显示链路状态通告,每个节点都有详细的区域拓扑;只知道其他区域网的方向(最短路径)。
- 区域边界路由器:“汇总”到自己区域中的网络的距离,通告到其他区域边界路由器。
- 主干路由器:运行仅限于主干网的 OSPF 路由。
- 边界路由器:连接到其他 AS。
自治系统间的路由协议-BGP(Border Gateway Protocol)
BGP 为每个 AS 提供了一种方法,用于:
- 从相邻的 AS 获取子网可达性信息。
- 将可访问性信息传播到所有 AS 内部路由器。
- 根据可访问性信息和策略确定到子网的“最好”路由。
- 允许子网向互联网的其余部分公布其存在:“我在这里”
成对的路由器(BGP 对等体)通过半永久性 TCP 连接交换路由信息:BGP 会话(BGP sessions),BGP 会话不需要与物理链路相对应。
当 AS2 向 AS1 播发前缀时: AS2 承诺会将任何地址数据报转发到该前缀,AS2 可以在其播发中聚合前缀
分发可访问性信息(Distributing reachability info):
- 使用 3a 和 1c 之间的 eBGP 会话,AS3 会将前缀可达性信息发送到 AS1。
- 然后,1c可以使用iBGP将新的前缀信息分发到AS1中的所有路由器
- 然后,1b 可以在 1b 到 2a eBGP 会话中向 AS2 重新公布新的可达性信息
- 当路由器得知新的前缀时, 在其转发表中创建前缀条目。
播发前缀包括 BGP 属性。
两个重要属性:
- AS-PATH:包含前缀通告已经过的 AS:例如,AS 67、AS 17
- NEXT-HOP:指示到下一跃点 AS 的特定内部 AS 路由器。(可能是从当前 AS 到下一跃点 AS 的多个链路)
当网关路由器收到路由通告时,使用导入策略(import policy)接受/拒绝。
BGP路由选择:
路由器可能会了解到某个前缀的路由超过 1 个。路由器必须选择路由。
消除规则:
- 路由被指派一个本地偏好(local preference)值(除了AS-PATH和NEXT-HOP)
- 本地偏好值相同,选最短 AS-PATH
- 最靠近的NEXT-HOP:烫手山芋路由
- BGP标识符
BGP messages: BGP messages使用TCP进行交换
- OPEN: 打开路由对的 TCP 连接并对发送方进行身份验证
- UPDATE: 公布新路径(或撤回旧路径)
- KEEPALIVE 在没有更新的情况下保持连接处于活动状态;也可 ACKs OPEN请求
- NOTIFICATION: 报告上一条消息中的错误;也用于关闭连接
跨AS和AS内策略区别:
- 策略:
- AS 间:管理员希望控制其流量的路由方式,以及通过其网络路由的人员,策略很重要
- AS 内部:单个管理员,因此无需策略决策
- 规模: 分层路由可节省表大小,减少更新流量,AS间关注可扩展性,AS内不那么重视
- 性能:
- AS内部:可以专注于某条路由实现的性能,而不是整体
- AS间:策略可能主导性能