4.网络层-数据平面
网络层分两部分讲解,数据平面和控制平面(区分这两个概念很重要),该章主要讲解了数据报输入输出链路的选择、IP转发、通用转发、IPv4和IPv6.
理清楚术语有利于学习本章: 数据包和分组是同一概念, 都是packet翻译过来的. 数据报和数据包有点类似, 比如UDP数据报, IP数据报, TCP数据包, UDP数据包, IP数据包..
4.1-Overview
路由器的数据平面将数据报从输入链路转发到输出链路,网络控制平面主要控制着数据报进行端到端传输。
4.1.1-转发和路由-数据和控制平面
将数据发送至目标主机,有两个重要的网络层功能。
- 转发:数据包在单一路由器里从输入到选择合适的输出链路(几纳秒),对应数据平面
- 路由:网络层必须在所有路由器中确定数据包采用的路由或路径(几秒),相关算法称为路由算法,对应控制平面
路由器的关键是转发表,路由器会检查每个数据包首部字段,查询转发表以确定输出链路。
控制平面的传统方法
每个路由器都有一个可以和其他路由器通信的路由组件,路由器之间通过通信计算转发表的值
控制平面的SDN方法
(software-defined networking, SDN)将控制平面提升到了远程控制,通过远程控制器来分配转发表的值。
4.1.2-网络服务模型
网络服务模型定义了发送方与接收方之间数据包的传递特性.
网络层能提供的部分服务:
- 保证交付数据: 确保源数据包可以到达目的主机. 此外还可以指定时延范围进行传递
- 有序的数据包: 保证数据包按照发送顺序到达目的主机.
- *保证最小带宽: 在指定的链路速率下, 只要发送速率低于链路速率, 那么所有数据包都会到达目的主机.
- 安全性: 在源主机进行加密, 目的主机进行解密即可保证安全性.
但是Internet网络层提供的是尽力而为服务, 不保证到达-延迟-带宽, 虽然有其他模型满足上述服务, 但事实证明了尽力而为服务和现下非常契合.
注意: 有两种类型交换机, 针对网络层的叫数据包交换机, 转发策略根据数据包头的信息决定, 通俗来说把数据包交换机叫路由器; 针对链路层的交换机是链路层设备.
4.2-路由器组成和作用
路由器架构如图
输入端口
这个端口不是TCP套接字的端口, 而是代表物理端口(或者说接口更合适), 图中三个方框分别代表物理层, 链路层, 网络层.
功能: 1. 物理链路与物理层的交互. 2. 链路层的交互. 3. 网络层, 查询转发表将数据包通过交换结构转发到输出接口.
交换结构
将输入端口连接到输出端口, 它完全包含在路由器中, 是一个网络路由器中的网络.
*输出端口
存储从交换结构得到的数据包, 通过执行链路层和物理层的功能后在传输链路上进行传输(也可以取消). 如果链路是双向传输, 则输入和输出端口在印刷电路上有特殊的结构
路由处理器
执行的是控制平面的功能.
在传统的路由器中, 执行路由器协议, 维护路由表和链路状态信息, 并计算转发表.
在SDN的路由器中, 它负责和远程控制器通信, 为路由器计算转发表
各个部分都使用了物理硬件来实现, 因为数据到达通常是ns级的, 对于软件来说太快了
4.2.1-输入端口细节
输入端口通过转发表
来找输出端口, 而转发表则由路由处理器
计算或者从SDN
接受. 转发表通过一条总线复制到每个端口, 避免了集中处理.
在32位的IP地址中, 转发表如果为每一个可能的地址都分配了一个条目, 而地址可能有40多亿, 这不大现实. 一般来说, 会在某段地址范围之间选择一个链接接口. 也会采用前缀的形式进行选择, 如下
IP前缀 | 转发链路接口 |
---|---|
11001000 0010 | 0 |
11001000 00100011 | 1 |
11001000 011 | 2 |
其他 | 3 |
如果匹配多项, 则会挑前缀最长的那项, 越长越精确
cisco catalyst 6500, 7600系列有一百万个TCAM转发表条目
为了更快的(ns)在转发表中查找, 一般选择使用SRAM
和TCAM
存储器.
确定输出端口后, 就将数据包发给交换结构(牵扯到排队拥塞调度), 查找是输入端口中最重要的一个功能, 除此之外还有
- 进行物理与链路层处理
- 检查数据包的版本号, 校验, 生存时间
- 更新网络管理的计数器
4.2.2-交换结构(switching fabric)细节
是路由器的核心, 有多种数据包交换(指从输入端口到输出端口)方式
通过内存转发.
输入输出相当于操作系统的IO, CPU(路由处理器)从数据包首部取出目的地址, 在转发表中找到输出端口后, 就将数据包复制到输出端口的缓冲区.(即使有不同的输出端口, 但因为是共享系统总线, 一次只能进行一次读写, 区别线路卡)
许多路由器都使用内存交换技术。然而,目的地址的查找和将分组存储(交换)进适当的存储位置是由输入线路卡上的处理器来执行的。
通过总线转发.
输入端口通过共享总线将数据包直接转送到输出端口, 不需要路由处理器.
虽然CPU没有涉及总线传送, 但因为总线共享, 还是只能一次传送一个数据包. 当数据包到达输入端口, 如果发现总线在忙, 他就会被阻塞(数据包进入内存需要通过总线).
通过互连网转发.
使用互连网络, 可以克服共享总线带宽的限制, 当不同输入端口转发到不同输出端口时, 能够并行转发
4.2.3-排队
将输入链路速率和输出速率相等设为R, 交换结构处理速率设为L
R<<L
不存在输入排队, 存在输出排队
R>L
存在输入排队, 并且存在HOL(Head of the line)阻塞, 即排队第一个数据包被阻塞, 后面的数据包也会被影响
4.2.4-数据包调度
如何处理排队, 这就是调度
1.FIFO(FCFS)
先进先出(先到先服务)指的是按照到达顺序将队列数据包进行链路传输, 先到的先被处理
2.优先级
到达的数据包会进行分类, 高优先级队列的会比低优先级队列的先被传输, 优先级相同的数据包采用FIFO处理
3.轮循(RR)和加权公平排队(WFQ)
轮循就是循环不同的队列来发送数据包.
WFQ与RR有点像, 但它为每一个队列进行加权, 避免优先级低的得不到服务, 还有就是采用轮循, 当队列为空时, 立刻切换到下一个队列
4.3-IPv4, IPv6
IPv4数据报格式
对于网络, IP可以说是最为重要的一部分了(寻址, 转发), 下图就是IPv4报头的组成部分
version
: 占4bit, IP协议的版本号, 路由器根据不同的版本来解析IP数据报头Headerlength
: 4bits, 代表IP头的长度, 用来确定有效载荷, 典型的IP头是20字节(不包含该选项)Type of service
: 8bits, 服务类型用来区分不同类型的数据报(设置优先级), 如IP电话和FTP的数据报Datagram length
: 16bits, 代表IP数据报的总长度(IP头+数据), 单位字节(因为以太网帧的原因通常不超过1500字节)Identifier(16bit),Flags(3bit),Fragmentation(13bit) offset
: 标识符, 标志, 碎片偏移与IP分片有关.(IPv6没有分片)Time to live(8bit)
: TTL表示生存时间, 每经路由处理, 这个字段都要-1, 到达0时则丢弃该数据, 防止在网络中一直流通Upper-layer protocol(8bit)
: 指定传递的上层协议, 如6表示TCP, 17表示UDP, 参见IANA. 类似传输层的端口, 将传输层与应用层粘合, 协议号将网络层与传输层粘合Header checksum(16bit)
: 标头校验和, 它只校验IP首部, 错误就丢弃, 这里要区分TCP/UCP的校验和, 它们是在整个段计算校验的.源IP和目标IP
: 源主机从DNS获取目标IP, 插入目标IP字段options
: 选项是对IP头的扩展, 出去性能考虑一般不怎么使用, IPv6没有该字段Data(有效负载)
: 如TCP段内容
没有选项字段的IP头有20字节
IP数据包分段
链路层协议支持发送规定范围内的数据包, 如以太网帧可以容纳1500byte, 链路层MTU(maximum transmission unit, 最大传输单位)限制了链路层帧的最大容量, IP数据包会被封装在链路层帧中, 所以MTU会对IP数据包的长度限制.
但是不同的路由器可能有不同的链路层协议, 有着不同的MTU. 当一个路由器的下一个路由器的MTU<该路由的IP数据包长度, 这怎么办? 方法是将IP数据包再次拆分, 然后单独封装. 小的数据包称之为fragment(片段)
.
片段需要组装才能到达目的地的传输层, 为了保证路由器的性能, 将重组的工作交给了终端系统.
源主机会在数据包中标记源-目的地址和标示号, 每个数据包(分片)都有, 目的通过检查标识号来知道该数据包是否是某个大数据包的片段. 由于IP不可靠, 会丢失片段, 需要使用偏移量来确定该片段的顺序, 使用标志位来确定最后一个数据包(0标识)
IP寻址
IPv4长度32位, 约有43亿个IPv4地址, 通常表示为十进制, 每字节使用.
隔开, 如192.168.1.1
主机和路由如何链接互联网? 主机网络接口连接一条网络链路, 通过该链路发送信息. 路由器也有接口, 但它需要在一个链接上接受, 在另一个链接上传输, 需要两个及以上的连接, 所以路由有多个接口. 每个接口都需要发送/接受数据, IP协议要求每个接口都需要有自己的IP. 所以IP与接口关联, 不与机器关联.
全局Internet中每个主机和路由器上的每个接口必须具有全局唯一的IP地址(后面会说NAT), 接口IP地址由他的子网决定
说一下192.168.1.0/24表示法: 也叫子网掩码, 代表前24位定义了子网地址
子网: 将每个接口与主机和路由断开, 连续的线路就是一个子网
子网里面的所有设备都具有相同的子网地址
无类别域间路由Classless Interdomain Routing (CIDR)规定了子网寻址的概念, 它将IP地址分为两部分, a.b.c.d/x
, a-d是十进制的IP地址, x是最高有效位, 构成IP地址的网络部分, 称为网络前缀. 通常为某个组织分配一个前缀, 然后该组织的所有设备都共享这个前缀.
32-x
位可以区分组织内的设备, 32-x
也可以有组织内的子网
前缀能减少路由器转发表的大小, a.b.c.d/x的形式足以将数据包转发到任何目的地
使用单个前缀告知自己有多个网络的能力叫
路由聚合
在使用CIDR之前, IP的网络部分被设置为8bit, 16bit, 24bit长度, 分别叫做A, B, C类网络, C类只能有$2^8-2=254$个IP地址(2个IP有其他作用), 而B类能有$2^{16}-2=65534$的IP地址. 假设某组织需要分配300个IP地址, 只能为其分配B类的子网地址, 空余65000个IP地址, 浪费了太多空间, 而且B类网络地址也会很快耗尽.
当主机的发送目标为IP广播地址255.255.255.255时, 该数据包会发送给子网内的所有主机, 路由器一般不会转发
ICANN非盈利性组织负责分配IP和管理DNS根服务器等工作
DHCP
当组织获取到IP地址块后, 可以手动将IP分配给路由器和主机, 也可以通过DHCP
(Dynamic Host Configuration Protocol
,动态主机配置协议)自动配置(可以固定IP或者临时IP), 主机通过DHCP
还可以获得子网掩码, 默认网关(第一跳路由器地址), 本地DNS服务器地址等.
DHCP
是基于CS
的协议, 每个子网都至少有一个DHCP服务器
, 或者知道DHCP服务器地址的DHCP的代理(路由器)
连上网络的主机想在DHCP协议下获取IP分为四步, 如图所示(yiaddr代表you internet address):
DCHP discover
: 为了找到DHCP服务器, 客服端会使用UDP数据包发送DCHP discover
消息, DHCP服务端使用67端口, 客户端使用68接口, 由于没有IP, 客服端会以广播IP地址255.255.255.255和自身IP地址0.0.0.0建立IP数据报传递到链路层, 链路层会广播到子网内所有的节点.DCHP offer
: 服务端接受到信息后进行响应, 图中使用广播地址, 书中理由是因为可能有多个DHCP服务器, 广播可以让客户端选择合适的地址.但我并不信服这个理由, 就算是单播也能让客户端进行选择啊.
上网查了下, 可以在DHCP Discovery / Request报文里设置
BROADCAST flag = 0
来代表单播.抓包得到Bootp flags: 0x0000 (Unicast)表示单播
响应的消息会带有唯一会话ID, 建议的IP地址, 网络掩码, IP使用时间
为什么要分为单播和广播?
单播: 点对点, 不影响其他主机
广播: 点对所有点, 会影响到子网内其他主机
如果协议栈在初始化中不支持单播, 则使用广播
如果支持则使用单播
DHCP request
: 客服端将到达的offer进行选择, 回显该提议的参数.DHCP ACK
: 服务端确认该消息, 交互完成
书说DHCP的缺点是每连接到一个新的子网都会得到一个新的IP地址, 当在子网之间移动无法维持远程应用的TCP连接, 不是很理解, 子网之间代表不同的子网, 子网不同IP还能相同?
网上找的缺点还有点像样, 如DHCP服务器无法知道其他DHCP服务器租出去的地址, 不能发现非DHCP使用的IP地址
网络地址转换NAT
IPv4总共就40亿多地址, 现在每个人都不只一个智能设备, 加上智能家居, 导致了IP的极度稀缺, 于是有了NATNetwork Address Translation
这个暂时策略
专有名词
公网IP: 通过ISP等途径获得的全球统一可寻址的地址
私有IP: 内部地址, IANA保留了三类私有地址RFC 1918
10.0.0.0 - 10.255.255.255 (10/8)
172.16.0.0 - 172.31.255.255 (172.16/12)
192.168.0.0 - 192.168.255.255 (192.168/16)
详细分类
block >folded
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 Address Block Name RFC
0.0.0.0/8 "This host on this network" [RFC1122], section 3.2.1.3
10.0.0.0/8 Private-Use [RFC1918]
100.64.0.0/10 Shared Address Space [RFC6598]
127.0.0.0/8 Loopback [RFC1122], section 3.2.1.3
169.254.0.0/16 Link Local [RFC3927]
172.16.0.0/12 Private-Use [RFC1918]
192.0.0.0/24[2] IETF Protocol Assignments [RFC6890], section 2.1
192.0.0.0/29 IPv4 Service Continuity Prefix [RFC7335]
192.0.0.8/32 IPv4 dummy address [RFC7600]
192.0.0.9/32 Port Control Protocol Anycast [RFC-ietf-pcp-anycast-08]
192.0.0.170/32, 192.0.0.171/32 NAT64/DNS64 Discovery [RFC7050], section 2.2
192.0.2.0/24 Documentation (TEST-NET-1) [RFC5737]
192.31.196.0/24 AS112-v4 [RFC7535]
192.52.193.0/24 AMT [RFC7450]
192.88.99.0/24 Deprecated (6to4 Relay Anycast) [RFC7526]
192.168.0.0/16 Private-Use [RFC1918]
192.175.48.0/24 Direct Delegation AS112 Service [RFC7534]
198.18.0.0/15 Benchmarking [RFC2544]
198.51.100.0/24 Documentation (TEST-NET-2) [RFC5737]
203.0.113.0/24 Documentation (TEST-NET-3) [RFC5737]
240.0.0.0/4 Reserved [RFC1112], section 4
255.255.255.255/32 Limited Broadcast [RFC919], section 7外网IP: 相对私有IP来说, 外网IP可能是私有IP, 公网IP
LAN: 局域网接口, 接上后分配私有IP
WAN: 这个接口可以与运营商联系, 这并不代表是公网IP
NAT技术原理
NAT路由器通过WAN口连接一个可以与外界联系的IP地址(外网IP), 通过许多LAN口连接局域网的设备, 并分配内网地址.
当内网需要请求外网的的数据时, 把请求数据发给NAT路由器, NAT路由器会替换该数据的内网IP成外网IP, 使用现存端口替换原有端口, 将替换过程记录到NAT转发表, 数据到达NAT路由器时根据转发表发送给内网设备
NAT路由器会运行DHCP服务器给内网设备提供IP地址
优点: 稍微解决了IP不够用的问题
缺点: 端口是寻找进程的, 在服务器上, NAT会导致服务端口失效, 如P2P, 现在的解决方法是NAT穿越
关于网络安全
攻击者通过向IP发送恶意数据包来对主机进行攻击, 还可以进行ping扫描和端口扫描.
防火墙可以 端口扫描和根据IP来拦截数据包. IDS(intrusion detection systems)会对数据包进行全身扫描, 还会对攻击的数据包签名, 可以保护主机免受已知攻击
IPv6数据报格式
随着时间的推移, IPv4逐渐用尽, 根本的解决方法是升级IP协议的版本, 让它有更多的地址可以分配.
字段解读
version(4bit)
:版本, IPv4是4, IPv6是6
Traffic class(8bit)
: 同IPv4的TOS, 可以为数据报设置优先级
Flow lable(20bit)
: 流标签, 标识数据流
Payload length(16bit)
: 有效负载的长度, 代表数据头后面的数据报字节数
Next header(8bit)
: 标识传递的上层协议
Hop limit(8bit)
: 代表可以经过(跳)路由的次数, 每经过一个路由则-1, 到0则被丢弃
src&Dst address
: 128bit的地址
IPv6的表示形式:
8个16bit
ABCD:EF01:2345:6789:ABCD:EF01:2345:6789
2001:DB8:0:0:8:800:200C:417A
省略0
2001:DB8:0:0:8:800:200C:417A
2001:DB8::8:800:200C:417A
Data
: 传递到目的主机网络层的上层
相对比IPv4, IPv6少了碎片重组
, 头部校验和
, 选项
.
- 如果数据报在路由器中过大, 则路由器会丢弃这个数据报, 并反馈给发送方, 发送方会调小数据报然后重新发送
- 因为链路层+传输层都有校验, 而且每次TTL都会变化, IPv4的校验和都会重新计算, 比较耗资源, 所以IPv6觉得冗余删除了校验
- 选项在报头不存在了, 但
Next header
可以指向它, 删除它主要是为了IPv6精简的40字节报头.
将IPv4升级为IPv6
虽然IPv6向下兼容IPv4, 但现有的IPv4的系统并不支持IPv6, 不可能停用全球所有的支持IPv4的系统来升级IPv6
隧道技术
在两台IPv6的设备之间如果有IPv4的设备, 则会将IPv6整段报文放进IPv4的有效负载段(标识41代表IPv6), 到达目的地提取该IPv6数据段, 中间的IPv4设备就叫隧道
4.4-通用转发和SDN
数据包是基于IP发送的, 然IP是可以在路途中被修改的, 这些设备叫
中间盒
以前介绍的转发是基于目标的转发, 根据查找目的IP(匹配
), 然后将数据包转发给合适的端口(操作
).
通用转发
代表更宽广的匹配
+操作
, 匹配会在不同的层中进行, 操作可以将数据包转发到一个或者多个端口; 执行的设备被称为分组交换机
, 区别于链路层的交换机和网络层的路由器.
OpenFlow
(这是一个标准)将匹配和启动转发的条目称为flow table(流表)
, 特点是
- 一组和输入数据包可以
匹配的标头字段
, 采用硬件匹配(TCAM), 匹配则转发, 否则丢弃或交给远程控制 - 随数据包和流表条目更新的
计数器
, 可以记录匹配数据包的数量和流表更新时间 匹配的动作
, 有转发到指定端口, 丢弃, 复制到其他端口, 重写标头字段
Match(匹配字段)
详细的Openflow协议参考
具体的action有: 跨多个输出接口(负载均衡)、重写报头(NAT), 阻塞/丢弃数据包(防火墙).