2022.1.6
虚电路网络
虚电路是一条从源主机传输到目的主机的链接,在路径上的所有路由器都负责维护该电路的连接
虚电路需要先建立后使用
虚电路中每个分组都携带者虚电路标识(VCID),而不是目的主机的地址
由于虚电路整个路径中的链路能包含的链路数不一样,因此VCID在同一条路径上并不是唯一的,采用分段管理的方式,因此需要利用虚电路转发表来保证分组需要转发的目的
在虚电路中采用信令协议建立协议,在虚电路的建立过程中,通过该协议选择一条合适的路径发送到目的主机,目的主机同意建立连接后沿着该路径返回到源主机中,同时告知路径上所有的路由器该连接的建立方式
数据报网络
数据报网络不同于虚电路网络,该网络是面向无连接的,因此每一个分组都需要包含目的地址,路由器需要根据分组的目的地址转发分组,由于在路由器上的分组算法更新(转发表更新),从同一个源到达同一个目的地址的数据报可能通过不同的路径转发
由于IP地址的数量极其庞大,因此在转发表中存储的是根据IP地址的范围转发到的下一个链路
最长前缀匹配优先
同一个目的IP地址可能包含有多个匹配成功的地址范围,因此在转发时选择的转发时通过最长前缀匹配来考量的,当所有的均不符合时,采用默认接口转发
数据报网络(Internet)和VC网络(ATM)对比:
Internet网络是计算机之间的数据交换,对于实时性和可靠性没有很高的要求,而ATM网络核心业务是实时通话,有较高的可靠性要求
Internet网络之间的链路类型众多很难去统一服务
Internet网络上的端系统更加智能,可以自适应、差错恢复、性能控制等,而ATM网络上的电话机、传真机并不是这样
因此,Internet网络更多的简化网络,复杂“边缘”(端系统),ATM网络恰恰相反
IP协议
IP数据报结构
- 版本号
4bit,路由器根据版本号决定如何解析后面的ip分组 - 首部长度
4bit,以四个字节为单位 - TOS
8bit,指示分组期望获得什么样的服务,一般情况不使用(取0) - 总长度
16bit,以字节为单位,包括首部和数据
最大为2^16 = 65535B - 标识、标志、片偏移
和ip分片有关,后续介绍 - TTL
ip分组在网络中可以通过的路由器数量(没经过一个减少1)
TTL等于0时丢弃(发送ICMP报文) - 协议
指示封装的是哪个协议的数据包(TCP/UDP) - 首部校验和
同UDP - 源/目的IP地址
- 选项
少用,不存在选项的ip长度为20字节(典型的数据报)
IP数据报分片
链路层中可封装数据的上限称为MTU(Maximum Transmission Unit),在不同的链路中MTU可能不同,由上一个链路转发到下一个链路会不一样,因此需要对IP数据报进行分片以保证数据报能正常传输
数据分片在中途的路由器中不进行组装,目的主机对其进行组装
在IP数据报中采用标识、标志、片偏移来表示分片
- 标识
分片的id - 标志
共3位
后两位为DF(dont fragment):用来表示是否允许分片、MF(more fragment):用来表示后续是否还有更多的分片 - 片偏移
相对于原IP分组中数据的偏移量
IP编址
在IP协议,对所有的接口(主机与物理链路之间的边界)进行编址
通常主机只有1,2个接口,路由器有多个,因此对于一些只有一个接口的主机,一般直接称为该主机的IP地址
ipv4是32bits的,由于不会随意分配IP地址,因此需要采取一个分配方法
IP子网(Subnets)
不跨越路由器可以彼此物理联通的接口被称为子网
通过该图便以理解(共六个)
有类ip地址
特殊IP地址
环回测试:从本机发出,经过网络层后回到本机
私有网络
在公共互联网中会被认为是非法的,由于是私有地址,因此其实在任何的公司内网中都存在
子网划分
子网掩码
NetID + SubID + HostID
子网掩码中Net、Sub位全部取1,Host位取0
子网掩码通过和IP地址进行与运算可以得到目的IP地址所在的子网地址,进而可以通过路由器进行转发
CIDR
无类域间路由(CIDR:Classless InterDomain Routing)
消除A类B类C类地址界限
无类域间路由格式:a.b.c.d/x,其中x表示前缀长度
可以利用CIDR表示子网
例如子网201.2.3.64,掩码255.255.255.192
可以通过201.2.3.64/26来表示
路由聚合
将以上三个转发的目的网络可以聚合成为一个,减少转发表占用的空间
DHCP
IP地址的获取可以通过静态配置,即设定好IP地址,同时也要设定好默认网关,即离开该子网时的去到的IP地址
另外IP地址通常的配置采取动态配置,采用DHCP(Dynamic Host Configuration Protocol)动态主机配置协议
动态配置的方式从服务器动态获取IP地址、子网掩码、默认网关、DNS服务器名称与IP地址
DHCP流程
- 主机广播DHCP发现报文
当主机接入子网中时,向服务器发送发现报文,该报文采用广播形式,因为主机接入时并不知道服务器的IP地址 - DHCP服务器提供
服务器利用提供报文offer message向客户做出响应,该报文中包含可以提供的IP地址、子网掩码以及IP地址租用期(即IP地址有效的时间量) - 主机请求IP地址
主机从可以获得的DHCP服务器中选取一个,并向选中的这个服务器提供DHCP请求报文request message - DHCP服务器分配IP地址
服务器使用DHCP ACK报文对请求报文进行响应
在上图DHCP的过程中,均采用广播的形式,这是因为当存在多个服务器时,客户机指定获取了某个服务器提供的服务后,告知其他服务器,让他们能够放弃为该客户机提供的IP地址等信息,不再占用网络空间
DHCP实际上是在应用层实现的
- DHCP报文封装到UDP数据报
- ip广播
- 链路层广播
网络地址转换NAT
Network Address Translation
由于ip网络的地址非常多,因此直接采用ipv4地址远远不够,在之前介绍过私有IP地址,但当外部网络想要与这些私有IP地址进行通信时,无法直接采用这些私有ip进行通信,因此这些IP地址接入NAT路由器
在外界看来,NAT路由器就类似于一个单个设备,内部所有的私有地址的IP地址就是NAT路由器的IP地址;而在内部,这些不同的设备之间通信通过自己的私有IP地址进行通信
除此以外,在NAT内部IP地址变化时不需要告知外部(方便DHCP);变更ISP时也不需要更改内部IP地址;内部IP地址对于外部来说是不可见的,这样也会更加安全
NAT实现
内部的私有地址向外发送时,将源IP地址替换为NAT路由器的统一IP地址和不同的端口号
NAT转换表记录了源IP地址和源端口号对应的新IP地址(即路由器提供的统一地址)和新端口号
NAT主要争议
- 路由器理论上应该只处理第三层的数据,但NAT将IP数据报取出进行修改
- NAT违背了端到端通信原则,应用开发者需要考虑这一协议,例如P2P应用
- 地址匮乏应该采用ipv6
NAT穿越
NAT穿越用以解决外部客户机无法到达内部的问题
- 静态配置NAT转换表
让每次发送到固定端口的信息必然转换到指定的内部IP地址和端口 - 利用UPnP
Universal Plug and Play即插即用
内部客户机自动学习到公共IP地址,并且能够在NAT转换表中动态地增删端口的映射,最终达到的效果与第一种方法类似 - 中继(如Skype)
内部客户机与中继服务器先建立通信,外部客户机也与中继建立通信,进而使得两者之间能够进行通信
ICMP
互联网控制报文协议
- 差错控制报文
目的不可达
源抑制
超时/超期
参数问题
重定向(路由器认为不应该是由自己转发,将报文重新发回至源主机) - 网络探寻报文
回声(Echo)请求与应答报文(Reply)
ICMP报文格式
Traceroute
Traceroute通过向目的主机发送一系列UDP报文,目的端口为目的主机中不可能使用的端口号(用于保证最终该报文会停下并返回ICMP),并设置UDP数据报的TTL从1开始逐渐递增,在路由器接受到该报文时,由于TTL为0,因此会向源主机发送ICMP报文,该ICMP报文携带了目前的路由器名称和IP地址
ICMP到达源主机时,记录下RTT
最终在达到目的主机后会返回ICMP报文“目的端口不可达”type=3, code=3
IPv6
主要变化
IPv6的动机来自于IPv4地址空间可能耗尽,IPv6引入的最重要的变化在于:
- 扩大的地址容量
IP地址长度从32比特增加到128比特,IPv6地址在单播和多播地址以外加入了一种任播地址,即可以将数据报传输给一组主机中的任意一个,例如用于向一组包含给定文档的镜像站点中的最近一个发送HTTP GET报文 - 简化高效的40字节首部
- 流标签
用于给特殊流的分组加上标签,是发送方要求进行特殊处理的流,如非默认服务质量或需要实时服务的流(音视频传输)
相对IPv4的改变
- 分片
IPv6中不允许中间路由器上进行分片与重新组装,因此去除了分片;分片的操作只允许在源主机上进行,在目的主机上进行分片 - ICMPv6
由于分片不允许路由器自行分片,因此可能存在链路不允许传输的情况,因此增加了一个ICMP数据报发送“分组太大”信息给源主机,使其重新发送 - 首部校验和
彻底移除,由于在运输层(TCP、UDP)和链路层(以太网)中进行了校验,因此设计者认为不必要在IP协议中再设定,路由器中的校验仍被认为过于耗时 - 选项
移除,定义多个选项首部,通过下一个首部字段表示,移除后首部均为40字节大小
表示形式
IPv4向IPv6过渡
由于不可能在某个时刻所有路由器都同时被更新,因此目前采用了建隧道的方式,假设两个节点之间要通过IPv6进行传输,他们之间的路由器通过IPv4进行传输,将这些路由器称为隧道,在隧道的发送端将IPv6报文封装成IPv4数据报,这样隧道中所有路由器都以为这是一个正常的IPv4数据报,将其正常传输,直到最后另一端接收到后拆除,得到IPv6。最终在这两个节点看来就是IPv6直接传输
路由算法
路由算法可以抽象为图,最终要转换成的算法就是在节点之间通信如何可以得到最小费用
路由算法分类
静态路由:
- 人工配置
- 路由更新慢
- 优先级高
动态路由(通常的路由算法就说的是动态路由)
- 路由更新快(定期进行更新,及时响应网络中的变化
全局信息:
- 所有路由器均掌握网络中所有拓扑和链路费用信息
- 典型算法有链路状态(LS)路由算法
分散信息
- 路由器只掌握邻居节点的链路费用信息
- 邻居节点之间交换信息并计算
- 典型算法:距离向量(DV)路由算法
链路状态路由算法
当一个路由器掌握了链路上所有链路费用信息之后,根据全局算法来计算需要的路由路径
利用Dijkstra算法,可以计算出从一个结点到达其他所有结点的最短路径
这玩意是真常用啊
算法可能存在的问题,震荡现象(oscillations)
如图所示,当所有结点掌握全局信息之后,B、C要向A发送信息时会采取D的这条路径,这样一来就会导致C->D的路径上更加拥挤,进而费用变大,此时路由重新计算发现C->B->A更加合适,一段时间后又同样开始拥挤
这样的情况导致出现的可能是当B需要发送向A时,报文可能先通过计算到达了C,此时路由算法重新计算发现通过C->B更加合适,于是回到B;接着又重新计算发现应该回到C,导致进入一个循环
- 解决方法一
强制链路开销不依赖于拥塞程度(不可行) - 解决方法二
确保链路中结点不同时更新
距离向量路由算法
Distance Vector(DV)
根据Bellman-Ford方程计算
dx(y) = min {c{x, v} + dv(y)}
其中c表示x到邻居结点v的费用,dv(y)表示v到y的最小路径
距离向量算法需要多次迭代完成,因此常用Dx(y)表示x到y的估计
同时还要维护邻居节点的Dv(y),并向邻居结点发送自己的估计
因此每个结点不定时发送自己的估计并接受到邻居的估计,对自己的Dx(y)进行更新,在一定的时间后该值会收敛于dx(y)
距离向量路由算法是异步迭代的
引发迭代的因素
- 局部链路费用变化(与某一个邻居的cost发生变化)
- 来自邻居的DV变化
分布式:
只有当DV变化时才告知自己的邻居
完整流程:
无穷计数问题
由于在发生变化后才会更新自己的DV,因此,当发生好消息(即链路费用降低)时,传播会更加迅速
然而当链路费用上升时则会存在问题
例如:
在上图中,由于dxy原来的值是根据dxz + dyz得到的,因此在x-y大幅上升后,x计算自己的dxy得到了6,再传递给到z更新,会很明显发现x和z的距离向量并没有快速完成自己应该的更新,这是因为他们互相依赖于对方的值,
当y期望到达x时,通过附近的d值,可以发现通过z会根据更低的消耗达到,但到达z后发现通过y又可以更快,因此就形成了路由选择环路
毒性逆转
为了解决上述的问题,可以通过一种叫毒性逆转的方法来实现,如果z需要通过邻居结点y到达x,则他会告知自己到达x的距离为无穷大
然而毒性逆转技术并不能完全解决无穷计数问题,在复杂的网络中无法彻底消除问题
最大度量
在复杂的网络中,毒性逆转技术并不能完全解决无穷计数问题,因此加入了最大度量,定义一个最大度量值,如15跳,则16跳表示无穷
当在某一个时刻,R1到192.168.1.0/24子网之间突然变大/不可达,那么互相的更新途径如上所示,然而由于设定了最大度量,因此在达到无穷大之后就不再互相更新
LS vs DV
记N为节点(路由器)的集合,E为边(链路)的集合
- 报文复杂性
LS算法中每个结点都要知道所有节点的情况和链路信息,因此需要发送O(|N| * |E|)个报文,另一方面,在更新时,LS算法中一个链路改变需要告知所有节点;而在DV算法中,更新时传递的并不一定是所有节点 - 收敛速度
DV算法收敛慢,并且可能遇到无穷计数的问题 - 健壮性
LS算法下,一台路由器出现的问题会及时通知链路中所有的路由器,基本不会出现问题;而DV算法中,可能需要很长时间才知道链路中另一个节点出现了问题
层次路由
将路由抽象为图的方法在小规模的网络中可能是可用的,但在大规模的网络中有如下的问题:
-
通信方面
路由表规模过大,无法存储
链路中存在大量需要交换的信息,会淹没本身可用的链路状态 -
管理方面
在管理方面,每一个网络的管理员都希望能管理自己的网络,Internet = network of networks
因此需要采取层次路由,把路由器聚合为一个区域:自治系统AS(autonomous systems)
自治系统内部采取上述的普通路由算法,不同AS可以通过不同的路由算法(LS/DV)
自治系统之间采用一个网关路由器连接,这个路由器位于AS边缘,他们互相连接各自的AS
AS间通信
当路由器需要向所在的自治系统之外传送报文时,需要知道应该传递到哪个网关路由器,因此自治系统内部需要知道知道目的网络是否可以通过哪个AS系统到达,并且需要把这个信息告知给自己内部的路由器,这些都是自治系统间的路由器需要完成的任务
假设AS1目前已知通过AS2和AS3均可以到达目的地址,那么该如何选择网关路由器?
首先通过学习得到可以选择的网关,并且将这个信息告知给AS1内部所有路由器,然后路由器通过AS内部路由协议找到能够达到任意一个可行网关的最短路径,接着就通过这个路径进行发送,并在转发表中增加这个入口
AS内部协议
RIP
采取距离向量算法
距离度量为跳步数(max=15hops),每条链路一个跳步
每隔30s,邻居之间交换一次dv,称为通告(advertisement)
每次通告最多25个目的子网
链路失效
如果180秒没有收到通告,那么久认为邻居节点失效
因此需要重新计算距离向量,并且向邻居发起通告,邻居可能再次向邻居的邻居发送通告(可能产生无穷计数)
因此需要采取毒性逆转技术
RIP路由表是利用一个称作route-d(daemon)的应用层进程进行管理实现的,他的通告报文周期性地由UDP数据报进行发送,因此,该协议是在应用层实现的,但是服务于网络层的协议
由于路由器中也需要发送通告,因此从这里可以看出路由器其实也是有应用层的,在路由器的应用层中生成RIP路由表管理
OSPF
Open Shortest Path First开放最短路径优先
采用LS算法,每个路由器都含有整个网络的拓扑
OSTF通告在整个AS中泛洪
报文直接装入IP数据报中
优点
- 安全
OSTF使用认证后的分组(预防入侵) - 允许使用多条相同费用的路径(RIP仅用一条)
- 针对不同的TOS设置多个不同的费用
- 集成了单播和多播路由
- 支持对AS进一步分层
上图中分为主干区和局部区,链路中的通告仅发生在区内部,每个路由器掌握自己区内部的详细拓扑,只知道去往其他区的方向
边界路由器汇总到达所在区网络的距离,并且通告给其他区的边界路由器
主干路由器在主干区运行OSTF
最后包含AS边界路由器
AS间协议
BGP(Broder Gateway Protocol)
边界网关协议
eBGP:从邻居AS获取子网的可达信息
iBGP:AS内部传播子网的可达信息
BGP协议之中通过两个BGP路由器(Peers)进行BGP报文交换
BGP属性
AS-PATH:到达指定子网X通过的AS路径
NEXT-HOP:下一跳地址
BGP确定最好的路由
在BGP通告中,可能存在多条路径可以到达目的子网,在这样的情况下,如何选择路由?
- 本地偏好(网络管理员设置)
- 最短AS-PATH(AS-PATH的数量最少)
- 最近NEXT-HOP
- 附加
BGP选择路由由以上四点顺序选择,当前一条无法区分时再进行下一条选择
为什么采用不同的AS内与AS间路由策略
- 策略
AS间路由期望能够管理谁路由经过这个网络,即管理谁能通过这个网络,如上图例子;AS内部路由通过单一管理 - 规模
利用层次路由可以处理大规模的网络 - 性能
AS内部路由更注重性能,AS间路由更注重策略(即管理谁能通过)