文章目录
-
- 零、导论
-
- [0.1 网络层服务](#0.1 网络层服务)
- [0.2 网络层的关键功能](#0.2 网络层的关键功能)
- [0.3 网络层:数据平面、控制平面](#0.3 网络层:数据平面、控制平面)
- [0.4 传统方式:每一路由器(Per-router)控制平面](#0.4 传统方式:每一路由器(Per-router)控制平面)
- [0.5 传统方式:路由和转发的相互作用](#0.5 传统方式:路由和转发的相互作用)
- [0.6 SDN方式:逻辑集中的控制平面](#0.6 SDN方式:逻辑集中的控制平面)
- [0.7 网络服务模型](#0.7 网络服务模型)
- [0.8 连接建立](#0.8 连接建立)
- [0.9 网络层服务模型](#0.9 网络层服务模型)
- 一、路由器组成
-
- [1.1 路由器结构概况](#1.1 路由器结构概况)
- [1.2 输入端口功能](#1.2 输入端口功能)
- [1.3 输入端口缓存](#1.3 输入端口缓存)
- [1.4 交换结构](#1.4 交换结构)
-
- [1.4.1 内存交换](#1.4.1 内存交换)
- [1.4.2 通过总线交换](#1.4.2 通过总线交换)
- [1.4.3 通过互联网络(crossbar等)的交换](#1.4.3 通过互联网络(crossbar等)的交换)
- [1.5 输出端口](#1.5 输出端口)
-
- [1.5.1 输出端口排队](#1.5.1 输出端口排队)
- [1.6 调度机制](#1.6 调度机制)
-
- [1.6.1 调度策略: 优先权](#1.6.1 调度策略: 优先权)
- [1.6.2 Round Robin(RR) scheduling](#1.6.2 Round Robin(RR) scheduling)
- [1.6.3 Weighted Fair Queuing(WFQ)](#1.6.3 Weighted Fair Queuing(WFQ))
- [二、IP:Internet Protocal](#二、IP:Internet Protocal)
-
- [2.1 IPv4 数据报格式](#2.1 IPv4 数据报格式)
- [2.2 IP分片和重组](#2.2 IP分片和重组)
- [2.3 IP 编址](#2.3 IP 编址)
-
- [2.3.1 引论](#2.3.1 引论)
- [2.3.2 子网(Subnets)](#2.3.2 子网(Subnets))
- [2.3.3 IP 地址分类](#2.3.3 IP 地址分类)
- [2.3.4 特殊IP地址](#2.3.4 特殊IP地址)
- [2.3.5 内网(专用)IP地址](#2.3.5 内网(专用)IP地址)
- [2.3.6 CIDR](#2.3.6 CIDR)
- [2.3.7 子网掩码](#2.3.7 子网掩码)
- [2.3.8 转发表和转发算法](#2.3.8 转发表和转发算法)
- [2.3.9 如何获得一个IP地址](#2.3.9 如何获得一个IP地址)
- [2.3.10 DHCP:Dynamic Host Configuration Protocol](#2.3.10 DHCP:Dynamic Host Configuration Protocol)
- [2.3.11 如何获得一个IP地址](#2.3.11 如何获得一个IP地址)
- [2.3.12 层次编址:路由聚集(route aggregation)](#2.3.12 层次编址:路由聚集(route aggregation))
- [2.3.13 层次编址:特殊路由信息(more specific routes)](#2.3.13 层次编址:特殊路由信息(more specific routes))
- [2.4 VPN与NAT:Network Address Translation](#2.4 VPN与NAT:Network Address Translation)
- [2.5 IPv6](#2.5 IPv6)
-
- [2.5.1 IPv6头部(Cont)](#2.5.1 IPv6头部(Cont))
- [2.5.2 和IPv4的其它变化](#2.5.2 和IPv4的其它变化)
- [2.5.3 IPv4 到 IPv6 的平移](#2.5.3 IPv4 到 IPv6 的平移)
- [2.5.4 IPv6:应用](#2.5.4 IPv6:应用)
- 三、通用转发和SDN
-
- [3.1 网络层:数据平面和控制平面](#3.1 网络层:数据平面和控制平面)
- [3.2 每个路由器(Per Route)的控制平面](#3.2 每个路由器(Per Route)的控制平面)
- [3.3 数量众多、功能各异的中间盒](#3.3 数量众多、功能各异的中间盒)
- [3.4 网络设备控制平面的实现方式特点](#3.4 网络设备控制平面的实现方式特点)
- [3.5 传统方式实现网络功能的问题](#3.5 传统方式实现网络功能的问题)
- [3.6 SDN:逻辑上集中的控制平面](#3.6 SDN:逻辑上集中的控制平面)
- [3.7 通用转发和SDN](#3.7 通用转发和SDN)
- [3.8 OpenFlow 抽象](#3.8 OpenFlow 抽象)
零、导论
0.1 网络层服务
- 在发送主机和接收主机之间传送段(segment)
- 在发送端将段封装到数据包中
- 在接收端,将段上交给传输层实体
- 网络层协议存在于每一个主机和路由器
- 路由器检查每一个经过它的IP数据报的头部
0.2 网络层的关键功能
网络层功能:
- 转发:将分组从路由器的输入接口转发到合适的输出接口
- 路由 :使用路由算法来决定分组从发送主机到目标接收主机的路径
- 路由选择算法
- 路由选择协议
旅行的类比:
- **转发:**通过单个路口的过程
- **路由:**从 源到目的 的路由规划过程
0.3 网络层:数据平面、控制平面
数据平面
- 本地,每个路由器功能
- 决定从路由器输入端口到达的分组如何转发到输出端口
- 转发功能:
- 传统方式:基于目标地址+转发表
- SDN方式:基于多个字段+流表
控制平面
- 网络范围内的逻辑
- 决定数据报如何在路由器之间路由,决定数据报从 源到目标主机之间的端到端路径
- 2个控制平面方法:
- 传统的路由算法:在路由器中被实现
- **software-defined-newworking(SDN):**在远程的服务器中实现
0.4 传统方式:每一路由器(Per-router)控制平面
在每一个路由器中的单独路由器算法原件,在控制平面进行交互。
0.5 传统方式:路由和转发的相互作用
0.6 SDN方式:逻辑集中的控制平面
一个不同的(通常是远程的)控制器与本地控制代理(CAs)交互
0.7 网络服务模型
Q :发送方主机到接收方主机传输数据报的"通道 ",网络提供什么样的服务模型?
对于单个数据报的服务:
- 可靠传送
- 延迟保证,如:少于 40 ms 的延迟
对于数据报流的服务:
- 保序数据报传送
- 保证流的最小带宽
- 分组之间的延迟差
0.8 连接建立
- 在某些网络架构中是第三个重要的功能
- ATM,frame relay,X.25
- 在分组传输之前,在两个主机之间,在通过一些路由器所构成的路径上建立一个网络层连接
- 涉及到路由器
- 网络层和传输层的区别:
- **网络层:**在2个主机之间,涉及到路径上的一些路由器(有连接)
- **传输层:**在2个进程之间,很可能只体现在端系统上(TCP连接)(面向连接)
0.9 网络层服务模型
- Internet 提供的是一种尽力而为的服务,甚么都不保证
- ATM 的几种模型详见上表
一、路由器组成
1.1 路由器结构概况
高层面(非常简化的)通用路由器体系架构
- 路由:运行路由选择算法 / 协议(RIP,OSPF,BGP)-生成路由表
- 转发:从输入到输出链路交换数据报-根据路由表进行分组的转发
1.2 输入端口功能
1.3 输入端口缓存
- 当交换机构的速率小于输入端口的汇聚速率时 会导致 在输入 端口可能要排队
- 排队延迟以及由于输入缓存溢出造成丢失!
- Head-of-the-Line(HOL) blocking:排在队头的数据报阻止了队列中其他数据报向前移动
1.4 交换结构
交换结构位于一台路由器的核心部位。
- 将分组从输入缓冲区传输到合适的输出端口
- 交换速率:分组可以按照该速率从传入传输到输出
- 运行速度经常是输入/输出链路速率的若干倍
- N个输入端口:交换机构的交换速度是输入线路速度的N倍比较理想,才不会成为瓶颈。
- 3种典型的交换结构(和系统结构课程中的互连网络部分类似)
1.4.1 内存交换
第一代路由器(斯坦福):
- 在CPU直接控制下的交换,采用传统的计算机
- 分组被拷贝到系统内存,CPU从分组的头部提取出目标 地址,查找转发表,找到对应的输出端口,拷贝到输出端口
- 转发速率被内存的带宽限制 (数据报通过BUS两遍)
- 一次只能转发一个分组
1.4.2 通过总线交换
这里的总线并非计组中的系统总线,而是指 fabric 的体现形式为 一根共享总线。
- 数据报通过共享总线,从输入端口转发到输出端口
- **总线竞争:**交换速度受限于带宽
- 1次处理一个分组
- 1Gbps bus,Cisco 1900;32 Gbps bus,Cisco 5600;对于接入或企业级路由器,速度足够(但不适合区域或骨干网络)
1.4.3 通过互联网络(crossbar等)的交换
- 同时并发转发多个分组,克服总线带宽限制
- Banyan (榕树)网络,crossbar(纵横)和其它的互联网络被开发,将多个处理器连接成多处理器
- 当分组从端口A 到达,转给端口Y;控制器短接相应的两个总线
- 高级设计:将数据报分片为固定长度的信元,通过交换网络交换
- Cisco12000 :以60Gbps的交换速率通过互联网络
1.5 输出端口
数据报(分组)可能会被丢弃,由于拥塞,缓冲区没有空间。
- 当数据报从交换机构的到达速度比传输速率快,就需要输出端口缓存
- 由调度规则选择排队的数据报进行传输
优先权调度------谁会获得最优性能, 网络中立?
- 这取决于具体实现,比如我们想要对多媒体应用做更好的支撑,那么当多媒体应用分组和 telnet分组同时到达,我们可能会把多媒体应用的分组放前面
1.5.1 输出端口排队
- 假设交换速率 R s w i t c h R_{switch} Rswitch 是 R l i n e R_{line} Rline 的 N 倍 (N: 输入端口的数量)
- 当多个输入端口同时向输出端口发送时,缓冲该分组(当通 过交换网络到达的速率超过输出速率则缓存)
- 排队带来延迟,由于输出端口缓存溢出则丢弃数据报 !
1.6 调度机制
- 调度: 选择下一个要通过链路传输的分组.
- FIFO(first in first out) scheduling: 按照分组到来的次序发送
- 现实例子?
- 丢失策略: 如果分组到达一个满的队列, 哪个分组将会被抛弃
- tail drop: 如果分组到达一个满的队列,哪个分组将会 被抛弃?
- priority: 根据优先权丢失/移除分组
- random: 随机地丢弃/移除
1.6.1 调度策略: 优先权
**优先权调度:**发送最高优先 权的分组
- 多类, 不同类别有不同的优先权
- 类别可能依赖于标记或者其他的头部字段, e.g. IP source / dest. port numbers, ds, etc.
- 先传高优先级的队列中的分组, 除非没有
- 高(低) 优先权中的分组传输次序: FIFO
1.6.2 Round Robin(RR) scheduling
- 多类
- 循环扫描不同类型的队列, 发送完一类的一个分组, 再发送下一个类的一个分组, 循环所有类
1.6.3 Weighted Fair Queuing(WFQ)
- 一般化的Round Robin
- 在一段时间内, 每个队列得到的服务时间 是:
- Wi / (SIGMA(Wi)) * t, 和权重成正比
- 每个类在每一个循环中获得不同权重的服务量
二、IP:Internet Protocal
2.1 IPv4 数据报格式
首部格式
IPv4 数据报首部由 固定部分(20字节) 和 **可变部分(40字节)**组成。
各字段含义:
-
版本:指明通信双方所使用IP协议的版本,0100 代表 IPv4
-
首部长度 :以4字节为单位指明首部长度。首部长度 = 首部字段值 * 4 字节,0~15 对应了 0~60 字节,因为每个IPv4首部固定长度为20字节,所以该字段的值 最小为5,最大为15
-
区分服务:规定IP数据报的服务质量,如低延时,高带宽。只有在使用区分服务时,该字段才起作用
-
总长度:指明首部和数据部分的长度总和。以字节为单位,最大值为 65535。
- 事实上现实中极少遇到传送如此之大,65535 字节的数据报。
- IPv4数据报总长度 = 首部长度 + 数据载荷长度
-
标识,标志,片偏移三个字段共同用于数据报分片
在IP协议下的每一种链路层协议都规定了帧的最大数据载荷长度(MTU),当IPv4数据报长度大于MTU,无法封装成帧,此时就需要对IP数据报进行分片,然后将每个分片封装成帧,分别发送。
但是接收到的各个分片,我们如何还原出原来的IP数据报呢?
假如现在有发送主机H1,H2,分别发送了2个数据报、1个数据报 给 H3
这个时候标识、标志、片偏移三个字段就能发挥作用了。
- 标识(16bit):属于同一个数据报的各分片应该具有相同的标识,IP软件维持一个计数器,每产生一个数据报,计数器值+1
- 片偏移(13bit):分片的数据部分相对于其在原数据报数据部分中的偏移量,8字节为单位。
- 标志(3bit) :
- DF位:1表示不允许分片;0表示允许分片
- MF位:1表示 "后面还有分片";0表示"这是最后一个分片"
- 保留位,必须为0
那么在H3端就很清晰明了了。
以以太网MTU=1500字节为例,我们对一个3800字节的数据报进行分片
-
生存时间TTL(8bit)
- 最初以秒为单位,最大生存时间为255秒 ;路由器转发IP数据报时,将IP数据报首部中的该字段的值减去IP数据报在本路由器上
所耗费的时间,若不为0就转发,否则就丢弃。 - 现在以"跳数"为单位,路由器转发IP数据报时,将IP数据报首部中的该字段的值减1,若不为0就转发,否则就丢弃。
- 最初以秒为单位,最大生存时间为255秒 ;路由器转发IP数据报时,将IP数据报首部中的该字段的值减去IP数据报在本路由器上
-
协议(8bit)
- 指明IPv4数据报的数据部分是何种协议数据单元
-
首部检验和(16bit)
- 只检验首部,不包括数据部分
- 数据报每经过一个路由器,路由器都要重新计算首部校验和,因为某些字段(生存时间、标志、片偏移等)的取值可能发生变化。
- 由于IP层本身并不提供可靠传输的服务,并且计算首部校验和是一项耗时的操作 ,因此在IPv6中,路由器不再计算首部校验和,从而更快转发IP数据报。
-
源IP地址和目的IP地址(各32bit)
- 32bit 的 IPv4地址
-
可变字段(长度可变)
- 长度从1个字节到40个字节
- 用来支持排错、测量以及安全
- 目前,可选字段很少使用,许多路由器忽略它们或不能有效处理它们。
-
填充(长度可变)
- 确保首部长度为4字节整数倍
- 使用全0进行填充
2.2 IP分片和重组
例子
- 4000 字节数据报
- 20字节头部
- 3980字节数据
- MTU = 1500字节
- 第一片:20字节头部+1480字 节数据
- 偏移量:0
- 第二片:20字节头部 + 1480字节数据(1480字节应用数据)
- 偏移量:1480/8=185
- 第三片:20字节头部 + 1020字节数据(应用数据)
- 偏移量:2960 / 8=370
2.3 IP 编址
2.3.1 引论
- IP地址:32位标示,对主机或者路由器的接口编址
- 接口 :主机/路由器和物理链路的连接处
- 路由器通常拥有多个接口
- 主机也有可能有多个接口
- IP地址和每一个接口关联
- 一个IP地址和一个接口相关联
至于接口间是如何连接的,在网络层:控制平面和链路层会介绍。
2.3.2 子网(Subnets)
- IP地址:
- 子网部分(高位bits)
- 主机部分(低位bits)
- 什么是子网(subnet)?
- 一个子网内的节点(主机或者路由器)它们的 IP地址的高位部分相同 ,这些节点构成的网络的一部分叫做子网
- 无需路由器介入,子网内各主机可以在物理上相互直接到达
子网判断方法:
- 要判断一个子网,将每一个接口从主机或者路由器上分开,构成了一个个网络的孤岛
- 每一个孤岛(网络)都可以被称之为一个 subnet
如上图,我们得到了3个子网,每个子网的子网前缀相同。
子网掩码:11111111 11111111 11111111 00000000
Subnet mask:/ 24
在看一个例子,上图中有6个子网。
2.3.3 IP 地址分类
A、B、C为单播地址,D类为广播地址,E类预留
- Class A:126 networks,16 million hosts
- 最高位为0,第一个字节的其余7位代表网络号,剩余24位代表主机号
- A类地址一共 2^7 - 2 = 126个(其中两个地址预留用于其它用途)
- Class B:16382 networks,64 K hosts
- 高2位为10,前两个字节剩余14位为网络号,剩余16位为主机号
- 2^14 - 2
- Class C:2 million networks,254 host
- 高3位为110,前三个字节剩余21位为网络号,剩余8位为主机号
- 2^21 - 2
- Class D:multicast
- 高4位为1110,剩余28位为广播地址
- Class E:reserved for future
- 高5位为11110,其余位预留
2.3.4 特殊IP地址
-
一些约定
- 子网部分:全为0------本网络
- 主机部分:全为0------本主机
- 主机部分:全为1------广播地址,这个网络的所有主机
-
特殊IP地址
2.3.5 内网(专用)IP地址
- 专用地址:地址空间的一部份供专用地址使用
- 永远不会被当做公用地址来分配,不会与公用地址重复
- 只在局部网络中有意义,区分不同的设备
- 路由器不对目标地址是专用地址的分组进行转发
- 专用地址范围
- Class A 10.0.0.0-10.255.255.255 MASK 255.0.0.0
- Class B 172.16.0.0-172.31.255.255 MASK 255.255.0.0
- Class C 192.168.0.0-192.168.255.255 MASK 255.255.255.0
2.3.6 CIDR
CIDR:Classless InterDomain Routing(无类域间路由)
- 子网部分可以在任意的位置
- 地址格式:a.b.c.d/x,其中 x 是地址中子网号的长度
比如上面这个例子,低9位为主机号,高23位为子网号,那么就可以表示为 200.23.16.0/23
2.3.7 子网掩码
- 32bits,每位0 或 1
- 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
- CIDR 下的子网掩码例子:
- 11111111 11111111 11111100 00000000
- 另外的一种表示子网掩码的表达方式
- /#
- 例:/22:表示前面22个bit为子网部分
2.3.8 转发表和转发算法
- 获得IP数据报的目标地址
- 对于转发表中的每一个表项
- 如 (IP Des addr) & (mask) == destination,则按照表项对应的接口转发该数据报
- 如果都没有找到,则使用默认表项转发数据报
2.3.9 如何获得一个IP地址
- 系统管理员将地址配置在一个文件中
- Wintel:control-panel->network- >configuration->tcp/ip->properties
- UNIX:/etc/rc.config
- DHCP :Dynamic Host Configuration Protocol:从服务器中动态获得一个IP地址
- "plug-and-play"
2.3.10 DHCP:Dynamic Host Configuration Protocol
DHCP(Dynamic Host Configuration Protocol) 动态主机配置协议,它提供了一种动态指定IP地址和配置参数的机制,用于简化主机 IP 配置管理。
**目标:**允许主机在加入网络的时候,动态地从服务器那里获得IP地址:
- 以更新对主机在用IP地址的租用期-租期快到了
- 重新启动时,允许重新使用以前用过的IP地址
- 支持移动用户加入到该网络(短期在网)
作用
-
可为局域网中各主机配置以下信息
- IP地址
- 子网掩码
- 默认网关IP地址
- DNS服务器IP地址
-
DHCP支持3种IP地址分配机制:
- 自动分配---DHCP服务器为DHCP客户分配一个永久IP地址
- 动态分配---DHCP服务器为DHCP客户分配一个有租赁期的临时IP地址
- 人工分配---DHCP客户的IP地址有管理员分配好,DHCP只负责传达
DHCP工作概况:
- 采用C/S 即,客户端/服务器模式,指定的DHCP服务器负责分配IP地址,并将配置参数传送为DHCP客户。
- DHCP使用UDP协议 ,服务器端使用67号端口 ,客户端使用UDP的68号端口。
- 主机广播 "DHCP discover" 报文[可选]
- DHCP 服务器用 "DHCP offer" 提供报文响应[可选]
- 主机请求 IP 地址:发送 "DHCP request" 报文
- DHCP 服务器发送地址:"DHCP ack" 报文
DHCP 不仅仅返回IP地址,DHCP返回:
- IP地址
- 第一跳路由器的IP地址(默认网关)
- DNS 服务器的域名和IP地址
- 子网掩码(指示地址部分的网络号和主机号)
DHCP中继代理
- 不是每个网络上都有 DHCP 服务器,可以设置一个 DHCP 中继代理,它配置了 DHCP 服务器的 IP 地址信息。
- 当 DHCP 中继代理收到主机发送的发现报文后,**就以单播方式向 DHCP 服务器转发此报文。**并等待其回答。收到 DHCP 服务器回答的提供报文后,DHCP 中继代理再将此提供报文发回给主机。
DHCP报文格式
DHCP client-server scenario
- 主机 发送广播
- 服务器 响应,可以给你租用期3600 秒
- 主机请求
- 客户端返回IP地址,子网掩码
DHCP 实例
- 联网笔记本需要获取自己 的IP地址,第一跳路由器地址 和 DNS服务器:采用 DHCP协议
- DHCP 请求被封装在UDP段中, 封装在IP数据报中,封装在 以太网的帧中
- 以太网帧在局域网范围内广播 (dest:FFFFFFFFFFFF) , 被运行DHCP服务的路由器收到
- 以太网帧解封装成IP,IP 解封装成UDP,解封装成 DHCP
- DHCP服务器生成DHCP ACK, 包含客户端的IP地址,第一跳路由器的IP地址和DNS域名服务器的IP地址
- DHCP服务器封装的报文所在的帧转发到客户端,在客户端解封装成DHCP报文
- 客户端知道它自己的IP地址,DNS服务器的名字和IP 地址,第一跳路由器的IP 地址
2.3.11 如何获得一个IP地址
问:如何获得一个网络的子网部分?
答:从ISP获得地址块中分配一个小地址块
比如 ISP 获得地址块:高20位为网络号,低12位为主机号,下面有8个机构现需要分配
那么可以把 低12位的高三位 作为子网号进一步划分,以高23位为网络号下发给下面的8个机构
问:一个ISP如何获得一个地址块?
答:ICANN:Internet Corporation for Assigned Names and Numbers
- 分配地址
- 管理DNS
- 分配域名 ,解决冲突
2.3.12 层次编址:路由聚集(route aggregation)
如何决定下一跳?
- IPx 负责转发高20位相同的8个连续的网络号为23位的IP
- IPx 提取20位公共前缀对前面通告,我是 高20位为这个的下一条
- 那么对于前面那个路由器而言,他把8个IP做了聚集,转发给IPx,再有IPx来进行细分的转发
2.3.13 层次编址:特殊路由信息(more specific routes)
有时候不会那么巧,恰好能够对连续的多个相同前缀IP做聚集。
比如上面的例子,如果IPx 能够转发 200.23.20.0/23 ~ 200.23.30.0/23 和 200.23.16.0/23 这7个IP,而 200.23.18.0/23 是 IPy转发的,这个时候我们为了更为精确,就要牺牲一些路由表项空间来做更为精确的聚集
IPx 发通告,转发给我 200.23.16.0/20 的IP,IPy 发通告 转发给我200.13.18.0/23的通告
IPx 仍然发了8个IP进行聚集的通告,但是有一个空洞,那么当 200.13.18.0/23 真正到来时,根据最长匹配前缀原则,会将IPy作为下一跳,不会发生错误。
2.4 VPN与NAT:Network Address Translation
虚拟专用网VPN(Virtual Private Network)
利用公用的因特网 作为本机构各专用网之间的通信载体,这样的专用网又称为虚拟专用网。
由于IPv4地址的紧缺,一个机构能够申请到的IPv4地址数量往往远小于本机构所拥有的主机数量。因此,虚拟专用网中的各主机所分配的地址应该是本机构可自由分配的专用地址,而不是需要申请的、在因特网上使用的公有地址
-
**动机:**本地网络只有一个有效IP地址:
- 不需要从ISP分配一块地址,可用一个IP地址用 于所有的(局域网)设备------省钱
- 可以在局域网改变设备的地址情况下而无须通知外界
- 可以改变ISP(地址变化)而不需要改变内部的 设备地址
- 局域网内部的设备没有明确的地址,对外是不可见的安全
-
实现: NAT 路由器必须:
-
外出数据包 :替换源地址和端口号为NAT IP地址 和新的端口号,目标IP和端口不变
...远端的C/S将会用NAP IP地址,新端口号作为目标地址
-
记住 每个转换替换对(在NAT转换表中)
... 源IP ,端口 vs NAP IP ,新端口
-
进入数据包 :替换目标IP地址和端口号 ,采用存储在NAT 表中的mapping表项,用(源IP,端口)
-
内网主机向外网发送数据,可以轻松进行内网IP,内网端口,到新IP,新端口的转换
但是如果外网想要跟内网的主机通信,该如何转换?这涉及到了内网穿透问题
- 16-bit 端口字段
- 6 万多个同时连接,一个局域网
- 对 NAT 是有争议的:
- 路由器只应该对第3 层做信息处理,而这里对端口号(4层)作了处理
- 违反了end-to-end 原则
- 端到端原则:复杂性放到网络边缘
- 无需借助中转和变换,就可以直接传送到目标主机
- NAT可能要被一些应用设计者考虑,eg, P2P applications
- 外网的机器无法主动连接到内网的机器上
- 端到端原则:复杂性放到网络边缘
- 地址短缺问题可以被 IPv6 解决
- NAT 穿越:如果客户端需要连接在NAT后面的服务器,如何操作
NAT 穿透问题
- 客户端需要连接地址为 10.0.0.1的服务器
- 服务器地址10.0.0.1 LAN本地地址 (客户端不能够使用其作为目标地址)
- 整网只有一个外部可见地址:138.76.29.7
方案1 :静态配置NAT:转发进来的对服务器特定端口连接请求
- e.g., (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)
- NAT后面的服务器建立和中继的连接
- 外部的客户端链接到中继
- 中继在2个连接之间
方案3为最常用的内网穿透的方法。
现在很多人会想要去远程办公,当然可以借助于一些远程办公软件,如向日葵。但是如果有条件,还是可以用一下内网穿透的方式。
租一台服务器,将办公设备和手边的设备(ipad等)和服务器进行通信,然后借助第三方软件串流,就可以进行远程办公。这里说的比较潦草,网上有很多教程,可以参考。
2.5 IPv6
- 初始动机 :32-bit地址空间将会被很快用完。
- 另外的动机
- 头部格式改变帮助加速处理和转发
- TTL-1
- 头部checksum
- 分片
- 头部格式改变帮助QoS
- 头部格式改变帮助加速处理和转发
IPv6 数据报格式:
- 固定的40 字节头部
- 数据报传输过程中,不允许分片
2.5.1 IPv6头部(Cont)
Priority:标示流中数据报的优先级
Flow Label :标示数据报在一个"flow"("flow" 的概念没有被严格的定义)
Next header:标示数据报中的内容应该交付给哪个上层协议
2.5.2 和IPv4的其它变化
- Checksum(校验和):被移除掉,降低在每一段中的处理速度
- Options:允许,但是在头部之外,被"Next Header"字段标示
- ICMPV6 :ICMP 的新版本
- 附加了报文类型,e.g."Packet Too Big"
- 多播组管理功能
2.5.3 IPv4 到 IPv6 的平移
- 不是所有的路由器都能够同时升级的,所有设备同时宕机一天来更新,代价太大
- 没有一个标记日 "flag days"
- 在IPv4 和IPv6路由器混合时,网络如何运转?
- 隧道 :在IPv4 路由器之间传输的IPv4 数据报中携带IPv6数据报
将IPv6数据报放在IPv4的数据字段中,借助于IPv4路由来传送到IPv6的路由器
经过慢启动的过程,IPv6的路由器越来越多,从而,IPv4反而成了稀少的一方,那么自然可以将IPv4 放到IPv6 的数据部分来传输。
2.5.4 IPv6:应用
- Google: 8% 的客户通过IPv6访问谷歌服务
- NIST:全美国1/3的政府域支持IPv6
- 估计还需要很长时间进行部署
- 20年以上!
- 看看过去20年来应用层面的变化:WWW, Facebook, streaming media, Skype, ...
- 为什么?
三、通用转发和SDN
网络层功能:
- 转发:对于从某个端口到来的分组转发到合适的输出端口
- 路由 :决定分组从源端到目标端的路径
- 路由算法
3.1 网络层:数据平面和控制平面
数据平面
- 本地的、每个路由器的功能
- 决定某个从某个端口进入的分组从哪个端口输出
- 转发功能
控制平面
- 网络范围的逻辑
- 决定分组端到端穿行于各个路由器的路径
3.2 每个路由器(Per Route)的控制平面
每个 路由器上都有实现路由算法元件(它们之间需要相互交互),形成传统 IP 实现方式的控制平面。
- 每台设备上既实现控制功能、又实现数据平面
- 控制功能分布式实现
- 路由表-粘连
3.3 数量众多、功能各异的中间盒
- 路由器的网络层功能
- IP转发:对于到来的分组按照路由表决定如何转发,数据平面
- 路由:决定路径,计算路由表;处在控制平面
- 还有其他种类繁多网络设备(中间盒):
- 交换机;防火墙;NAT;IDS;负载均衡设备
- 未来:不断增加的需求和相应的网络
- 需要不同的设备去实现不同的网络功能
- 每台设备集成了控制平面和数据平面的功能
- 控制平面分布式地实现了各种控制平面功能
- 升级和部署网络设备非常困难
3.4 网络设备控制平面的实现方式特点
- 互联网网络设备:传统方式都是通过分布式,每台设备的方法来实现数据平面和控制平面功能
- 垂直集成 :每台 路由器或其他网络设备,包括:
- 1)硬件、在私有的操作系统
- 2)互联网标准协议(IP、RIP、IS-IS、OSPF、BGP)的私有实现
- 从上到下都由一个厂商提供(代价大、被设备上"绑架")
- 每个设备都实现了数据平面和控制平面的事情
- 控制平面的功能是分布式实现的
- 设备基本上只能(分布式升级困难)按照固定方式工作,控制逻辑固化。不同的网络功能需要不同的"middlebox":防火墙、负载均衡设备、NAT boxes,......
- 垂直集成 :每台 路由器或其他网络设备,包括:
- (数据 + 控制平面)集成 > (控制逻辑)分布 - > 固化
- 代价大;升级困难、管理困难等
3.5 传统方式实现网络功能的问题
- 问题:
- 垂直集成 > 昂贵、不便于创新的生态
- 分布式、固化设备功能 == 网络设备种类繁多
- 无法改变路由等工作逻辑,无法实现流量工程等高级特性
- 配置错误影响全网运行;升级和维护会涉及到全网设备:管理困难
- 要增加新的网络功能,需要设计、实现以及部署新的设备,设备种类繁多
- ~2005:开始重新思考网络控制平面的处理方式
- 集中:远程的控制器集中实现控制逻辑
- 远程:数据平面和控制平面的分离
3.6 SDN:逻辑上集中的控制平面
一个不同的(通常是远程)控制器和CA交互,控制器决定分组转发的逻辑(可编程),CA所在设备执行逻辑。
SDN主要思路
- 网络设备数据平面和控制平面分离
- 数据平面 - 分组交换机
- 将路由器、交换机和目前大多数网络设备的功能进一步抽象成:按照流表(由控制平面设置的控制逻辑)进行PDU (帧、分组)的动作(包括转发、丢弃、拷贝、泛洪、阻塞)
- 统一化设备功能:SDN交换机(分组交换机),执行控制逻辑
- 控制平面-控制器+网络应用
- 分离、集中
- 计算和下发逻辑:流表
SDN控制平面和数据平面分离的优势
- 水平集成 控制平面的开放实现 (而非私有实现),创造出好的产业生态,促进发展。
- 分组交换机、控制器和各种控制逻辑网络应用app可由不同厂商生产,专业化,引入竞争形成良好生态
- 集中式 实现控制逻辑,网络管理容易
- 集中式控制器了解网络状况,编程简单,传统方式困难
- 避免路由器的误配置
- 基于流表的匹配+行动 的工作方式允许"可编程的 "分组交换机
- 实现流量工程等高级特性
- 在此框架下实现各种新型(未来)的网络设备
类比:主框架到PC的演变
流量工程:传统路由比较困难
-
Q:网管如果需要 u 到 z 的流量走 uvwz, x 到 z 的流量走 xwyz,怎么办?
-
A:需要定义链路的代价,流量路由算法以此运算(IP路由面向目标,无法操作) (或者需要新的路由算算法!)
-
Q:如果网管需要将 u 到 z 的流量分成2路:uvwz和uxyz(负载均衡),怎么办?(IP路由面向目标)
-
A:无法完成(在原有体系下只有使用新的路由选择算法 ,而在全网部署新的路由算法是个大的事情)
-
Q:如果需要w对蓝色的和红色的流量采用不同的路由,怎么办?
-
A:无法操作(基于目标的转发,采用LS,DV 路由)
而采用SDN的方式就很容易实现,因为SDN可以根据主机号,端口号等因素加以区分,从而使得网络流量负载均衡。
SDN 特点
SDN架构:数据平面交换机
数据平面交换机
- 快速,简单,商业化交换设备 采用硬件实现通用转发功能
- 流表被控制器计算和安装
- 基于南向API(例如OpenFlow),SDN控制器访问基于流的交换机
- 定义了哪些可以被控制哪些不能
- 也定义了和控制器的协议(e.g. OpenFlow)
SDN架构:SDN控制器
SDN 控制器(网络OS):
- 维护网络状态信息
- 通过上面的北向API和网络控制应用交互
- 通过下面的南向API和网络交换机交互
- 逻辑上集中,但是在实现上通常由于性能、可扩展性、容错性以及鲁棒性采用分布式方法
SDN 架构: 控制应用
网络控制应用:
- 控制的大脑: 采用下层提供的服务(SDN控制器提供的 API),实现网络功能
- 路由器 交换机
- 接入控制 防火墙
- 负载均衡
- 其他功能
- 非绑定:可以被第三方提供,与控制器厂商以通常上不同,与分组交换机厂商也可以不同
3.7 通用转发和SDN
每个路由器包含一个流表(被逻辑上集中的控制器计算和分发)
OpenFlow 数据平面抽象
- 流:由分组(帧)头部字段所定义
- 通用转发:简单的分组处理规则
- 模式:将分组头部字段和流表进行匹配
- 行动:对于匹配上的分组,可以是丢弃、转发、修改、 将匹配的分组发送给控制器
- 优先权Priority: 几个模式匹配了,优先采用哪个,消除歧义
- 计数器Counters:#bytes 和 #packets
路由器中的流表定义了路由器的匹配+行动规则 (流表由控制器计算并下发)
OpenFlow: 流表的表项结构
例子
3.8 OpenFlow 抽象
- match + action 统一化各种网络设备提供的功能
- 路由器:
- match:最长前缀匹配
- action:通过一条链路转发
- 交换机
- match:目标MAC地址
- action:转发或泛洪
- 防火墙
- match:IP地址和TCP/UDP端口号
- action:允许或者禁止
- NAT
- match:IP地址和端口号
- action:重写地址和端口号
目前几乎所有的网络设备都可以在这个匹配 + 行动模式框架进行描述,具体化为各种网络设备包括未来的网络设备
示例:
现在还剩一个问题:
转发表(基于目标的转发)和 流表(通用转发)是如何计算出来的?
答案:通过控制平面(下一章)