计算机与网络(四)---- 网络层:数据平面
计算机与网络(四)---- 网络层:数据平面
1.网络层概述
-
网络层提供的服务
- 在发送主机和接收主机之间传送段(Segment)
- 在发送端将段封装到数据报中,在接收端,将段上交给传输层实体
- 网络层协议存在于每一个主机和路由器
- 路由器检查每一个经过它的IP数据报的头部
-
网络层的关键功能
- 转发:是指将分组从一个输入链路接口转移到适当的输出链路接口的路由器本地动作。
- 路由:是指确定分组从源到目的地所采取的端到端路径的网络范围处理过程。
-
网络层:数据平面与控制平面
-
数据平面:转发的功能,每个路由器都具备
-
控制平面:路由的功能,网络范围内的逻辑,决定数据报如何在路由器之间路由,决定数据报从源到目标端之间的端到端的路径。每个路由器中都有一个关键元素–转发表,通过转发表能够找到该分组将被转发到路由器的哪个输出链路上。
如何设置路由表?
- 传统方式:在每一个路由器中的单独路由器算法原件,在控制平面进行交互。传统方式下控制平面与数据平面是紧紧耦合的,在控制屏幕由路由算法决定端到端的路径,在数据平面IP协议根据转发表决定了数据报在此路由器上的局部转发
- SDN方法:软件定义网络方法,通过软件实现计算转发表并与路由器交互,逻辑集中的控制平面。
-
-
网络服务模型
-
网络层可能提供的服务
- 确保交付
- 具有时延上界的确保交付
- 有序分组交付
- 确保最小带宽
- 安全性
-
因特网的网络层提供了单一的服务,称为尽力而为(best-effort service)服务,传送的分组既不能保证分组被顺序接收,也不能确保交付,既不保证端到端分组时延,也不保证最小的带宽。
尽力而为服务看起来就是无服务的委婉说法
-
2.路由器
-
路由器的结构
-
输入端口:根据数据报头部的信息,在输入端口内存中的转发表查找合适的输出端口
- 基于目标的转发(传统方法):仅仅依赖于IP数据报的目标IP地址
- 通用转发:基于头部字段的任意集合进行转发
输入端口缓存(输入队列):
当交换结构的速率小于输入端口的汇聚速率时,就需要一个队列来平衡两边的速度,数据报在输入队列中排队。因此存在排队延迟以及由于输入缓存溢出而导致的丢失。
也有可能出现线路前部阻塞,即在一个输入队列中排队的分组必须等待它的前一个分组被交换结构发送。
-
交换结构:交换结构将分组从输入缓冲区传输到合适的输出端口,交换机构的交换速率通常是输入/输出链路速率的若干倍,这样交换结构才不会成为瓶颈。
-
三种交换技术
- 经内存交换:在CPU直接控制下的交换,采用传统的计算机。转发速率被内存的带宽限制,并且一次只能转发一个分组
- 经总线交换:数据报通过共享总线,从输入端口转发到输出端口。交换速度受限于总线带宽,一次只能处理一个分组
- 经互联网络交换(纵横式):可以同时并发转发多个分组,克服了总线带宽的限制,具有N个输入端口与N个输出端口,每个总线的交叉点都能够开启和关闭。当分组从端口A达到,转给端口Y,交换机控制器短接相应的两个总线
-
-
输出端口:取出已经存放在输出端口内存中的分组,并将其转发到输出链路上。
输入端口缓存(队列):
交换的速率超过输出速率N倍,如果N个输入端口对应的输出端口是相同的,那在输出端口将一个分组发送到输出链路上的时间内,将会达到N个分组。所以在输出端口必须要队列进行排队。当没有足够的队列空间来缓存新的分组时:要么丢弃新分组(弃尾策略),要么删除一个或多个已排队的分组,或者在队列即将满时,丢弃一个分组。这些策略称为主动队列管理(Active Queue Management,AQM),随机早期检测是最广泛研究和实现的AQM之一。
-
-
分组调度
即采用什么样的方式让输出队列中的分组发送到输出链路上
-
先进先出(FIFO):按照分组到来的次序发送分组。
- 丢弃策略:
- tail drop:丢弃刚达到的分组
- priority:根据优先级丢弃分组
- random:随机丢弃分组
- 丢弃策略:
-
优先权调度:发送高优先权的分组,不同类别的分组有不同优先权,可以依赖于标记或者其他头部字段来区别
-
循环调度:循环扫描不同类型的队列,发送完一类的一个分组,再发送下一个类的一个分组,不停循环。比如:一类分组->二类分组->三类分组->一类->二类->三类…
-
加权公平排队调度:一般化的循环调度,为每个类分配一个权重,根据权重进行循环调度
-
3.IP协议(网际协议)
-
IP数据报
- 版本号:IP协议版本
- 首部长度:确定IP数据报中载荷实际开始的地方
- 服务类型:用于区别不同类型的IP数据报
- 数据报长度:IP数据报的总长度
- 标识、标志、片偏移:与IP分片有关
- 寿命:TTL
- 上层协议:指示IP数据报的数据部分应交给哪个特定的运输层协议,例如:6表示交给TCP
- 首部校验和:判断分组头部是否出现问题
- 源IP和目标IP
- 选项
- 数据
-
IP数据报分片
-
分片的必要性
-
一个链路层能承载的最大数据量叫做最大传送单元(MTU),MTU限制了IP数据报的长度,并且每段链路可能使用不同的链路层协议,每种协议的MTU各不相同。
比如:链路的MTU为1500字节,而我要传输4000字节的数据,就必须要对数据进行分片,分成两个或者更多个较小的IP数据报,然后在端系统中进行组装
-
-
分片:将IP数据报分为多个较小的IP数据报
-
重组:在目标主机端进行IP数据报的重组,重组依赖于IP数据报中的标识、标志和片偏移
-
-
IP编址
-
一台主机通常只有一条链路连接到网络,主机与物理链路之间的边界叫做接口(interface),路由器通常拥有多个接口,IP地址和每一个接口关联。一个IP地址仅和一个接口相关联
-
IP地址
-
32位标识
点分十进制记法:IP地址中的每个字节用它的十进制形式书写,各字节间以句点隔开
-
子网部分(高位bits)与主机部分(低位bits)
什么是子网?
一个子网内的节点(主机或者路由器)他们的IP地址的高位部分相同,这些节点构成的网络叫子网。
无需路由器介入,子网内各主机可以在物理上相互直接到达
例如:233.1.1.1,233.1.1.2,233.1.1.3在一个子网内
-
IP编址为子网分配一个地址,例如:233.1.1.0/24,其中/24,称为子网掩码,指示32比特中的最左侧24比特定义了子网地址。
-
IP地址是以一个个子网为单位进行路由信息的通告和转发的
-
-
IP地址分类:
- Class A:具有8比特子网地址
- Class B:具有16比特子网地址,子网能容纳65534台主机
- Class C:具有24比特子网地址,仅能容纳254台主机
- Class D:IP广播地址
-
CIDR(无类别域间路由选择)
B类IP地址能够容纳的主机数量太多,C类太少。为了解决C类IP地址分配主机过少的问题,采用新的IP编址方式
- 子网部分可以在任意位置
- 地址格式:形式为a.b.c.d/x的地址的x最高比特构成了IP地址的网络部分,经常称为前缀。一个组织通常被分配一块连续的地址,即具有相同前缀的一段地址
路由聚合
当FlyByNightISP向外界通告时,凡是IP地址符合200.23.16.0/20,即前20个比特与200.23.16.0相符的数据报全都由它来发送,外界不需要知道在地址块200.23.16.0/20内实际上还存在着很多其他的组织。这种使用单个网络前缀通告多个网络的能力通常称为地址聚合,也叫路由聚合
-
如何获取一个IP地址
- 系统管理员配置
- DHCP:Dynamic Host Configuration Protocol,从服务器中动态获得一个IP地址,客户端通过DHCP请求报文请求,服务端通过DHCP ACK报文响应,DHCP是作用在UDP之上的
-
NAT:Network Address Translation 网络地址转换
-
本地网络只有一个有效IP地址,NAT可以让一个IP地址用于所有的(局域网)设备,可以在局域网改变设备的地址情况下而无须通知外界。局域网内部的设备没有明确的地址,对外是不可见的。
-
NAT路由器必须实现:
- 外出数据包:需要替换源地址和端口号为NAT IP地址和新的端口号
- 在NAT转换表中存储每个转换替换对(源IP,源端口->NAT IP ,新端口)
- 进入数据包:替换目标IP地址和端口号,采用存在NAT表中对应的映射表项
缺陷:外网无法主动访问NAT后的服务器
解决方案:NAT穿越和通用即插即用UPnP
-
-
-
IPv6
-
出现的理由:
- IPv4,32比特位的地址空间即将用完
- IP数据报头部格式改变帮助路由器加速处理和转发
-
IPv6数据报格式:
- 固定40字节头部
- 数据报传输过程中不允许分片
-
相较于IPv4
- 扩大的地址容量:IPv6将IP地址长度从32比特增加到128比特
- 简化高效的40字节首部
- 流标签:给属于特殊流的分组加上标签
- 跳限制:转发数据报的每台路由器将对该字段减1,如果达到0,则数据报将被丢弃
- 移除了CheckSum
-
IPv4向IPv6的过渡
-
4.通用转发和SDN
-
基于目的地转发由两个步骤:
- 查找目的IP地址(匹配)
- 将分组发送到有特定输出端口的交换结构(动作)
-
通用转发
流表:匹配加动作转发表在OpenFlow中称为流表
-
每台分组交换机包含一张匹配加动作表,该表是由远程控制器计算和分发的
-
匹配:OpenFlow的匹配抽象允许对来自三个层次的协议首部所选择的字段进行匹配
-
动作:每个流表项都有零个或多个动作列表,这些动作决定了应用于与流表项匹配的分组的处理。
- 转发:转发分组到一个特定的输出端口
- 丢弃:丢弃分组
- 修改字段:分组的首部10个字段可以重写
-