Overview
首先Network Layer负责的是host to host的传输, 然后可以分为两个平面, 控制平面以及数据平面.
数据平面: 负责forward datagrams from input to output links
决定路由器从input到output
转发功能:
基于目标地址 + 转发表
SDN方式基于多个字段+流表
控制平面: 调控local, router的forwarding actions, 这个平面涉及很多路由选择的算法
传统的控制平面: pre-router控制平面, 每一个路由都有单独路由器算法元件, 在控制平面上进行交互
SDN: 远程控制器与本地代理(CA)交互
总的来说, Network layer负责转发和路由
转发就像trip中的中转站, 就是知道下一站怎么走就行了. 网络中是将分组从路由器的输入接口转发到合适的输出接口
路由就像trip中的路径规划, 在一个更加宏观的层面上规划trip. 使用路由算法决定分组从主机到目标接收主机的路径
网络服务模型
在网络这个服务之下提供的是best effort的模型 - 也就是没有保证数据的正确性
路由的组成
简单的路由体系就是
- 路由: 运行路由选择算法(RIP, OSPF, BGP) - 生成路由表
- 转发: 从输入到输出链路交换数据报 - 根据路由表进行分组的转发 (input - switch - output)
输入端口
在物理层通过bit的接收 → 在链路层解封装 → 在网络层根据头部信息找地址找到合适的输出, 包括了基于目标的转发和通用转发
基于目标的转发
通过最长前缀匹配, 然后决定了output端口, 然后就会交给switching
Switching
Switching核心功能就是转发
其中switching交换有三个典型的结构
- memory
- bus
- crossbar
内存交换
在CPU直接控制下的交换,分组被拷贝到系统内存,CPU从分组的头部提取出目标地址,查找转发表,找到对应的输出端口,拷贝到输出端口
问题是转发速率被内存的宽带限制, 数据报通过BUS两遍, 一次只能转发一个分组
通过总线交换
数据报通过共享总线, 从输入端口发到输出端口. 这个可以类比大转盘, 车辆可以都进入大转盘, 到达了合适的口之后就出来(当然这个车每次只能进来一辆!)
问题是有总线竞争, 就是交换素的会被总线带宽限制, 每次只能处理一个分组
通过crossbar的交换
这个 就是intercept netwrok, 只有output不一样, 就可以同时转发
输出端口
数据到了输出端口就会被存放到output的内存中, 然后会把它们转发到output link. 包括了scheduling, de-queing
为什么要有Queuing
输入端: 当Switching的速度小于所有input口的汇聚速率的时候, 就需要输入口的queue.
输出端: 当数据从Switching到达的速度比传输速度快时候 (比如所有inputs都走到同一个output)
需要多大的缓存呢
- 拇指规则(经验性规则):平均缓存大小=典型的RTT(例如:250ms)倍于链路
容量C - 最近的一些推荐: 有N(非常大)个流,缓存大小等于 RTT * C / sqrt(N)
在输出端口会有调度的算法
调度就是选择什么样的一个链路传输的分组
FIFO (first in first out) scheduling: 按照分组到来的次序发送
优先权调度: 优先级高的先发送
Round Robin: 循环扫描不同类型的队列, 发送完一类的分组再发送下一类
The Intenet Protocol (IP)
IPv4
IPv4有一个分片和重组的功能, 不过在IPv6中就没有了
IP编址
IP地址: 32位标识, 对主机或者路由器的接口编址, 也就是一个IP地址对应一个接口
子网
子网的IP地址的高位相同, 无需路由器接入, 子网内各主机你可以在物理上相互直接到达
IP地址分类
ClassA/B/C
特殊IP地址
本机本子网: 全部为0
广播地址: 全部为1
CIDR 无类域间路由
地址格式为 a.b.c.d/x, 其中 x 是 地址中子网号的长度
子网掩码
32bits, 其中1表示子网部分, 0表示主机部分
比如 A类的网络:255.0.0.0 :11111111 00000000 0000000 00000000
DHCP - Dynamic Host Configuration Protocol
动态获得host的地址, 允许主机在加入网络的时候,动态地从服务器那里获 得IP地址
DHCP工作概况
主机广播DHCP discover
DHCP服务器用DHCP offer提供相应
主机请求IP地址, 发送DHCP request
DHCP发送地址, DHCP ack报文
如何过得一个IP地址
从ISP获得地址块中分配一个小地址块, 然后再分给内部不同的设备. 这个分配是通过ICANN管理的
路由聚集 route aggregation
路由会汇聚成一个点, 所有离开本地网络的数据报居右一个相同的原地址NAT IP address, 但是具有不同的端口号
动机: 本地网络只有一个有效IP地址
- 不需要从ISP分配一块地址,可用一个IP地址用于所有的(局域网)设备–省钱
- 可以在局域网改变设备的地址情况下而无须通知外界
- 内部的设备没有明确的地址, 安全
NAT: Network Address Translation
因为对外只有一个地址, 对内有很多主机, 那么就需要一个对ip地址的转换
外出数据包:替换源地址和端口号为NAT IP地址 和新的端口号,目标IP和端口不变
进入数据包:替换目标IP地址和端口号,采用存 储在NAT表中的mapping表项
NOTE: 这里有两次地址装换
- 主机10.0.0.1 → 128.119.40, 80会转换成10.0.0.1, 3345
- 10.0.0.1, 3345 出去的时候会转换成 138.76.29.7, 5001
于是收到的返回地址是138.76.29.7, 5001, 在转成10.0.0.1, 3345交给host
port是16bit的, 也就是说可以最多有6万个设备同时链接
争议: 对NAT是有争议的, 因为违反了end-to-end 原则, 端口信息做了处理, 同时带来了NAT穿越的问题
IPv6
初始动机: 32-bit地址空间将会被很快用完, 另外动机头部格式改变加速处理和转发
和IPv4对比的变化
- checksum被移除, 降低每一段中的处理速度
- ICMPv6: 增加报文package too big让发送端发送跟小的报文, 就不需要IP protocol来做分片跟重组了
IPv4到IPv6的平移
隧道: 在IPv4路由器之间传输的IPv4数据包中携带IPv6的数据报
SDN
传统方式垂直集成 → 昂贵, 不便于创新的生态
SDN: 控制器跟分组转发分离
OpenFlow数据平面的抽象
根据Match的IP地址, 做Action
- src=1.2.., dest=3.4.5.* → drop
- src = ..., dest=3.4.. → forward(2)
- src=10.1.2.3, dest=... → send to controller
总结
这里主要讲了Network Layout的数据平面, 包括数据的input → switch → output, 然后因为数据会拥堵, 所以需要input和output都需要cache, cache的大小大概是RTT * C / sqrt(N), 对于swtich, 有基于内存的交换, 基于bus的交换, 还有基于crossbar的交换, 基于crossbar的交换速度最好. 然后, 还将到了IP协议, 包括ip的报文, 以及IPv4, 怎么分地址, 包括classic A/B/C 还有无类域间路由, 地址格式为 a.b.c.d/x. 有地地址之后, 对于一个系统内部的ip地址分配可以做动态分配, 也就是DHCP, 包括了到了怎么做Network Address Translation. 之后也讲到了IPv6以及SDN, 把数据平面和控制平面做分离