网络层-数据平面
路由器、IP协议(格式、IP分片、DHCP、NAT)
数据平面转发分为两类:基于目的地转发和通用转发. 通用转发涉及SDN
二者都是 匹配加动作 原则
参考 《自顶向下》《中科大》
导论
- 网络层的连接和传输层的连接不一样
- 传输层tcp的连接只是体现在端系统,所以称为面向连接
- 网络层的连接 不仅在端系统,在中间的路由器上,也维护了通信的状态所以称为有连接
- 也即 运输层只存在于网络边缘(端点)(主机), 网络层存在于网络边缘(每一台主机)和网络中心(路由器)上
注 :
- 很多人互换的使用 转发 和 交换 这两个术语
- 约定 分组交换机 指 通用分组交换设备. 功能:根据分组首部字段的值,将分组从从输入链路接口转移到输出链路接口.
- 其中有两种分组交换机
- 链路层交换机(linker-layer switch)
- 链路层的分组交换机(链路层/第二层设备)
- 基于链路层帧中的字段值进行转发
- 路由器(router)
- 网络层的分组交换机 (网络层/第三层设备)
- 基于网络层数举报的首部字段值进行转发
- 链路层交换机(linker-layer switch)
分组交换器 其实应该叫分组路由器
交换器是对数据链路层的帧来说的。
所以说名字起的不好
功能
- 网络层作用从整体来看为:将分组从一台发送主机移动到另一台接收主机
- 为此,网络层实现了两方面的重要功能:数据平面和控制平面
路由表 是 数据功能和控制功能的粘合剂
控制平面的功能体现在最后的结果:路由表
路由表交给ip协议
ip协议根据路由表对到来的分组做转发,实现数据平面功能
数据平面
数据平面
- 转发 forwarding
- 是每个路由器本地的功能
- IP协议实现转发功能(局部) : IP协议根据forwarding table 将分组从路由器的输入接口转发到合适的输出接口
- 转发方式
- 传统:基于目标地址+转发表(forwarding table)
- 通用转发:基于多个字段+流表
- 转发是在数据平面唯一实现的功能
- 转发的时间尺度很短(几ns), 通常用硬件实现
控制平面
控制平面
- 路由选择 routing
- 路由选择协议实现了路由功能(全局)
- 路由选择算法 决定数据报如何在路由器之间路由 ; 决定分组从发送主机到目标接收主机的路径
- 路由选择算法 routing algorithm
- 传统路由选择算法: 在路由器中实现
- 数据平面传统转发 && 控制平面传统路由选择
- 路由选择算法routing algorithm运行在每台路由器中,每台路由器中都包含 forwarding转发 和 routing路由选择 两种功能
- 一台路由器的routing algorithm路由选择算法与其他路由器中的routing algorithm交互,以计算出其forwarding table的值
- Software-Defined Networking SDN : 在远程服务器实现
- 数据平面通用转发 + 控制平面SDN控制
- 与传统方式不同(各个路由器运行路由选择算法并彼此通信),控制平面或许有其他方来填写数据平面的forwarding table。
- 控制平面将路由选择功能从路由器中分离,由远程服务器负责
- 远程服务器承担路由选择功能:计算和分发转发表给路由器
- 路由器只承担数据平面的转发功能
- 路由器和远程控制器交换包含转发表和其他路由选择信息的报文进行通信。
- 为什么叫Software-Defined : 因为计算forwarding table进而与router交互的控制器由软件实现。
- 传统路由选择算法: 在路由器中实现
- 路由器采用的 路由转发算法 决定了 forwarding table 的内容(传统和sdn符合这句话?)
- 路由选择的时间尺度较长(几s), 通常用软件实现
- 路由选择协议实现了路由功能(全局)
网络服务模型
从发送方主机到接收方主机传输数据报的“通道” , 网络提供什么样的服务模型?
- 感觉就是网络层对运输层做出的保证
对于单个数据报的服务
- 可靠传送
- 延迟保证,如:少于40ms的延迟
对于数据报流的服务:
- 保序数据报传送
- 保证流的最小带宽
- 分组之间的延迟
连接建立 : 在某些网络架构中是第三个重要的功能
- 在分组传输之前,在两个主机之间,在通过一些路由器所构成的路径上建立一个网络层连接
- 涉及到路由器
- 网络层和传输层连接服务区别:
- 网络层: 在2个主机之间,涉及到路径上的一些路由器
- 传输层: 在2个进程之间,只体现在端系统上(TCP连接)
- 在分组传输之前,在两个主机之间,在通过一些路由器所构成的路径上建立一个网络层连接
Internet 因特网的网络层提供服务:best-effort service 尽力而为
ip网络没有连接建立的功能,有些网络提供了连接建立功能
ip网络向上层提供转发功能 :ip协议(数据功能),路由选择协议(控制功能)
路由器
- 高层面(非常简化的)通用路由器体系架构
- 路由:运行路由选择算法/协议 (RIP, OSPF, BGP)-生成路由表
- 转发:从输入到输出链路交换数据报-根据路由表进行分组的转发
输入端口处理 + 基于目的地转发
- 输入端口重要功能:(look up forwarding table)查找转发表,决定分组的输出端口
- 转发表由路由选择处理器生成
- 转发表由路由选择处理器生成
- 输入端口缓存
- 当交换机构的速率小于输入端口的汇聚速率时, 在输入端口可能要排队
- 排队延迟以及由于输入缓存溢出会造成丢失!
- Head-of-the-Line (HOL) blocking: 排在队头的数据报阻止了队列中其他数据报向前移动
- 当交换机构的速率小于输入端口的汇聚速率时, 在输入端口可能要排队
匹配加动作
- 匹配:输入端口查找目的IP,
- 动作:输入端口将分组送入交换结构(差不多就是转发)
- 是一种匹配加动作的特定情况
routing processor 路由选择处理器
- 传统路由器中,routing processor 执行路由选择协议
- SDN路由器中,routing processor 与远程控制器通信
基于目的地转发
关于转发
- 基于目的地转发 : 只依赖IP数据报的目标IP地址这一个因素,来决定分组的输出端口。
- 前缀匹配(且是最长前缀匹配)
->
- 前缀匹配(且是最长前缀匹配)
通用转发 (见后文)
- 通用转发
交换结构
将分组从输入缓冲区传输到合适的输出端口
交换速率:分组可以按照该速率从输入传输到输出
- 运行速度经常是输入/输出链路速率的若干
- N 个输入端口:交换机构的交换速度是输入线路速度的N倍比较理想,才不会成为瓶颈
典型交换结构
经内存交换…
经总线交换…
经互联网交换…
输出端口处理
当数据报从交换机构的到达速度比传输速率快,就需要输出端口缓存
排队带来延迟,由于输出端口缓存溢出则丢弃数据报
由调度规则选择排队的数据报进行传输
调度机制
- 调度: 选择下一个要通过链路传输的分组
- FIFO (first in first out) scheduling:
- 按照分组到来的次序发送
- 丢弃策略: 如果分组到达一个满的队列,哪个分组将会被抛弃?
- tail drop: 丢弃刚到达的分组
- priority: 根据优先权丢失/移除分组
- random: 随机地丢弃/移除
- Priority Queuing 优先权调度:
- 发送最高优先权的分组
- 多类,不同类别有不同的优先权
- 类别可能依赖于标记或者其他的头部字段, e.g. IP source/dest, port numbers, ds,etc.
- 先传高优先级的队列中的分组
- Round Robin Queuing Discipline 循环排队规则
- 循环扫描不同类型的队列, 发送完一类的一个分组,再发送下一个类的一个分组,循环所有类
- Weighted Fair Queuing (WFQ)
- 一般化的Round Robin
- 在一段时间内,每个队列得到的服务时间是:Wi/(XIGMA(Wi)) *t,和权重成正比
- 每个类在每一个循环中获得不同权重的服务量
IP协议
- 主机、路由器中的网络层功能
格式
length 数据报长度 : IP数据报总长度(首部+数据)。单位字节。
identifier 标识 , flags 标志 , fragment offset 片偏移 : 与ip分片有关
time to live : 允许经过的路由器数
upper layer : 指示数据部分的协议,仅当ip数据报到达最终目的地时才有效
check sum 首部检验和 : 帮助路由器检测ip数据报的比特错误
- 路由器会丢弃检测出错误的数据报
- 为什么tcp/ip在运输层和网络层都进行差错检测 ?
- ip层只对ip首部进行检验,而tcp/udp是对整个tcp/ucp报文进行检测的。
- ip不一定和tcp/udp在同一协议栈上
source ip , des ip : ip字段在ip报文首部,port字段在tcp/udp报文首部
data : tcp/udp segment , icmp segment
IP数据报传输TCP段 由器的列表.时头部有多少?
- 20 bytes of TCP +
- 20 bytes of IP +
- app layer overhead
IPv4数据报分片 和 重组
路由器进行分片,目的主机进行重组
Max Transmission Unit , MTU (最大传输单元)
- 链路层帧所携带的最大数据长度
- 不同的链路类型有不同的MTU
大的IP数据报在网络上被分片(“fragmented”)
- 一个数据报被分割成若干个小的数据报
- “重组”只在最终的目标主机进行
- IP头部的信息片偏移被用于标识,排序相关分片
- identifier 标识 : 同一数据报的切片具有相同的ID
- flags 标志 : 同一数据报的最后一个切片的flags标志字段置为0
- fragment offset : 代表该切片的ip载荷部分的第一个字节,在整个ip数据报的载荷部分的位置
例子
IPv4编址
- IP地址: 网络设备(包括主机,路由器)和网络的接口的标识
- 一个IP地址和一个接口相关联
- 接口: 主机/路由器和物理链路的连接处
- 路由器通常拥有多个接口(路由器和不同网络的接口 ; 路由器至少有两个ip地址,否则路由器没有办法在网络之间进行分组转发)
- 主机也有可能有多个接口(只不过这多个接口很可能都是主机和同一网络的接口)
- IP地址和每一个接口关联
主机有一个ip地址即可,也可以有多个ip地址。
Q: 这些接口是如何连接的?
A: 我们将会在第5,6章学习
前:无需担心一个接口是如何
接到另外一个接口 (中间没有路由器)
网络内部 ip之间如何进行分组的发送和接收?— 帧 – 交换机 — 数据链路层
子网 Subnets
- IP地址:
- 子网部分(高位bits)
- 主机部分(地位bits)
- 什么是子网(subnet) ?
- 一个子网内的节点(主机或者路由器)它们的IP地址的高位部分相同,这些节点构成的网络的一部分叫做子网
- 子网内无需路由器介入,子网内各主机可以在物理上相互直接到达
- 一个子网的ip定义并不局限于多台主机到一个路由器接口的以太网段
- 判断子网:
- 要判断一个子网, 将每一个接口(ip)从主机或者路由器上分开,构成了一个个网络的孤岛
- 每一个孤岛(网络)都是一个都可以被称之为subnet.
- 223.1.1.0/24 223.1.2.0/24 223.1.3.0/24 223.1.8.0/24 223.1.7.0/24 223.1.9.0/24
IP地址分类
一种分类编址 classful addressing
- A:
- 0.0.0.0 - 127.255.255.255 ;
- 126 networks ,16777214 hosts ;
- mask 255.0.0.0
- B:
- 128.0.0.0 - 191.255.255.255 ;
- 16382networks ,65534 hosts ;
- mask 255.255.0.0
- C :
- 192.0.0.0 - 223.255.255.255 ;
- 2 million networks ,254 hosts ;
- mask 255.255.255.0
- D :
- 224.0.0.0 - 239.255.255.255 ;
- multicast
- E :
- 240.0.0.0 - 247.255.255.255 ;
- reserved for future
- A:
可以看出ABC三类地址分为网络号和主机号
- 特殊ip地址
- 主机号全为 1 : 广播地址,该网络下的所有主机
- 主机号全为 0 : 指定本主机
- 故计算网络内最大主机数 = 2^(主机号位数) - 2
- 子网部分全为 0 : 本网络
- 回路地址/测试地址
- 127开头的ip地址为回路地址:127.x.x.x 如常见的127.0.0.1
- 目标地址为127.x.x.x的不会发送出网卡,到网络层监测到ip为回环地址后就直接将数据包返回到运输层
- 子网内的广播地址 : 255.255.255.255(理论依据呢 ?)
- 本机地址 : 0.0.0.0(理论依据呢 ?)
- 特殊ip地址
ABC三类地址中,一部分为专用ip,一部分为公用ip
- 内网IP = 专用IP = 私有IP
- 私有ip只在局域网中有意义,不会出现在公网中
- 路由器不对目标地址是私有ip的分组进行转发
- 其中A mask为 255.0.0.0 ;B mask 255.255.0.0 ; C mask 255.255.255.0
- 那么易知,我租的服务器的ip为114.132.58.229,显然是A中的公有ip ; 易知虚拟机ifconfig看到的192.168.147.162,显然是C的私有ip ; wsl ifconfig看到的172.17.247.46,显然是B的私有ip
- 而 D 类和 E 类地址是没有主机号的,所以不可用于主机 IP,D 类常被用于多播,E 类是预留的分类,暂时未使用。
无分类地址 CIDR
- CIDR : Classless InterDomain Routing. 无分类地址 也叫 无类域间路由
- 子网部分和主机部分可以在任意的位置临界
- 地址格式 : a.b.c.d/x , x为子网号长度
- 因特网的地址分配策略是CIDR
子网掩码 subnet mask
- 32bits ,0 or 1 in each bit
- 1: bit位置表示子网部分
- 0: bit位置表示主机部分
- 原始的A、B、C类网络的子网掩码分别是
- A:255.0.0.0 :11111111 00000000 0000000 00000000
- B:255.255.0.0:11111111 11111111 0000000 00000000
- C:255.255.255.0:11111111 11111111 11111111 00000000
- CIDR下的子网掩码例子:
- 11111111 11111111 11111100 0000000
- 也可通过/x表示子网掩码
- 如子网掩码为223.1.1.0/24
- 意味着高24bit地址定义了子网地址. 任何其他要求接入223.1.1.0/24 网络的主机都要求具有223.1.1.xxx的形式
- 如子网掩码为223.1.1.0/24
转发表和转发算法
- 已知获得IP数据报的目标地址IP Des addr , 那么对于转发表中的每一个表项
- 如 (IP Des addr) & (mask)== destination, 则按照表项对应的接口转发该数据报
- 如果都没有找到,则使用默认表项转发数
如何获得ip地址
上述学习ipv4编址 那么主机或者子网最初是如何得到他们的地址的 ?
- 组织如何为其设备得到一个ip地址块
- 组织中的设备如何从地址块中获得一个ip地址
获取一块地址
- 组织如何为其设备得到一个地址块 ? 即 如何为子网获取一个ip地址快 即 如何获得一个网络的子网部分(网络号部分 ? )
- 解:从ISP地址块 中 被分配到一个块地址快
- ISP如何获得地址块 : ICANN
- 分配地址
- 管理DNS
- 分配域名,解决
获取主机地址 : DHCP
组织中的设备如何从地址块中获得一个ip地址
DHCP : Dynamic Host Configuration Protocol 动态主机配置协议
DHCP基于udp
路由器的ip和主机的ip都可以手工配置,但更好的方法是采用dhcp. dchp允许主机每次接入网络时能得到一个临时的ip地址, 每次接入网络时得到的地址也许是不同的.
dhcp实例: 主机频繁的加入和离开网络. 如我们在宿舍和在实验室会发现本机的ip地址不同. 就是两次接入网络时dhcp获取的ip不同
目标: 允许主机在加入网络的时候,动态地从服务器那里获得IP地址:
- 可以更新对主机在用IP地址的租用期-租期快到了
- 重新启动时,允许重新使用以前用过的IP地址
- 支持移动用户加入到该网络(短期在网)
对于一台新到达的主机,DHCP协议分为4步
DHCP服务器发现 (寻找DHCP Server)
- 为寻找DHCP Server,主机广播 DHCP发现报文(DHCP discover message)
- 目的地址 广播 255.255.255.255
- 源地址 本主机0.0.0.0
- 为寻找DHCP Server,主机广播 DHCP发现报文(DHCP discover message)
DHCP服务器提供 (DHCPServer 给 client推荐ip)
- DHCPServer 广播 DHCP提供报文(DHCP offer message)
- 目的地址 广播: 255.255.255.255
- 源地址 : DHCP Server IP
- 内容
- IP 地址 及 租用期
- 第一跳路由器的IP地址(默认网关)
- DNS服务器的域名和IP地址
- 子网掩码
- DHCPServer 广播 DHCP提供报文(DHCP offer message)
DHCP请求 (client 确认并回显 DHCPServer的推荐)
- 主机从多个DHCP服务器中选择一个,并响应。通过发送DHCP请求报文(DHCP request message). 回显配置的参数
DHCP ACK (DHCP确认)
- DHCP Server 发送 DHCP请求确认(DHCP ACK message) DHCP请求报文
- client收到ack后 交互便完成.
DHCP 缺陷 :
- 每当节点连接到一个新子网,要从DHCP获取一个新的IP地址,当移动节点在子网之间移动时,不能维持原先的TCP连接.
由于dhcp具有将主机连接进一个网络的网络相关方面的自动能力,故被称为即插即用协议(plug-and-play protocol) / 零配置(zeroconf)协议
网络地址转换 Network Address Translation
NAT 理解: 将内部的专用地址转化成公有唯一地址
- NAT路由器
- NAT路由器对于外部世界表现得不像一台路由器,而是一台具有单一IP地址的单一设备。
- 本质 : NAT路由器对外界隐藏了子网内的细节
- 动机: 本地网络只有一个有效IP地址(子网内的设备对外使用同一个ip)
- 不需要从ISP分配一块地址,可用一个IP地址用于所有的(局域网)设备–省钱
- 可以在局域网改变设备的地址情况下而无须通知外界
- 可以改变ISP(地址变化)而不需要改变内部的设备地址
- 局域网内部的设备没有明确的地址,对外是不可见的–安全
- NAT路由器对于外部世界表现得不像一台路由器,而是一台具有单一IP地址的单一设备。
- 实现: NAT 路由器必须:
- 外出数据包:
- 重写源IP和源Port 为NAT IP地址和NAT Port,目标IP和Port不变
- 远端的C/S将会用NAT IP地址,新端口号作为目标地址
- 在NAT转换表中记录对应关系
- <NAT IP, NAT Port ; 源IP,源Port >
- NAT转化表 NAT translation table
- {WAN端IP NATPort} , {LAN端IP SRCPort}
- 进入数据包:
- 重写目标IP和目的Port 为源IP,端口 . (根据NAT table.)
- 重写目标IP和目的Port 为源IP,端口 . (根据NAT table.)
- 外出数据包:
- 因为Port为16-bit:
- 故一个局域网内可以至多同时有6万多个同时连接
- 对NAT是有争议的:
- 路由器只应该对第3层(网络层)做信息处理,而这里对端口号(4层)(应用层作了处理
- 违反了end-to-end 原则
- 端到端原则:复杂性放到网络边缘
- 使得无需借助中转和变换,就可以直接传送到目标主机
- NAT可能要被一些应用设计者考虑, eg, P2P applications
- 外网的机器无法主动连接到内网的机器上(因为)
- 端到端原则:复杂性放到网络边缘
- 地址短缺问题可以被IPv6 解决
- NAT穿越: 如果客户端需要连接在NAT后面的服务器,如何操作 ?
NAT穿越 NAT traversal
- 问题描述 : client需要连接ip(10.0.0.1)的server(即客户要连接一个位于NAT背后的Server)
- 易知10.0.0.1 为 LAN本地地址 (client不能够使用其作为目标地址)
- 整网只有一个外部可见地址: 138.76.29.7
- 方案1: 静态配置NAT:转发进来的对服务器特定端口连接请求
- 即在nat translation table上手动配置 {(123.76.29.7, port 25000) , (10.0.0.1 port 25000)} ,使得(123.76.29.7, port 2500) 总是转发到(10.0.0.1 port 25000)
- 方案2: Universal Plug and Play (UPnP) Internet Gateway Device (IGD) 协议. 允许NATted主机可以:
- 获知网络的公共 IP地址(138.76.29.7)
- 列举存在的端口映射
- 增/删端口映射 (在租用时间内)
- i.e., 自动化静态NAT端口映射配置
- 方案 3: 中继 (used in Skype)
- ?? ques 不太理解 中继是怎么和Server连起来的
- NAT后面的服务器建立和中继的连接
- 外部的客户端链接到中继
- 中继在2个连接之间桥接
中间盒
- 还有其他种类繁多网络设备(中间盒):
- 中间盒运行在网络层且不执行传统的数据转发
- 如
- NAT : 重写首部ip和port
- 防火墙 : 基于首部字段阻拦流量或重定向分组
- 负载均衡 : 按算法转发给server
- 未来:不断增加的需求和相应的网络设备
- P227
- 需要不同的设备去实现不同的网络功能
- 每台设备集成了控制平面和数据平面的功能
- 控制平面分布式地实现了各种控制平面功能
- 升级和部署网络设备非常困难
通用转发和SDN
路由器的网络层功能:
- IP转发:对于到来的分组按照路由表决定如何转发;属于数据平面
- 路由:决定路径,计算路由表;属于控制平面
传统方式实现网络功能的问题
- 垂直集成>昂贵、不便于创新的生态
- 分布式、固化设备功能==网络设备种类繁多
- 无法改变路由等工作逻辑,无法实现流量工程等高级特性
- 配置错误影响全网运行;升级和维护会涉及到全网设备:管理困难
- 要增加新的网络功能,需要设计、实现以及部署新的特定设备,设备种类繁多
SDN (控制平面)
SDN:逻辑上集中的控制平面
一个不同的(通常是远程)控制器和CA交互,控制器决定分组转发的逻辑(可编程),CA所在设备执行逻辑。
- 远程控制器计算和分发匹配加动作表
- 实现网络设备数据平面和控制平面分离
见导论功能控制平面
通用转发 (数据平面)
- 基于目的地转发可分为两步骤
- 匹配 : 查找目的IP地址
- 动作 : 将分组发送到有特定输出端口的交换结构
- 可以看到这是匹配 + 动作的一种特例
下面看一下通用的匹配加动作范式
- 匹配加动作
- 匹配: 可以对协议栈的多个首部字段进行 匹配 , 这些首部字段与不同层次的协议关联
- 动作: 将分组转发到一个或多个输出端口(像基于目的地转发一样),负责均衡,重写首部值(像NAT一样),阻挡/丢弃分组(像防火墙一样)等等
以下所述都是基于Open Flow
OpenFlow : 匹配加动作抽象,控制器,SDN概念 的标准
Flow table 流表
- 匹配加动作转发表在OpenFlow中被称为流表
- 表项包括
- 首部字段值的集合 Rule
- 所采取动作集合 Action: 转发 / 丢弃 / 重写
- 计数器集合 Stats: Packet + byte counters
分组交换机 or 路由器 ?
- 由于流表 除了网络层之外,还需要链路层的首部字段来做出动作决定,所以不能再叫路由器(网络层)了,当然也不能叫(第二层)交换机,我们将其称为 分组交换机
匹配
- OpenFlow的匹配抽象允许对来自三个层次的协议的首部字段进行匹配
- 流表中的表项结构如下
动作
- 转发 : 分组转发到指定端口 / 广播道所有端口 / 多播 / 发给远程控制器(远程控制器可能安装新的流表)等
- 丢弃 : 流表项中无动作
- 修改字段 : 重写分组首部字段(234层)
匹配加动作 例子
分组交换机(路由器)匹配加动作操作 充当
简单转发
负载均衡
防火墙
这样就不必通过中间盒
自顶向下P234
数据平面data plane小结
- 网络层的数据平面功能 :
- 即路由器的转发功能
- 决定到达路由器的输入链路之一的分组如何转发到路由器的输出链路
- 即路由器的转发功能
- 数据平面
- 传统转发 -> 通用转发(匹配加动作)
- 相应的控制平面
- 传统路由 -> SDN
- (控制)SDN和(数据)通用转发搭配
- (控制)传统路由和(数据)传统转发搭配
- 路由器结构
- 除此之外还学习了IP编址 , DHCP协议 , 什么是传说中的NAT(就是通过重写ip+port以及记录转换表 将私有ip转化为公有ip) , 知道了中间盒都是什么,如nat 防火墙等