【计算机网络:自顶向下方法 第7版 | 中科大 】
第4章 网络层 : 数据平面
4.1 导论
网络层服务
网络层功能:
- 转发: 将分组从路由器 的输入接口转发到合适 的输出接口 (局部)
- 路由: 使用路由算法来 决定分组从发送主机到 目标接收主机的路径 (全局 )
- 路由选择算法
- 路由选择协议
数据平面
- 本地,每个路由器功能
- 决定从路由器输入端口 到达的分组如何转发到
输出端口
- 转发功能:
- 传统方式:基于目标 地址+转发表
- SDN方式:基于多个 字段 + 流
控制平面
- 网络范围内的逻辑
- 决定数据报如何在路由器之间 路由,决定数据报从源到目标 主机之间的端到端路径
- 2个控制平面方法:
- 传统的路由算法: 在路由器 中被实现
- software-defined networking (SDN): 在远程的服务器中 实现
传统方式:路由和转发的相互作用 Vs SDN方式:逻辑集中的控制平面
- 传统方式
- SDN 方式
网络服务模型
- 在某些网络架构中是第三个重要的功能 ATM, frame relay, X.25
- 在分组传输之前,在两个主机之间,在通过一些 路由器所构成的路径上建立一个网络层连接 涉及到路由器
- 网络层和传输层连接服务区别:
- 网络层: 在2个主机之间,涉及到路径上的一些路由器
- 传输层: 在2个进程之间,很可能只体现在端系统上 (TCP连接)
Q: 从发送方主机到接收方主机传输数据报的“通道” ,网络提供什么样的服务模型?
- 对于单个数据报的服务: 可靠传送 延迟保证,如:少于 40ms的延迟
- 对于数据报流的服务: 保序数据报传送 保证流的最小带宽 分组之间的延迟差
4.2 路由器组成
概况
- 路由:运行路由选择算法/协议 (RIP, OSPF, BGP)-生成 路由表
- 转发:从输入到输出链路交换数据报-根据路由表进行分组 的转发
输入端口功能
- 基于目标的转发: 如果地址范围如果没有划分的特别规整,会发生什么?
- **最长前缀匹配
longest prefix matching Destination Address Range**
: 当给定目标地址查找转发表时,采用最长地址前 缀匹配的目标地址表项 . (IP地址部分详解 )
输入端口缓存
交换结构
- 将分组从输入缓冲区传输到合适的输出端口
- 交换速率:分组可以按照该速率从输入传输到输 出
- 运行速度经常是输入/输出链路速率的若干倍
- N 个输入端口:交换机构的交换速度是输入线路速度的N倍比较理想,才不会成为瓶颈
3种典型的交换机构
第一代路由器
- 在CPU直接控制下的交换,采用传统的计算机
- 分组被拷贝到系统内存,CPU从分组的头部提取出目标 地址,查找转发表,找到对应的输出端口,拷贝到输出 端口
- 转发速率被内存的带宽限制 (数据报通过BUS两遍)
- 一次只能转发一个分组
通过总线交换
- 数据报通过共享总线,从输入端 口转发到输出端口
总线竞争
: 交换速度受限于总线 带宽1
次处理一个分组1 Gbps bus
, Cisco 1900; 32 Gbps bus, Cisco 5600;对于接 入或企业级路由器,速度足够( 但不适合区域或骨干网络)
通过互联网络(crossbar等)的交换
同时并发转发多个分组,克服总线带宽限制
Banyan(榕树)网络,crossbar(纵横) 和其它的互联网络被开发,将多个处理 器连接成多处理器
当分组从端口A到达,转给端口Y;控 制器短接相应的两个总线
高级设计:将数据报分片为固定长度的 信元,通过交换网络交换
输出端口
假设交换速率Rswitch是Rline的N倍(N:输入端口的数量)
当多个输入端口同时向输出端口发送时,缓冲该分组(当通 过交换网络到达的速率超过输出速率则缓存)
排队带来延迟,由于输出端口缓存溢出则丢弃数据报!
调度机制
- 调度: 选择下一个要通过链路传输的分组
FIFO (first in first out) scheduling: 按照 分组到来的次序发送
- 丢弃策略: (队列满的时候 )
- tail drop: 丢弃刚到达的分组
- priority: 根据优先权丢失/移除分组
- random: 随机地丢弃/移除
调度策略:优先权
- 优先权调度:发送最高优先 权的分组。
- 多类,不同类别有不同的 优先权。
- 类别可能依赖于标记或者其他的头部字段, e.g. IP source/dest, port numbers, ds,etc.
- 先传高优先级的队列中的分 组,除非没有
- 高(低)优先权中的分组传 输次序:FIFO
调度策略:其他的
Round Robin (RR) scheduling:
- 多类
- 循环扫描不同类型的队列, 发送完一类的一个分组 ,再发送下一个类的一个分组,循环所有类
- Weighted Fair Queuing (WFQ) : 每个类在每一个循环中获得不同权重的服务量
4.3 IP :Internet Protocol
IP:Internet Protocol
IPv4数据报结构
-
版本(Version, 4bit)
对于IPv4,字段的值是4。 -
首部长度(Header Length, IHL, 4bit)
首部长度说明首部有多少32位字(4字节)。一般为5,相当于5*4=20字节。 -
服务类别(Type Of Service,8bit)
-
报文长度(Length, 16bit)
IP首部+数据部分的总长度 -
标识(Identification, 16bit)
用于在IP层对数据报进行分片的时候,标识数据包。 -
标志 (Flags, 3bit )
这个3位字段用于控制和识别分片,它们是:
- 位0:保留,必须为0;
- 位1:禁止分片(Don’t Fragment,DF),当DF=0时才允许分片;
- 位2:更多分片(More Fragment,MF),MF=1代表后面还有分片,MF=0 代表已经是最后一个分片。
如果DF标志被设置为1,但路由要求必须分片报文,此报文会被丢弃。这个标志可被用于发往没有能力组装分片的主机。
当一个报文被分片,除了最后一片外的所有分片都设置MF为1。最后一个片段具有非零片段偏移字段,将其与未分片数据包区分开,未分片的偏移字段为0。
-
分片偏移 (Fragment Offset, 13bit)
这个13位字段指明了每个分片相对于原始报文开头的偏移量,以8字节作单位。 -
存活时间(Time To Live,TTL, 8bit)
本数据报的TTL. -
协议 (Protocol, 8bit)
1—-icmp, 2—-igmp, 6—-tcp, 17—-udp, 89—-ospf -
首部检验和 (Header Checksum, 16bit)
IP首部的校验和 -
源IP地址(Source IP, 32bit)
-
目的IP地址(Destination IP, 32bit)
IPv4数据报分片
- 网络链路有MTU(最大传送单元)— 最大可传输的链路的帧
- 不同的链路类型有不同的MTU
- 如果IP数据报 > MTU ,则分片,到目的地后再重组
- IP头部字段用来标记
IP数据报分片示例
-
本来要发送 4000 byte 的数据报(head部分 + data部分)
-
链路的 MTU = 1500 bytes
-
需要将数据分为3片来发送
-
length
:片长度,包括了 20 bytes IP首部部分,最大为MTU- length为1500的数据报,实际包含 1500−20=1480 bytes1500−20=1480 ����� 的data部分
- 最后一片的length为 (4000−20)−1480×2+20=1040(4000−20)−1480×2+20=1040
-
fragflag
:3 bits
- 第二个bit为 DF(Don’t Flag):为0则该数据报分片,为1则不分片
- 第三个bit为 MF:为0则后面没有片了,为1则后面还有片
- 前两片为 1(001),表示该IP数据报分片,且后面还有片
- 最后一片为 0(000),表示该IP数据报分片,后面没片(即最后一片)
-
offset
:data部分偏移量,以 8 bytes 为单位,只计算data部分
- 第一片的offset为 0
- 第二片的offset为 1480 bytes/8 bytes=1851480 �����/8 �����=185
IPv4编址
概述
-
IP地址:32位、主机和路由器接口的ID
-
接口
(interface):主机/路由器 和 物理链接 之间的连接
- 路由器一般有多个接口
- 主机一般有1到2个接口
-
每个接口都有一个对应的IP地址
接口连接方式
- 通过路由器连接
- 有线以太网通过以太网交换机连接
- 无线网络通过WiFi基站连接
子网(Subnet)
IP地址
- 网络部分 —— 高位
- 主机部分 —— 低位
子网
- 子网部分相同
- 可以不通过路由器到达彼此
把路由器去掉,剩下的每个区域都是一个子网。
上图中有6个子网。
分类编制(Classful Addressing)
- A类
- 网络部分前1位 ——
0
- 网络部分 8 bits,主机部分 24 bits
- IP地址范围:
1.0.0.0
~127.255.255.255
- 网络部分前1位 ——
- B类
- 网络部分前2位 ——
10
- 网络部分 16 bits,主机部分 16 bits
- IP地址范围:
128.0.0.0
~191.255.255.255
- 网络部分前2位 ——
- C类
- 网络部分前3位 ——
110
- 网络部分 24 bits,主机部分 8 bits
- IP地址范围:
192.0.0.0
~223.255.255.255
- 网络部分前3位 ——
- D类
- 前4位 ——
1110
- 用于多播地址
- 前4位 ——
- E类
- 前4位 ——
1111
- 被留作将来使用
- 前4位 ——
子网掩码(subnet mask)
- IP地址采用点分十进制:例如
192.32.216.9
- 分类编制导致了地址资源的浪费
- 子网和子网掩码:可以减小地址资源的浪费
200.23.16.64/27
中的27
为 网络部分+子网部分 的位数
- 子网掩码
- 网络部分+子网部分 置1
- 主机部分 置0
- 子网的网络ID
- 网络部分+子网部分 不变
- 主机部分 置0
CIDR:无类的域间路由(Classless InterDomain Routing)
- IP分为两个部分 —— 子网部分 + 主机部分
- 子网部分可以是任意长度
- 地址格式:
a.b.c.d / x
,其中x是子网部分位数 - 网络部分称为前缀(prefix)
如何获取IP地址
主机如何获取IP地址
主机获取IP地址:
- 硬编码:自己设置静态的IP设置
- DHCP:动态主机配置(Dynamic Host Configuration Protocol)
当主机连接网络时,允许主机从网络服务器动态获取IP地址。
DHCP
- 即插即用
- 可以更新IP
- 地址重用:主机的IP只有在上线时才固定,下线即释放
- 支持移动用户
当一台主机加入网络时,从子网中的DHCP服务器获取IP地址。
网络如何获取IP地址
从ISP处获取分配的IP地址。
ISP如何获取IP地址
ISP从ICANN组织获取IP地址
ICANN:Internet Corporation for Assigned Names and Numbers
- 分配地址
- 管理DNS
- 分配域名、解决争议
NAT:网络地址转换(Network Address Translation)
- 从这个本地网络出去的报文都有着:相同的源IP+不同的端口号
- 对于外界网络来说,这个本地网络都是一个IP
- 本地网络有内部地址,改变该内部地址不需要通知外部网络
- 改变ISP不需要改变本地网络的内部地址
- 内部地址在外部不可见(保障安全性)
- 实现方式
- 发送出去的报文:(源IP(内部的IP),端口号)—> (NAT IP(NAT统一的IP),新端口号)
- 外部发来的报文的目的地址填写:(NAT IP(NAT统一的IP),新端口号)
- NAT转换表:记住(源IP(内部的IP),端口号)<—> (NAT IP(NAT统一的IP),新端口号)的转换对
- 收到的报文:根据NAT转换表,(NAT IP(NAT统一的IP),新端口号)—> (源IP(内部的IP),端口号)
- 发送出去的报文:(源IP(内部的IP),端口号)—> (NAT IP(NAT统一的IP),新端口号)
- 外部不知道内部的情况,所以外部不能发起通信
- 预留给内部的IP地址:
10.0.0.0
~10.255.255.255
(A类)176.16.0.0
~172.31.255.255
(B类)192.168.0.0
~192.168.255.255
(C类)
- 可以有16bit的主机地址位(
10.0.0.0
~10.255.255.255
),一个NAT支持内部60000+的连接 - NAT存在争议
- 路由器本来是在第3层,但NAT修改了端口号,而端口号包含在TCP/UDP的段结构里,即改了第4层的内容
- 违反了端到端
- 所以用IPv6来解决地址短缺
ICMP:因特网控制消息协议(Internet Control Message Protocol)
ICMP
- 主机、路由器、网关来交流网络层信息
- 报错:到达不了主机、网络、端口、协议等等
- 用于探测:echo request/reply(使用ping)
- IP的一部分,但体系结构在IP之上:ICMP消息搭载在IP数据报上
- ICMP消息:type,code,引发错误的IP数据报首部和前8个字节
Type | Code | description | 描述 |
---|---|---|---|
0 | 0 | echo reply (ping) | echo响应 (被程序ping使用) |
3 | 0 | dest. network unreachable | 目标网络不可达 |
3 | 1 | dest host unreachable | 目标主机不可达 |
3 | 2 | dest protocol unreachable | 目标协议不可达 |
3 | 3 | dest port unreachable | 目标端口不可达 |
3 | 6 | dest network unknown | 未知的目标网络 |
3 | 7 | dest host unknown | 未知的目标主机 |
4 | 0 | source quench (congestion control - not used) | 源端关闭(拥塞控制) |
8 | 0 | echo request (ping) | Echo请求 |
9 | 0 | route advertisement | 路由通告 |
10 | 0 | router discovery | 路由器的发现/选择/请求 |
11 | 0 | TTL expired | TTL 超时 |
12 | 0 | bad IP header | IP 报首部参数错误 |
- ICMP是管控制的IP的“兄弟”
- ICMP被IP使用,同时作为网络层协议使用IP
- ping、traceroute、path MTU discovery 都使用到了ICMP
- ping:使用 ICMP Echo request/repley msgs
- path MTU discovery
- 发送一个大的IP数据报,该数据报的 don’t fragment 置 1(即不分片)
- 减小数据报大小,直至成功(成功标志:没有接收到返回的ICMP消息)
Traceroute
Traceroute程序:跟踪从一台主机到其他主机之间的路由,用ICMP报文实现。
- 源发送一系列 UDP报文段 到目的
- 第一个数据报 TTL=1,第二个数据报 TTL=2,以此类推
- 使用不常见的端口号
- 当第n个数据报到达第n台主机时
- 这个第n个数据报TTL刚好过期
- 路由器丢弃该数据报
- 路由器发送一个ICMP告警报文(type 11,code 0)给源
- 该ICMP告警报文包括第n台路由器名字及其IP
- 当该ICMP报文返回到源主机,源主机计算RTT(往返时延),得到第n台路由器名字及其IP
- 标准的Traceroute程序用相同的TTL发送3个一组的分组,输出对每个TTL提供3个结果
- 停止条件步骤
- UDP数据报到达目的主机
- 目的主机返回 ICMP端口不可到达报文(type 3,code 3)
- 源主机接收到该ICMP报文,则停止
在Mac上可在app“系统信息”中的窗口
->网络实用工具
中使用Ping、Traceroute等工具。
IPv6
- 动机
- 初动机:解决32位IP地址空间分配完的问题
- 更快处理/转发的头部格式
- 头部支持QoS
- IPv6数据报格式
- 固定长度的头部:40 byte (IPv4头部长度不固定)
- 不允许分片
IPv6数据报结构
-
版本(Version, 4 bit)
对于IPv6,字段的值是6(0110)。 -
流量类型(Traffic class,8 bit)
用来标识对应IPv6的通信流类别,类似于IPv4中的ToS。 -
流标签(Flow label,20 bit)
用来标记报文的数据流类型,以便在网络层区分不同的报文。 -
有效载荷长度(Payload length,16 bit)
给出了IPv6数据报中跟在定长的40 byte数据报头部后面的字节数量。 -
下一个头部(Next Header,8 bit)
该字段标识数据报中的内容(数据字段)需要交付给哪个协议(如TCP或UDP)。无扩展的头部,Next Header指向TCP/UDP;有扩展的头部,Next Header指向的下一个头部比如路由选择。与IPv4头部 协议(Protocol)字段相同。
-
跳段数限制(Hop limit,8 bit)
生存时间,相当于IPv4中的TTL。转发数据报的每台路由器讲对该字段内容 -1,如果跳转限制计数到0时,则丢弃该数据报
-
源IP地址(Source Address,128 bit)
-
目的IP地址(Destination Address,128 bit)
-
数据(Data)
IPv6相较于IPv4的部分改变
-
去除Checksum:加快了转发速度
-
Options:依旧允许可选项,但是不放在头部,而是放在 Next Header 指出的位置上
-
ICMPv6
:ICMP的IPv6版本
- 增加新的 type:比如“Packet Too Big”
- 包含多播组管理
IPv6地址
-
三种类型:单播(unicast)、多播(multicast)、任意播(anycast)
-
冒号划分的十六进制(128 bit)
eg.
68E6:8C64:FFFF:FFFF:0:1180:960A:FFFF
-
0的压缩
用双冒号
::
表示一组0或多组连续的0,但只能出现一次。FF05:0:0:0:0:0:0:B3
=FF05::B3
0:0:0:0:0:0:128.10.2.1
=::128.10.2.1
(IPv4和IPv6兼容的IP)12AB:0:0:CD30:0:0:0:0
=12AB::CD30:0:0:0:0
=12AB:0:0:CD30::
(如果出现两个多个0,随意压一个都行)
单播(Unicast address)
单播的地址格式(一共 128 bit):
-
全球路由前缀(Global routing prefix,48 bit)
前3位为
001
,分配给公司和组织。 -
子网ID(Subnet ID,16 bit)
如果是小公司,只需要1个子网的话,全设为0
-
接口ID(Interface ID,64 bit)
基于 EUI-64
IPv4到IPv6的迁移
- 现在的网络既有IPv4,也有IPv6。世界上的所有网从IPv4到IPv6需要很长的转换时间。
- 两种IPv4到IPv6的迁移
- 双栈(Dual Stack):一些路由器可以兼容IPv4和IPv6
- 隧道(Tunneling):当IPv6穿过IPv4的路由器上时,将IPv6作为载荷承载在IPv4上
双栈(Dual Stack)
- 早期的设计
- 一些路由器有双栈(IPv4 & IPv6),可以翻译这两种格式
隧道(Tunneling)
当IPv6穿过IPv4的路由器上时,将IPv6作为载荷承载在IPv4上。就是像一个连接两个IPv6路由器的IPv4隧道
4.4 通用转发和 SDN
传统
- 网络层功能: 转发:对于从某个端口 到来的分组转发到合适的 输出端口 路由:决定分组从源端 到目标端的路径 路由算法
- 类比: 旅行 转发:一个多岔路口的 进入和转出过程 路由:规划从源到目标 的旅行路径
每个路由器上都有实现路由算法元件(它们之间需要相互交 互)- 形成传统IP实现方式的控制平面
- 路由器的网络层功能:
- IP转发:对于到来的分组按照路由表决定如何转发,数 据平面
- 路由:决定路径,计算路由表;处在控制平面
SDN:逻辑上集中的控制平面
- 一个不同的(通常是远程)控制器和CA交互,控制器决定分组 转发的逻辑(可编程),CA所在设备执行逻辑。
SDN的主要思路
- 网络设备数据平面和控制平面分离
- 数据平面-分组交换机
- 将路由器、交换机和目前大多数网络设备的功能进一步抽 象成:按照流表(由控制平面设置的控制逻辑)进行PDU (帧、分组)的动作(包括转发、丢弃、拷贝、泛洪、阻 塞)
- 统一化设备功能:SDN交换机(分组交换机),执行控制 逻辑
- 控制平面-控制器+网络应用
- 分离、集中
- 计算和下发控制逻辑:流表
优点
水平集成控制平面的开放实现(而非私有实 现),创造出好的产业生态,促进发展
集中式实现控制逻辑,网络管理容易
基于流表的匹配+行动的工作方式允许“可编程的”分组交换机
通用转发和SDN OpenFlow数据平面抽象 每个路由器包含一个流表(被逻辑上集中的控制器计算和分发)
OpenFlow数据平面抽象
一种网络通信协议,应用于SDN架构中控制器和转发器之间的通信。
- 流: 由分组(帧)头部字段所定义
- 通用转发: 简单的分组处理规则
- 模式: 将分组头部字段和流表进行匹配
- 行动:对于匹配上的分组,可以是丢弃、转发、修改、 将匹配的分组发送给控制器
- 优先权Priority: 几个模式匹配了,优先采用哪个,消除歧 义
- 计数器Counters: #bytes 以及#packets
路由器中的流表定义了路由器的匹配+行动规则 (流表由控制器计算并下发 )
OpenFlow抽象
- match+action: 统一化各种网络设备提供的功能