计网
四.网络层-数据平面
1.导论
作用:规划路径,将数据传到下一个节点
网络层协议存在于每个主机和路由器
网络层实现了数据平面和控制平面:
数据平面决定从路由器输入端口到达的分组如何转发到输出端口
转发功能:
- 传统方式:基于目标地址+转发表
- SDN方式:基于多个字段+流表
控制平面:网络范围内的逻辑,决定数据报如何在路由器之间路由,决定数据报从源到目标主机之间的端到端路径
两个控制平面方法:
- 传统的路由算法:在路由器中实现
- software-defined-networking(SDN):在远程的服务器中实现
2.路由器组成
路由器由输入端口、switch fabric、输出端口组成(实际上,输入端口和输出端口是集成在一起的)
路由:运行路由选择算法/协议生成路由表
从输入到输出链路交换数据报,根据路由表进行分组的转发
![图片消失了](https://i-blog.csdnimg.cn/direct/17a6a270fdb74afe998f9189dec5bdb1.png)
小框中的红框是网络层,左边是输入端口,右边是输出端口
输入端口功能:分布式交换
根据数据报头部的信息,在输入端口内存中的转发表中查找合适的输出端口
基于目标的转发:仅仅依赖于IP数据报的目标IP地址(传统方法)
通用转发:基于头部字段的任意集合进行转发
![图片消失了](https://i-blog.csdnimg.cn/direct/11ee50168e974f3d8efba59bd532a51e.png)
在网络层有一个队列,这个队列就是路由器的缓存,用于匹配在输入端口处的输入输出速度
交换结构:将分组从输入缓冲区传输到合适的输出端口
交换速率:分组可以按照该速率从输入传输到输出,运行速度通常是输入/输出链路的若干倍
3个典型的交换机构:memory、bus、crossbar
![图片消失了](https://i-blog.csdnimg.cn/direct/a404311b1bac4ee4a88c744d57820e2e.png)
memory:第一代路由器,在CPU下的直接控制的交换,采用传统的计算机
分组被拷贝到系统内存,CPU从分组的头部提取出目标地址,查找转发表,找到对应的输出端口,拷贝到输出端口;转发速率被内存的带宽限制,一次只能转发一个分组
bus:第二代路由器,通过总线交换:数据报通过共享总线,从输入端口转发到输出端口,总线带宽由所有端口共享,通常需要仲裁机制来避免冲突
总线竞争:交换速度受限于总线带宽,一次只处理一个分组
crossbar:通过互联网的交换,同时并转发多个分组,没有总线带宽限制
使用一个矩阵式的交叉开关(Crossbar Switch)连接所有输入端口和输出端口,每个输入端口和输出端口之间都有一个独立的连接路径,可以同时传输多个数据包,需要调度算法来管理输入和输出端口之间的连接
调度机制:路由器通过算法决定下一个通过链路传输的分组
第一种:FIFO:先来先服务
第二种:优先权:优先发送高优先级的分组
第三种:Round Robin:每一类分组依次发,循环着发
3.IP
IP:Internet Protocol
![图片消失了](https://i-blog.csdnimg.cn/direct/e47a38badd1f437592138a5a6d07a81d.png)
分片和重组:网络链路有MTU(最大传输单元),大的IP数据报在网络上要被分片,每片都有不同偏移量,重组只在最终目标主机中进行
IP地址:32位标识,对主机或者路由器的接口编址
一个IP地址和一个接口相关联而非一个主机
接口:主机/路由器物理链路的连接处
IP地址的高位bits是子网部分,低位是主机部分
子网:一个子网内的节点,他们的IP地址的高位部分相同,这些节点构成的叫子网;无须路由器介入,子网内各主机可以在物理上相互直接到达
![图片消失了](https://i-blog.csdnimg.cn/direct/a25a4b24acdd495dbe403200185c9bc0.png)
IP地址分类:
![图片消失了](https://i-blog.csdnimg.cn/direct/2fb517d60ba844ee9d923a465f90ca92.png)
目前,A、B类的IP都已经被分配完了,E类是备用的,D类IP地址通常用于多播通信,D类IP地址允许数据包被发送到多个接收者,而不是单个接收者。这在需要同时向多个设备传输相同数据时非常有用,比如视频会议、网络广播等
特殊IP地址:
- 子网部分:全0–本网络
- 主机部分:全0–本主机
- 主机部分:全1–广播地址,广播地址是计算机网络中的一种特殊IP地址,用于将信息发送到同一网络中的所有设备。它允许发送方向网络上的所有主机发送数据包,而无需指定每个主机的单独IP地址;在IPv4中,广播地址通常是在一个子网内的最高地址
![图片消失了](https://i-blog.csdnimg.cn/direct/217bb9863b6c490a8580d2114e10b67a.png)
内网(专用)IP地址:
专用地址:地址空间的一部分供专用地址使用,永远不会被当做公用地址来分配,不会与公用地址重复
路由器不对目标地址是专用地址的分组进行转发
![图片消失了](https://i-blog.csdnimg.cn/direct/c855436482e34310b10b76dc6a92ace2.png)
IP编址:CIDR(classless InterDomain Routing),无类域间路由
子网部分可以在任意的位置
地址格式:a.b.c.d/x,其中x是地址中子网号的长度
子网掩码(Subnet Mask)是一个用来划分IP地址中的网络部分和主机部分的工具
网掩码通过将网络部分的位设为1,而将主机部分的位设为0来划分网络和主机
子网掩码也可以用 CIDR表示法来表示,例如 /24 表示前24位是网络位
![图片消失了](https://i-blog.csdnimg.cn/direct/6649d14bc2a6405aaef939f7cb4360e6.png)
对于转发表中的每一个项,若(IP Des addr) & (mask) == destination,则表示对应的接口转发该数据报
如果没有找到,则使用默认表项转发数据报
主机如何获得一个IP地址:
![图片消失了](https://i-blog.csdnimg.cn/direct/88c5da5472cd4df8a94ac579962da27b.png)
如何获得一个网络的子网部分:
![图片消失了](https://i-blog.csdnimg.cn/direct/bc6852765d674df285703d6a3d8c8e88.png)
一个ISP如何获得一个地址块:
![图片消失了](https://i-blog.csdnimg.cn/direct/310b82b98da7498d9264fd788bc8f6c1.png)
内网:
![图片消失了](https://i-blog.csdnimg.cn/direct/527fb7ae2fde4da2a7c0189ff4650d35.png)
数据报在进出内网的时候需要替换掉源地址/目标地址和端口号
在NAT转换表中,路由器会记住每个替换对
内网穿越问题:
方案1:静态配置NAT,转发进来的服务器特定端口连接请求
方案2:UPnP IGD协议:允许内网主机可以获知网络的公共IP地址,列举存在的端口映射
方案3:中继:在NAT后面的服务器建立和中继的连接,外部的客户端连接到中继,中继在2个连接之间桥接
ipv6:32bit的地址空间将会被很快用完
数据报格式:固定的40字节头部,在传输过程中,不允许分片
![图片消失了](https://i-blog.csdnimg.cn/direct/ea0ece56959048428d395e70063fb89d.png)
IPv6原生支持多播
由于IPv6提供了足够的地址,理论上不再需要网络地址转换(NAT)
目前ipv6是部署在ipv4内部的,不想连的ipv6之间通过ipv4通信,将来ipv6会一步步代替掉ipv4
4.SDN
传统的IP网络除路由器外还需要很多网络设备,如防火墙、负载均衡设备等
并且在每个路由器上都实现了控制平面和数据平面,不方便维护和升级
所以提出了SDN:逻辑上集中的控制平面
![图片消失了](https://i-blog.csdnimg.cn/direct/edb0d39a37e940d09a1979a66a92de3c.png)
SDN主要思路:将数据平面交给分组交换机,将控制平面交给控制器+网络应用
主要组件:
- SDN控制器:中央管理单元,负责网络控制和策略下发
- 南向接口:控制器与网络设备通信的协议,如OpenFlow
- 北向接口:控制器与应用程序通信的API,支持网络服务的定制开发
五.网路层-控制平面
1.路由选择算法
汇集树:此节点到所有其他节点的最优路径构成的树
路由选择算法就是为所有路由器找到并使用汇集树
LS路由:各点通过各种渠道获得整个网络拓扑,网路中所有链路代价等信息,再使用LS路由算法,计算最优路径,得到路由表
LS路由工作基本过程:
- 发现相邻节点,获知对方网络地址
- 测量到相邻节点的代价
- 组装一个LS分组,描述它到相邻节点的代价情况
- 将分组通过扩散的方法发到其他所有路由器
- 通过Dijkstra算法找到最短路径
Dijkstra算法:
- 初始化:设置起点的最短距离为0,其他节点为无穷大(∞),所有节点标记为“未确定最短路径”
- 循环执行以下操作:从“未确定”的节点中,选择当前距离起点最近的节点(记为u),将u标记为“已确定”,对u的所有邻居节点v进行松弛操作:
- 若 distance[u] + weight(u, v) < distance[v],则更新 distance[v] 为更小的值
- 终止条件:所有节点均被标记为“已确定”,或剩余未确定节点的距离均为∞(不可达)
![图片消失了](https://i-blog.csdnimg.cn/direct/4b45c3cdb65b4e308b84fe2962b236bf.png)
计算从A到D的最优路径:
A的邻居是B、G,记录2、6,最小代价是2,取AB
B的邻居是C、E,记录9、4,最小代价是4,取ABE
E的邻居是F、G,记录6、5,最小代价是5,取ABEG
G的邻居是H,记录9,大于6,回到ABEF
F的邻居是C、H,记录9、8,最小代价是8,取ABEFH
H到D代价是2,记录10,大于9,回到ABEFC
C到D代价是3,记录12,回到ABC
ABCD代价是12,回到ABEFC,确定为最有路径
距离矢量算法(DV):
所有节点交换其到邻居的代价,汇集成一个表,每次代价变化时,重新向邻居发送信息,然后更新表
![图片消失了](https://i-blog.csdnimg.cn/direct/a724df195ffa4edf86f9f046b603d1e1.png)
![图片消失了](https://i-blog.csdnimg.cn/direct/52c01ea0750d49c1b6840859f019ca53.png)
距离矢量算法有好消息传得快,坏消息传得慢的特点,为了解决坏消息传得慢的缺点,推出了水平分裂算法
![图片消失了](https://i-blog.csdnimg.cn/direct/83cd58ee7feb412aa7c87e46835c4f28.png)
2.自治系统内部的路由选择
RIP(Rounting Information Protocol)协议:使用距离矢量算法
RIP通告:DV:在邻居间每30s交换通告报文,每个通告最多25个子网,最大跳数为16
链路失效和恢复:如果180s没有收到通告信息–>邻居或者链路失效,新的通告报文会传递给邻居
毒性逆转:防止失效的信息在环路中无限传输,思路:当路由器通过某个接口学习到一条路由时,它会通过同一接口向邻居路由器发送该路由的更新信息,但将这条路由的度量值设置为无穷大(即“不可达”),这样做的目的是告诉邻居路由器:“不要通过我到达这个网络”,从而避免形成路由环路
RIP进程处理:RIP以应用进程的方法实现route-d,通告报文通告UDP报文传送,周期性服务
网络层的协议使用了传输层的服务,以应用层实体的方式实现
![图片消失了](https://i-blog.csdnimg.cn/direct/647f24fd5ee84300aa533ee3c3ef301f.png)
OSPF(Open Shortest Path First)协议:使用LS算法,OSPF通告信息中携带每一个关于邻居路由器的表项
通告信息会传遍AS全部(通过泛洪)
OSPF的特性:
- 安全
- 允许多个代价相同的路径存在
- 对于每一个链路,对于不同的TOS有多重代价矩阵
- 对单播和多播的集成支持
- 在大型网络中支持层次性OSPF
由于一个平面路由在规模巨大的网络中的消耗太大,且有管理问题,所以有了层次性路由
层次路由:将互联网分成一个个AS(路由器区域),每个AS有唯一标识
路由变成了两个层次路由:AS内部路由、AS间运行AS间路由协议
层次性OSPF:链路状态通告仅在本地区域内进行,每一个节点拥有本地区域的拓扑信息,要到其他区域的信息会由区域边界路由器发送给其他区域
![图片消失了](https://i-blog.csdnimg.cn/direct/dd4f3c3cf17c45a4b70824c5486d1234.png)
区域边界路由器:汇总到自己区域网络的距离,向其他区域通告
骨干路由器:仅仅在骨干区域内,运行OSPF路由
边界路由器:连接其他的AS’s
IS-IS协议:几乎和OSPF一样
3.ISP之间的路由选择
互联网AS间路由:BGP(Border Gateway Protocol)
BGP提供给每个AS以以下方法:
eBGP:从相邻的ASes那里获得子网可达信息
iBGP:将获得的子网可达信息传遍到AS内部的所有路由器
根据子网可达信息和策略来决定到达子网的路径
基于距离矢量算法
BGP会话:2个BGP路由器在一个半永久的TCP连接上交换BGP报文
当通告一个子网前缀时,通告包括BGP属性
2个重要的属性:
AS-PATH:前缀的通告所经过的AS列表
NEXT-HOP:从当前AS到下一跳AS有多个链路,在NEXT-HOP中告诉对方通过哪个I转发
基于策略的路由:当一个网关路由器接收到了一个路由通告,使用输入策略来决定是否接收这个通告
策略也决定了是否向其他邻居通告这个路由信息
![图片消失了](https://i-blog.csdnimg.cn/direct/cfdffd5e02b948d4869ce6232d497a5a.png)
上图中,一般AS1的1c会选择接收AS3的3a的信息,因为路径代价较小,但是可能因为策略问题,其它代价大,所以反而会选择AS2的2a传来的信息
AS2的2a传来的也会携带自己子网的路由信息
内部网关协议更注重性能,外部更注重策略
4.SDN控制平面
软件定义的网络:SDN,在逻辑上集中控制平面,由一个(通常是远程的)控制器与本地控制代理(CAs)交互
SDN架构:数据平面交换机,流表被控制器计算和安装,基于南向接口API,SDN控制器访问基于流的交换机
也定义了和控制器的协议(Openflow)
SDN控制器(网路OS):维护网络状态信息、通过上面的北向API和网络控制应用交互、通过下面的南向API和网络交换机交互,逻辑上集中,但实际上采用分布式方法实现
网络控制应用:控制的大脑,采用下层提供的服务实现网络功能
非绑定:可以被第三方提供
![图片消失了](https://i-blog.csdnimg.cn/direct/851864a647234a85a60b93f63ddf5e15.png)
SDN比较前沿,未来可能会有变化
六.链路层
1.引论和服务
WAN(广域网):网络形式采用点到点链路,带宽大、距离远、实现简单
LAN(局域网):一般采用多点连接的方式,连接节点非常方便,实现链路层功能相当复杂
链路层提供的服务:
成帧:将数据报封装在帧中,加上帧头、帧尾部,如果采用的是共享性介质,信道接入获得信道访问权
在帧头部用MAC(物理)地址来标示源和目的
相邻节点完成可靠传输:在低出错率的链路(光纤和电缆)上很少使用,多用于无线链路
其它服务:流量控制、错误检测、差错纠正、半双工(可以双向传输但一次一个方向)和全双工
链路层在每一个主机上实现,功能在"适配器"上实现或者在一个芯片组上实现(以太网卡)
2.差错检测和纠正
简单的差错检测:奇偶校验,能检测单个bit的错误
二维的奇偶校验:将数据排成方形矩阵,算每行每列的和,可以精确找到错误的位置
CRC(循环冗余校验):
生成多项式:收发双方预定义的一个多项式,如CRC-3表示 x 3 + x + 1 x^3 + x + 1 x3+x+1,二进制数为1011
计算过程:
- 数据补零:在数据末尾补上k个0(k为生成多项式位数-1),如1001补位后为1001000
- 模2除法(异或运算):补零后的数据的1位与生成多项式依次异或
- 如10010001011->100001011->0110,取后三位110(因为生成多项式是4位),得到校验码110
- 附加校验码:发送方发送的完整的数据1001000110