# Chap4 网络层——数据平面
# 4.1 网络层概览
数据平面中,路由器的首要任务是将数据报从输入链路转发到输出链路;
控制平面中,路由器的首要任务是协调局部的路由器的转发行为,确保数据报最终到达
- 转发(forwarding):路由器局部行为,将一个包从输入链路转移到输出链路,耗时几纳秒,通常在硬件层实现
- 路由(routing):网络全局行为,决定端到端路径,耗时几毫秒,通常在软件层实现
# 4.2 路由器结构
- 路由器概览图
- 输入端口处理 / 终点导向的转发
- 转发表-将key-value转化为前缀查找树,降低存储空间,若同时存在多个匹配,采取最长前缀匹配准则
转发结构(switching fabric)的三种实现方式,左边的是blocking的,右边的可以并行
输出端口处理
输入队列的队头阻塞(Head-of-the-line blocking,HOL)
输出队列(满了会丢包,使用Random Early Detection算法进行主动的队列管理)
缓存设置
- 双刃剑:较大的缓存能吸收短期的流量波动,降低丢包率,但会增加端到端延迟(bufferbloat现象)
- 经验公式:
,其中, 代表缓存大小, 代表平均往返时间, 代表链路容量, 代表独立TCP流的数量(2004)
数据包调度(以何种方式发送输出队列中的数据包)
- FIFO
- Priority Queuing(深色的高优先级)
- Weighted Fair Queuing(深浅代表两类)
# 4.3 互联网协议:IPv4,地址,IPv6
# 4.3.1 IPv4 数据报格式
Version number:IP协议的版本,路由器根据其处理剩余的数据报内容
Header Length:因为Options的存在,需要说明头部长度以决定数据的起始位置,无options时,通常是20字节长
Type of service:区分不同类型的数据报
Datagram length:IP数据报(header+data)总字节数,此字段16比特,故IP数据报最大大小是65535字节,然而实际上,IP数据报一般小于1500字节,以适应以太网帧的大小
Identifier,flags,fragmentation offset:用于标示一个大的数据报被拆分成若干小数据报的组装工作,IPv6不支持了
Time to live:若TTL到达0,则路由器会丢弃这个数据报,确保数据报不会在网络中一直循环
Protocol:当数据报到达目的地时,接收方会根据这个字段决定将数据交给哪个传输层协议去解析,如6代表TCP,17代表UDP,更多可能值,查看IANA Protocol Numbers 2016
Header checksum:协助路由器检测IP数据报中的比特错误,若出错,则丢弃;注意每个路由器会因为TTL的变化,重新算一个checksum,一种快速算checksum的算法参考RFC 1071
Source and destination IP address
Options:IPv4中有,IPv6中没有
Data:传输层报文,或者其他类型数据,如ICMP信息
# 4.3.2 IPv4 地址
IPv4地址长度为4字节,32个比特,故理论上有
个IP地址(约40亿) 每个主机和路由器的每个link都具有IP地址
互联网地址分配策略(Classless Interdomain Routing,CIDR,RFC4632),贯彻了子网的概念,将32位地址划分成前后两部分 a.b.c.d/x,其中,x代表前面一部分的位数,这样,就能形成层次化的消息传递机制
IP地址中,255.255.255.255用于广播,数据包会发送给子网里的每一个用户,路由器选择性将此信息外发到相邻子网
IP地址的块分配(分给ISP们)和DNS根服务器是由Internet Corporation for Assigned Names and Numbers,ICANN组织管理的,遵守RFC 7020中的规定
IP地址的单机分配一般使用Dynamic Host Configuration Protocol,DHCP,[RFC2131]。DHCP会进行动态IP分配,并告知主机一些额外信息,如子网掩码,首个接入路由器的地址,本地DNS服务器IP。DHCP是一个零配置的协议,即插即用
- 对于新入网的主机,DHCP协议的执行主要分为以下四步
- 1、DHCP服务发现:入网主机发送广播,使用UDP发DHCP discover message数据包到67端口
- 2、DHCP服务应答:DHCP服务器收到该信息后,广播一个DHCP offer message数据包,里面包含与discover包中相同的transaction ID,以及Lifetime(IP地址的有效时间,一般设为几个小时或几天)
- 3、DHCP请求:入网主机会从单个或多个DHCP服务应答中选择一个,并朝那个DHCP服务器发送DHCP请求,包含该DHCP服务应答的配置信息
- 4、DHCP应答:DHCP服务器会发送一个DHCP应答信息给入网主机
- 入网主机收到DHCP应答后,可以使用DHCP分配的IP地址在有效期内进行通信,有效期结束后,DHCP提供更新有效期的机制
# 4.3.3 网络地址翻译(NAT)
- 支持NAT的路由器是一个子网对外的接口,使用相同的IP地址对外发出请求,NAT翻译表中,将广域网的IP地址+端口和局域网的IP地址+端口形成一一映射。这样,能使不同子网间可能存在相同的IP地址,从而节省IP地址资源,且不影响正常工作。
- 外网的机器如何连接一个躲在NAT服务器后面的主机(不知道其IP)呢?技术方案是使用NAT穿透工具,参见RFC5389
# 4.3.4 IPV6
IPV4地址面临用尽的危机,故发展IPv6,RFC2460;(有过IPv5,但被放弃了)
IPv6数据报格式
- Version:4比特,IP版本标识号,IPv6是6
- Traffic Class:8比特,设置流里的数据报优先级
- Flow label:20比特,流标签,如音视频可被视作一个流,而文件传输则不被视为一个流
- Payload length:16比特,unsigned int,表示Data的字节数
- Next header:交付给什么上层协议解析(如TCP、UDP)
- Hop limit:允许最大跳数,经过一个路由器就减1,到0就被丢包
- Source/Destination Address:地址表示位数从32bit上升到128bit,且增加了一种新类型地址,叫做anycast address,允许一个数据报传递给任意一组主机
IPv6的改动
- 不再支持大数据报的切割和组装
- 不设置校验和(TCP等上层协议已经有校验机制,且能避免每个路由器更新TTL带来的校验和计算耗时)
- 删除了options字段,固定40字节的包头,使得路由器的处理更快速
IPv4到IPv6的迁移
- 主流方法是使用隧道【RFC 4213】,如下图所示,将整个IPv6数据报当成IPv4数据报的payload进行传输,并将IPv4的协议编号设为41【RFC 4213】
# 4.4 广义的转发
- 每个路由器都维护一个Match-Plus-Action表,这个表通过远程控制器维护和分发,参考OpenFlow标准,ONF2020,下面以此为例子
- Match:
- Action:转发、丢弃、修改字段
- 在一个网络体系中,该分布式表的不同组合,能实现负载均衡,防火墙等功能