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-路由器组成和作用

路由器架构如图

router-architecture

  • 输入端口

    这个端口不是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)在转发表中查找, 一般选择使用SRAMTCAM存储器.

确定输出端口后, 就将数据包发给交换结构(牵扯到排队拥塞调度), 查找是输入端口中最重要的一个功能, 除此之外还有

  • 进行物理与链路层处理
  • 检查数据包的版本号, 校验, 生存时间
  • 更新网络管理的计数器

4.2.2-交换结构(switching fabric)细节

是路由器的核心, 有多种数据包交换(指从输入端口到输出端口)方式

  1. 通过内存转发.

    输入输出相当于操作系统的IO, CPU(路由处理器)从数据包首部取出目的地址, 在转发表中找到输出端口后, 就将数据包复制到输出端口的缓冲区.(即使有不同的输出端口, 但因为是共享系统总线, 一次只能进行一次读写, 区别线路卡)

    许多路由器都使用内存交换技术。然而,目的地址的查找和将分组存储(交换)进适当的存储位置是由输入线路卡上的处理器来执行的。

  2. 通过总线转发.

    输入端口通过共享总线将数据包直接转送到输出端口, 不需要路由处理器.

    虽然CPU没有涉及总线传送, 但因为总线共享, 还是只能一次传送一个数据包. 当数据包到达输入端口, 如果发现总线在忙, 他就会被阻塞(数据包进入内存需要通过总线).

  3. 通过互连网转发.

    使用互连网络, 可以克服共享总线带宽的限制, 当不同输入端口转发到不同输出端口时, 能够并行转发

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):

DHCP-CS-interaction

  1. DCHP discover: 为了找到DHCP服务器, 客服端会使用UDP数据包发送DCHP discover消息, DHCP服务端使用67端口, 客户端使用68接口, 由于没有IP, 客服端会以广播IP地址255.255.255.255和自身IP地址0.0.0.0建立IP数据报传递到链路层, 链路层会广播到子网内所有的节点.

  2. DCHP offer: 服务端接受到信息后进行响应, 图中使用广播地址, 书中理由是因为可能有多个DHCP服务器, 广播可以让客户端选择合适的地址.

    但我并不信服这个理由, 就算是单播也能让客户端进行选择啊.

    上网查了下, 可以在DHCP Discovery / Request报文里设置BROADCAST flag = 0来代表单播.

    抓包得到Bootp flags: 0x0000 (Unicast)表示单播

    响应的消息会带有唯一会话ID, 建议的IP地址, 网络掩码, IP使用时间

    为什么要分为单播和广播?

    单播: 点对点, 不影响其他主机

    广播: 点对所有点, 会影响到子网内其他主机

    如果协议栈在初始化中不支持单播, 则使用广播

    如果支持则使用单播

  3. DHCP request: 客服端将到达的offer进行选择, 回显该提议的参数.

  4. 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协议的版本, 让它有更多的地址可以分配.

ip-v6-format

字段解读

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的地址

查阅rfc4921

IPv6的表示形式:

  1. 8个16bit

    ABCD:EF01:2345:6789:ABCD:EF01:2345:6789

    2001:DB8:0:0:8:800:200C:417A

  2. 省略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-match-table

详细的Openflow协议参考

OpenFlow协议初探——OpenFLow中的流和流表

具体的action有: 跨多个输出接口(负载均衡)、重写报头(NAT), 阻塞/丢弃数据包(防火墙).

作者

manu

发布于

2020-06-01

更新于

2023-01-06

许可协议


:D 一言句子获取中...