本系列文章为笔者在学习b站中科大郑烇老师的计算机网络课程时(郑老师讲得很清晰!!),结合课程PPT与《计算机网络:自顶向下方法》(第七版)所作的学习笔记,部分图片源自课程PPT或书中,如有侵权,请联系作者删除。
笔记汇总
4.1 网络层概述
4.1.1 网络层服务
网络层为上层(传输层)提供的服务为:在发送端,将报文段封装为数据报并交由下层(数据链路层),在接收端,将数据包解封装为段并交由上层的传输层实体,实现主机到主机的通讯。
不同于传输层协议(只存在于主机中),网络层的协议存在于每一个主机和路由器上,于是它在每一台路由器上都维护了主机与主机之间的通信,属于有连接的服务(与TCP面向连接不同,TCP只在两台端系统中维护通信信息)。
4.1.2 网络层的主要功能
转发(局部)
当一个分组到达某台路由器的输入链路时,该路由器必须将该分组转发到设当的输出链路中。(查转发表)
路由选择(全局)
使用路由算法来决定分组从发送主机到目标接收主机的路径。(计算出转发表)
4.1.3 控制平面和数据平面
控制平面主要的功能是利用路由选择算法计算转发表,决定端到端的路径,数据平面主要做转发工作。分为传统方式和SDN(Software-Defined Networking)方式。
传统方式
传统方式中的控制平面为每-路由器(Per-router)控制平面,每一个路由器单独运行路由选择算法,通过与其他路由器路由算法的通信,决定端到端的路径。
传统方式的数据平面所实现的转发基于目标ip地址和转发表。
SDN方式
SDN方式中的控制平面为逻辑集中的控制平面,使用一个远程控制服务器实现转发表的计算,并将转发表分发到各台路由器中。
SDN方式中的数据平面所实现的转发基于多个字段和转发表,且功能更多。
4.1.4 网络服务模型
网络服务模型定义了分组在发送与接收端系统之间的端到端运输特性。可能包括以下服务:
- 对于单个数据报而言
- 可靠传送
- 延迟保证
- 对于数据报流而言
- 保证数据报传送
- 保证流的最小带宽
- 分组之间的延迟差
以下为不同网络架构的服务模型,因特网提供的是尽力而为的服务,说白了就是什么都不保证。
4.2 路由器组成
4.2.1 路由器结构概况
路由器的大致组成如下图所示:
-
输入端口:功能为接收到来的物理层信号,通过链路层功能将物理层信号转换为链路层的帧(frame),再通过网络层提取帧中的数据报,最后根据转发表决定前往的输出端口。(这里的端口,指的是路由器的物理输入和输出接口,与第2、3章所讲的与套接字相关的软件端口不同)
-
交换结构(high-seed switching fabric):将路由器的输入端口连接到其输出端口。
-
输出端口:输出端口存储从交换结构中接收的分组,并经过链路层和物理层在输出链路上传输。
-
路由选择处理器(routing processor):路由选择处理器执行控制平面功能。它运行路由选择协议,为路由器计算出转发表(传统方式),或者负责与远程控制器通信(SDN方式)。还进行网络管理功能。
其中,输入端口,输出端口与交换结构属于数据平面,它们通常使用硬件实现,并运行在纳秒级时间尺寸上;路由选择处理器属于控制平面,它通常使用软件实现,并运行在毫秒级时间尺寸上。
4.2.2 转发方式
转发方式大致分为两种,基于目的地转发与通用转发。
- 基于目的地转发:仅依赖于IP数据报的目标IP地址(传统方式)
- 通用转发: 基于头部字段的任意集合进行转发(SDN方式)
4.2.3 输入端口处理与基于目的地的转发
基于目的地的转发
转发表如果蛮力维护每一个IP地址到每一个端口的映射关系的话,那么表将会异常庞大(32位IP地址有
2
32
2^{32}
232个取值)。
于是,转发表所维护的表项是一个IP地址范围到端口的映射关系,如下图例子所示。
由于IP地址范围可能有公共的前缀,故实际维护表项时只需要维护一个前缀即可,如下图所示。
当某个IP地址与多个前缀相匹配时,路由器使用最长前缀匹配规则,即在该表中寻找最长的匹配项。例如地址:
11001000 00010011 00011000 10101010
的前24比特与上表中的第二项匹配,而该地址的前21比特与表中的第三项匹配,则选择第二项所对应的端口放出。在下一节会讲述采用最长前缀匹配规则的原理。
在路由器中,经常使用三态内容可寻址存储器(Tenary Content Address Memory,TCAM)来查找转发表中的表项。
输入端口处理
更详细的输入处理图如下所示,在该图中可以看到,输入端口维护了一个分组的队列,以处理输出拥塞的问题。
拥塞问题:
- 当交换结构的速率小于输入端口的汇聚速率时,在输入端口可能需要排队(引起排队延迟以及丢包),但是一般设计的时候都会满足交换速率较大,故可以忽略。
- 当目标端口存在竞争关系时(两个数据报前往同一个端口),排在队头的数据报阻止了队列中其他数据报的移动,如下图
4.2.4 交换结构
交换结构位于路由器的核心部位,将分组从输入缓冲区传输到合适的输出端口,交换速率一般比较快(比如有 N N N个输入端口,那么交换速率是输入链路速率的 N N N倍才比较理想),才不会称为瓶颈。
三种典型的交换结构:
- 经内存交换:输入端口中的分组被拷贝进内存,CPU提取分组头部信息之后,查找转发表相应表项,再将分组拷贝到输出端口;该方式需要经过系统总线两次,转发速率受内存的带宽限制,且一次只能转发一个分组。
- 经总线交换:输入端口经一根共享总线直接连接到输出端口进行传送,不需要经过CPU;受总线带宽限制,一次只能转发一个分组。(具体的实现方法是,在输入端口中为分组指定输出端口标签,然后经由总线向所有的输出端口转发,输出端口收到分组之后,标签一致的保留)
- 经互联网络交换(crossbar等):同时并发转发多个分组,克服总线带宽限制。
4.2.5 输出端口处理
当数据报从交换结构的到达速率比传输速率快时,输出端口就需要排队缓存;当缓冲区中存在多个分组时,需要由调度策略选择排队的数据报进行传输;当缓冲区满时,由丢弃策略选择排队的数据报进行丢弃(产生丢包)。
丢弃策略
- tail drop:丢弃刚刚到达的分组
- priority:根据优先级丢弃
- random:随机丢弃
调度策略
常见的调度策略有:
- 先进先出(first in first out, FIFO):按照分组到达的次序传输。
- 优先级调度:按照优先级分类,发送优先级最高的类中的所有分组,再发送优先级低的分类。
- 循环排队规则:循环扫描不同类型的队列,每一类发送一个分组之后发送下一类。
- 加权公平队列:在循环的基础上,每个类给予不同权重,权重高的服务量较多。
4.3 网络层协议:IPv4、寻址、NAT、IPv6及其他
4.3.1 IPv4数据报格式
IPv4的头部包含20个固定字节与一些可选项字节,
-
版本号:4个bit,规定了数据报的IP协议版本。
-
首部长度:4个bit,确定IP数据报载荷部分开始的地方。
-
服务类型:使不同类型的IP数据报区分开来。(基本上弃用了)
-
数据报长度:16个bit,表示此数据报的总长度(首部加上载荷部分),以字节为单位。
-
标识、标志、片偏移:16个bit标识,3个bit标志和13个bit片偏移,与IP分片有关的字段,在下一小节会讲到。
-
剩余跳数(寿命)(Time-To-Live, TTL):每经过一个路由器,TTL减1,当TTL为0时,该数据报将被丢弃。
-
上层协议:指明该数据报将交由哪个特定的传输层协议。(值为6为TCP、值为17为UDP)
-
首部校验和:利用差错控制编码校验首部字节的比特错误。
-
源IP和目标IP:源主机IP地址和目标主机的IP地址。
-
可选字段:较少使用。
-
数据(有效载荷):包含上层协议实体提交的报文段(TCP或UDP);也可以承载其他类型的数据(如ICMP报文)。
4.3.2 IP分片和重组
-
最大传送单元(Maximum Transmission Unit,MTU)
一个链路层的帧能够承载的最大数据量叫做最大传送单元,由于一个路由器连接了两条及以上的链路,各个链路上可能存在具有不同MTU的链路层协议。 -
分片
当一个大的IP数据报到达路由器,通过查找转发表确定了一个MTU比该数据报规模小的输出链路,这时,需要将该数据报分片。具体的方法是将IP数据报中的数据部分分片成两个或多个较小的数据片,加上传入数据报的首部成为新的两个或多个较小的IP数据报进行传输。 -
重组
重组只在目标主机上进行。发送主机为数据报贴上标签(标识字段),用于重组时对同一来源的数据报进行拼接。其中,原始大数据报的最后一个分片中标志字段被设置为0,其他分片被设置为1。偏移字段指定了某一个分片应该放在原始数据报的哪个位置(偏移量)。
4.3.3 IPv4编址
基本概念
- 接口
主机或路由器与物理网络的边界称为接口 - IP地址
IP地址长度为32bit(4个字节),一个IP地址与一个接口相关联,而不是与一台主机或路由器相关联(容易混淆的概念)。一个接口的IP地址的一部分(网络号)需要由其连接的子网来决定。 - 子网(subnet)
一个子网内部的IP地址高位部分相同,且子网内各主机的传输不需要经过路由器,在物理网络上相互直接到达。如下图所示,该网络包括三个子网。
判断一个子网也很简单,将每一个接口从路由器或主机上分开,剩余的部分将形成一个个隔离的网络岛,每一个网络岛都可以称为一个子网。
- 子网掩码
指定了IP地址中网络前缀的长度(如223.1.1.0/24,其中的24表示32bit中的前24bit作为网络号)
分类编址(classful addressing)
如下图所示,将IP地址分为五类。这种编址方式不够灵活,比如为具有2000台主机的组织分配一个B类地址,就有足以支持多达65534个接口(除去全0本主机和全1广播)的地址空间,剩余63000+个地址会被浪费。
无类别域间路由选择(Classless InterDomain Routing, CIDR)
将子网寻址的概念一般化了,子网部分可以在任意的位置,如:
a
.
b
.
c
.
d
/
x
a.b.c.d/x
a.b.c.d/x表示前
x
x
x个bit表示网络号。
当某个组织外部的一台路由器转发一个数据报,且该数据报的目的地址属于该组织的内部,则仅需要考虑该地址的前
x
x
x个bit,大大减少了路由器中转发表的长度。(上一节所举的转发表例子)
路由聚集(route aggregation)
路由聚集其实是一个子网的树形结构,如下图,FLy-By-Night-ISP在知道了它下一跳的所有子网IP之后,可以将它们进行聚集(在这个例子中前20个bit是公共的,且23bit相对于20bit划分的子网是全面的,共8个),并将聚集得到的结果向外界通报,外界的其他部分不需要知道在200.23.16.0/20内实际上还存在着8个其他的组织,每个组织内有自己的子网。
当子网信息不全面时,如下图,只包含了组织0,2,…7,组织1在ISRs-R-Us之下,此时,Fly-By-Night-ISP依然可以向外界通报200.23.16.0/20,同时ISRs-R-Us必须向外界通报200.23.18.0/23。外界转发一个目标IP地址为200.23.18.1的分组时,由于200.23.18.0/23描述得更加详细(即使200.23.16.0/20也能匹配上),故将跳往ISRs-R-Us的接口中。这也是最长前缀匹配规则的由来。
获取地址
-
获取一块地址
通过因特网名字和编号分配机构(Internet Corporation for Assigned Names and Numbers,ICANN)获取- 分配地址
- 管理DNS
- 分配域名,解决域名冲突
-
获取一个地址
- 手动配置
- 从服务器中动态获取
-
利用动态主机配置协议(Dynamic Host Configuration, DHCP)获IP地址
- 主机广播“DHCP discover”报文
- DHCP服务器用“DHCP offer”响应
- 主机请求IP地址,”DHCP request”
- DHCP服务器发送地址,“DHCP ack”
4.3.4 网络地址转换(Network Address Translation,NAT)
【RFC1918】中保留了三部分IP地址空间:
- 10.0.0.0 ~ 10.255.255.255
- 172.16.0.0 ~ 172.31.255.255
- 192.168.0.0-192.168.255.255
它们用于家庭网络等专用网络,不用于公有网络中,在不同的专用网络中,专用IP可以重复使用。
当内网(专用网络)中的一台主机想要于公网的一台主机通信时,使用同一个公网的IP地址,具有不同的端口号。
这样做的动机是:
- 不需要从ISP分配一块地址,可用一个IP地址用于所有的局域网设备
- 可以在局域网改变设备的地址情况下而无须通知外界
- 可以改变ISP(公网地址变化)而不需要改变内部的设备地址
- 局域网内部的设备没有明确的地址,对外是不可见的
具体实现
在内网的数据报经由NAT路由器输出到公网之前,NAT需要将源地址和端口号替换为NAT的IP地址和新的端口号,目标IP地址和端口号不变;同时,维护每一个(源内网IP和端口)到(NATIP和新端口)的映射(NAT表);当公网数据报进入NAT路由器时(想要发送给内网设备),替换目标IP和端口,采用NAT表中的mapping表项。
对NAT的争议
- 路由器应该只对网络层信息做处理,而NAT修改了传输层的信息(端口号)
- 违反了端到端的原则,即使复杂工作放在端系统解决
- 地址短缺问题可以被IPv6解决
- NAT穿越问题:当客户端需要主动连接NAT之后的服务器,如何操作(此时NAT并为维护该服务器的IP与端口转换表项)
NAT穿越问题解决方案
- 静态配置NAT:NAT的某一端口总是转发至某个服务器的特定端口上
- Universal Plug and Play(UPnP协议)
- 中继方法:NAT后面的服务器建立和中继服务器的连接,外部的客户端连接到中继服务器,中继在2个连接之间桥接
4.3.5 IPv6
动机
- 32bit的地址空间很快会被用完
- 改变数据报头部的格式加速处理和转发
- 头部格式改变帮助QoS(Quality of Sevice)
IPv6数据报格式
- 版本:4bit字段标识IP版本号
- 流量类型:8bit字段与IPv4中的TOS字段含义类似
- 流标签:20bit的字段标识一条数据报的流,对一条流中的某些数据报给出更高的优先级
- 有效载荷长度:16比特给出了IPv6数据报载荷部分的字节数
- 下一个首部:标识数据报中的内容需要交给哪个协议进行处理,与IPv4首部中的协议字段一致
- 跳限制(hop limit):转发数据报的每台路由器将该字段减1,如果为0,则丢弃该数据报,与IPv4中的TTL类似
- 源地址和目标地址
IPv6的改进
- 不允许分片与重组
IPv6不允许在中间路由器上进行分片与重新组装,如果路由器收到了比较大的数据报(胖分组)无法输出到链路上,则丢弃该数据报并向发送方发送一个分组太大的ICMP差错报文(第五章会讲到) - 去除首部校验和
IPv6去除了IPv4首部的校验和字段,减少了路由器校验的时间,把校验的工作交给传输层与链路层 - 选项
选项字段不再首部中,使得首部成为定长的内容;选项字段可以出现在IPv6首部由“Next Header”指向的位置
IPv6到IPv4的迁移
从IPv4迁移到IPv6的工作不可能在一个夜晚搞定(所有机器宕机更新),只能通过隧道技术平滑过渡。
视频中,郑老师有一个形象的比喻,将一开始的IPv4比作海洋,IPv6比作海洋上的几座孤岛。当孤岛间需要进行通信时,使用IPv4隧道(在IPv4数据报的载荷部分包含一个IPv6数据报)进行传输,慢慢地孤岛越来越大,海洋变成湖泊,IPv4在IPv6陆地上的传输同理,从而实现平滑过渡。
4.4 通用转发和SDN
4.4.1 通用转发
使用一种更有意义的通用“匹配加动作”范式,能够对协议栈的多个首部字段进行“匹配”,这些首部字段是与不同层次的不同协议相关联的。使用一张匹配加动作表将传统方式的转发表一般化。
在后面的介绍中,基于OpenFlow规定中的流表,它的每个表项包括:
- 首部字段值集合
- 计数器集合
包括已经与该表项匹配的分组数量 - 动作集合
包括转发、丢弃、复制并转发到多个端口、重写所选的首部字段
4.4.2 流表例子
使用上图所示的简单网络结构,介绍下面三个例子:
- 简单转发
假设想要实现的转发行为是,主机h5或h6发送分组给h3或h4,且想要避免使用s3与s2之间的链路,则在三个主机上设置的流表如下。其实思路很简单,就是在s3分组交换机中禁止4号端口的输出,在s2分组交换机中禁止1号端口的输入。
- 负载均衡
我们想要使得来自主机h3发往10.1.*.*的数据报经过s1和s2之间的直接链路转发,来自主机h4发往10.1.*.*的数据报通过s2->s3->s1的路径转发,实现负载均衡,则只需要改动s2的流表,如下所示。
- 充当防火墙
如果分组交换机s2只希望收到来自主机h5和h6的流量,则只需要在流表中匹配源IP即可,如下所示。