网络层基本介绍
· 网络层的任务是实现主机之间的通信(跨越通信网络)。
· 网络层的通信模式是:虚拟互联网。
· 网络层需要解决:主机的识别、寻址、转发。
· 需要通过以下协议实现:IP、ARP、ICMP、RIP、OSPF。
· 服务类型:数据报、虚电路。
网络层的几个重要概念
· 长期以来人们一直争论:可靠交付应该由网络来保障还是终端系统来保障?即网络应该提供"面向连接"还是"无连接"的服务:
观点1: 网络负责可靠传输,使用面向连接的通信方式。通信之前先建立虚电路,以保障双方需要的网络资源,再搭配上可靠的网络传输协议,即可保障数据传输无差错、按顺序、不丢失、不重复。
虚电路指的是通信的主机之间建立的一个逻辑上的连接,所有分组都按照这条连接存储转发。
观点2: 网络层向上层运输层只提供简单的、无连接的、尽最大努力交付的数据报服务。在发送分组时不需要建立连接,每一个分组独立发送,与前后组无关(即不进行编号)。网络层不提供服务质量的承诺。
这种设计的最大好处:便宜!路由器可以制作的非常简单,价格低廉,运行方式灵活,能够适用多种应用。
互联网能发展到如今的规模,充分体现了当初选用这种模式的正确性。
虚电路服务方式与数据报服务方式对比:
· 网络层的两个层面:
两台主机之间的通信需要经过多个路由器的分组转发来完成。我们把路由器之间传送的信息分为数据和路由信息两大类,其中,路由信息是为了数据传输而服务的。
因此,我们把网络层分为控制层面和数据层面,路由器中包含转发表和路由选择软件。
我们使用软件定义网路(Software Defined Network,SDN)来分隔两个层面:
- 远程控制器:根据算法计算出最佳路由,在每一个路由器中生成转发表。
- 路由器:路由器之间不交换路由信息,而是直接查找转发表,通过转发表进行转发。
网际协议 Internet Protocol
· IP协议拥有三个配套协议:
地址解析协议(Address Resolution Protocol,ARP)。
网际控制报文协议(Internet Control Message Protocol,ICMP)。
网际组管理协议(Internet Group Management Protocol,IGMP)。
· IP协议的作用,就是把使用不同协议、不同控制等一系列不同的主机连接起来:
· 使用IP协议连接起来的的网络被称为虚拟互连网络,也就是我们常说的互联网。
· 在网络层中,路由器完成寻址和转发:
· IP地址:
如果我们把互联网看成一个简单、抽象出来的网络,那么IP地址就是给互联网上每台主机或路由器分配一个全世界范围内唯一的32位标识符。
IP地址由ICANN进行分配,其包含五大区域机构:
IP地址表示方式如下,包含了网络号和主机号。
具体来说,使用点分十进制的方法来记录:
IP地址的分类:我们知道IP地址分为网络号和主机号,他们两个的长度不一定相等,如果网络号越短,就意味着主机号越长,这样能标识的主机数就越多。所以我们们就把IP地址分为ABCDE类,每类地址通过标志位区分,如A类为0,B类为10,C类为110等。
其中ABC类的可指派范围如下,A类最大为2^8-2(A类为8位),B类为2^16-1,C类为2^24-1。
一般不使用的特殊IP地址如下:
其中,127.0.0.1可分配给主机作为本地地址,他是个回环地址,因此无法捕获到数据包。
私有网络地址:不能分配给用户作为访问互联网的地址,但可以作为内联网(Intranet)的地址,然后通过NAT实现内联网与互联网的直接地址转换。有三类私有地址:
· 无分类编址(Classless Inter-Domain Routing,CIDR):当一个公司,如IBM,获取了一个A类地址之后,它就获得了上千万个主机的IP分配权,但是实际上不可能有这么多台主机,因此会造成IP地址的浪费,CIDR的提出,就是为了消除传统的ABC类地址以及子网的概念,以便与更加有效地分配IPv4的地址:
网络前缀(Network-Prefix):CIDR使用网络前缀而非网络号来指明网络,剩余部分都是主机号。
CIDR使用斜线记法,如128.14.32.0/20,/后面的20表示前20位是网络号,后面12位是主机号。
最小地址和最大地址一般不使用。
注意区分CIDR地址块表示方式:
子网掩码(Subnet-Mask):也称地址掩码,由总长度为32的一连串1和0构成。其中1的数量为网络前缀的长度,剩下的就是0的数量。子网掩码可以让机器从IP地址中迅速计算出网络地址。
默认子网掩码:如果不使用CIDR记法的话,ABC类地址默认的子网掩码为:
给出一个IP地址和其子网掩码,就可以很轻易的计算出网络地址了:
常用的CIDR地址块如下:
前缀长度为13的时候,可以计算出可以分配的主机数为2^19,因为一个B类地址最大主机数为2^16(-2),故相当于2^3个B类地址(2^3*2^16=2^19),同理,C类最大主机数为2^8(-2),那就相当于2^11个C类地址。
从图中可以看到,当前缀长度超过23之后,可分配的数量就非常少了。
构成超网:从上表我们可以看到,前缀长度不超过23位的CIDR地址块都包含了多个C类地址,因此会有文献称CIDR编址为构成超网。
三个特殊的CIDR地址块:
路由聚合(Route Aggregation):因为一个CIDR地址块可以表示很多个地址,这种地址的聚合我们称为路由聚合,它使得路由表中的一个项目可以表示很多个原来传统分类地址的路由。路由聚合有利于减少路由器之间路由信息的交换,从而提高整个互联网的性能。
从上图可以看到,4个组织经过R1之后,都被聚合到140.27.7.0/24这个地址上去了,R2的路由表中只记录到这个地址。
而聚合的方式也很简单,就是把左边相同的保留,不同的清零即可。值得注意的是,聚合后是前24位相同,因此R2中记录的子网掩码是/24而不是/26。
CIDR划分地址块举例:
可以看到,ISP分配了一个地址块206.0.68.0/22给大学X,然后,该大学根据自己的4个系把地址块进行再划分,四个系划分到4个新的地址块,然后系里再根据这些地址块分配IP地址即可。
在进行路由聚合到时候,4个系的所有路由都会聚合为206.0.68.0/22。
· IP地址的一些重要特点:
IP地址是一种"分层次"的地址结构,好处是:
实际上IP地址是标志一个主机(或路由器)和一条链路的接口。
用二层交换机连接起来的若干局域网仍为一个网络,因此他们具有同样的网络号。
所有分配到网络号的网络,无论是小的局域网还是大的广域网,都是平等的。
在同一个局域网中的主机/路由器的IP地址中的网络号都是相同的。
路由器总是具有2个或以上的IP地址,其每一个接口都有一个不同网络号的IP地址。
· IP地址与MAC地址:
网络层及以上用IP地址,链路层及以下用MAC地址。
为什么不直接使用MAC地址通信?因为不同路由器、主机对硬件地址的编码方式是不一样的,使用的是不同的协议,为了兼容所有的协议,使用IP地址对它们进行表示。
从不同层次看IP地址和MAC地址,可以发现,IP源地址和IP目的地址保持不变,而物理源地址和物理目的地址会变化。
因此,我们可以理解为,IP地址用于寻址,MAC地址用于传输。
· 地址解析协议(Address Resolution Protocol,ARP):
ARP协议用于把IP地址解析为MAC地址。
首先,每一个主机都设有一个ARP高速缓存(ARP Cache),里面有所在的局域网上的各主机和路由器的IP地址到硬件地址的映射表。会先查找Cache里面有没有对应的映射关系,如果有就直接转发即可。
如果检查Cache里面没有映射关系,则ARP会在本局域网上广播发送一个ARP请求分组(路由器不转发ARP请求)。所有收到广播请求的主机都会把发送方的映射写入Cache,而目标主机会返回自身的IP和MAC地址,发送方收到ARP响应分组后,将得到的IP地址到MAC地址的映射写入Cache。
使用ARP的四种典型情况:
- 发送方(主机)与接收方(主机)在同一个网络上。(H1->H2)
- 发送方(路由器)与接收方(主机)在同一个网络上。(R1->H1/H2/H3)
- 发送方(路由器)与接收方(主机)在不同网络上。ARP找到本网络上的路由器的MAC地址,转发给该路由器,剩下的工作由该路由器完成。(R1->H4,由R2转发,运行2次ARP协议,在R1上抓包无法看到H4的MAC地址)
- 发送方(主机)与接收方(主机)在不同网络上。ARP找到本网络上的路由器MAC地址,转发给路由器,剩下的工作由该路由器完成。(H1->H4,运行3次ARP协议)
免费ARP报文(Gratutitions ARP):
- 一种特殊的ARP报文,源IP地址和目标IP地址都是本机IP地址;源MAC地址是本机MAC地址,目标MAC地址是广播地址。
- 不期待得到IP地址对应的MAC地址。
- 用于验证IP地址是否冲突:当其他设备收到该ARP报文后,若发现报文中IP地址与自身冲突,则发送一个ARP应答告知该设备。
- 用于通知网络中其他主机及时更新ARP缓存:若该设备的MAC地址被更换,可通过发送免费ARP报文来告知其他设备更新ARP缓存表。
· IP数据报的格式:
IP数据报由首部和数据部分组成。
版本:占4位,指IP协议的版本号,一般为IPv4或IPv6。
首部长度:占4位,单位为4字节。可表示最小长度为5个单位(0101),即5*4=20字节;最大长度为15个单位(1111)即15*4=60字节。故首部长度范围为20-60字节。
总长度:占16位,代表首部长度+数据长度。单位为字节,因此总长度最大为65535字节。为什么需要知道总长度?因为IP数据报会交给链路层去封装成帧,而帧的最大传输单元MTU为1500字节(以太网),因此一个帧可能装不下整个IP数据报,因此就需要分片去封装成帧。那么总长度就能用于计算数据部分的长度了。
标识:占16位,是一个计数器,用于标识分片时的IP数据报。如一个IP数据报被切分为5个分片,那么这5个分片的标识都一样。
- 为什么IP数据报需要分片:不同数据链路层规定的MTU大小不同(如下图),网络层的作用就是抹平这些差异,IP数据报在被链路层封装时,它必须不受限于数据链路层MTU的限制,因此需要对数据报进行分片。
标志:占3位,但目前只有前2位,其结构如下。
- DF代表Don't Fragment,用于标识路由器是否可以进行分片,若为1则代表"不要分片",此时若路由器收到的数据报大小超过MTU则会直接丢弃并回复一个ICMP错误信息。
- MF代表More Fragment,用于标识该数据报分片是否是最后一个,MF=1则表示不是最后一个,后面还有,MF=0则代表这是最后一个分片。
片偏移:占13位,表示分片后该片在原分组中的相对位置,以8个字节为偏移单位。
- 分片例子:一个数据报总长度为3820字节,数据部分长度为3800字节,固定首部为20字节,分片长度最多不超过1420字节-->>首部为20字节,则每个分片可装1420-20=1400字节数据,数据部分共3800字节,故分为三片,分别是1400、1400、1000字节,如下图所示:
可以看到,第二个分片的偏移量计算方式为1400/8,8是片偏移的单位,则计算得到偏移量为175。
原始数据报首部和分片后各个分片的首部展示如下,可以发现,标识都是一样的,这样接收方才能把这些分片识别为同一个数据报;1和2的MF=1,说明后续还有分片,3的MF=0,说明这是最后一个分片;123的DF=0,告诉路由器可以进行分片后再分片的处理。
注意:只有标识字段的值相同的分片才能被正确重组,如下面这个例子所示。
生存时间(TTL):占8位,指示数据报可以在网络中通过的路由器数的最大值。每经过一个路由器,该数据报的TTL就被减一,若路由器接到的数据报TTL=0,则超时,直接丢弃。
协议:占8位,指出该数据报携带的数据属于哪种协议,以便目的主机的网络层把数据部分上交给对应协议处理。体现了复用的思想。
首部校验和:占16位,只校验首部,不校验数据部分。这里不采用CRC校验,使用反码算数运算法。若校验到首部错误则直接丢弃即可。
源地址和目的地址:各占4字节。
可变部分:可选字段,用于排错、测量、安全等措施,如设置松散源路由或严格源路由。长度可变,位1-14个字节。但实际上,这些字段很少会被使用。
路由器转发IP数据报需要经历的过程:
· IP层转发分组的过程:
基于终点的转发:基于分组首部中的目的地址进行转发。
- 直接交付:目的主机与路由器在同一个网上。
- 间接交付:IP数据报需要经过中间路由器转发到目的主机上。
- 分组在互联网中是逐跳转发的。
在路由表中,对每一条路由最重要的就是目的网络地址和下一跳地址。路由器通过2级寻址找到下一跳地址:
- 1级寻址(找网络,IP寻址),通过目的主机IP地址寻找该主机所在网络:用子网掩码和IP地址做and运算,通过转发表找到目的网络。
- 2级寻址(找主机,MAC寻址),找到所在网络后寻找主机,用ARP协议找到主机MAC地址,通过帧传送给目的主机。
- 举个例子:
最长前缀匹配:使用CIDR时,查找转发表的话可能会得到不止一个匹配结果,此时,根据最长前缀匹配原则,选择前缀最长的一个作为匹配的前缀。因此,通常会把前缀最长的排在转发表前面。
如上例子所示,使用128.1.2.194 AND 255.255.255.192(26)或255.255.255.128(25)都能得到正确的匹配结果,但是,因为1828.1.2.192/26的网络前缀长度26大于128.1.2.128/25的长度25,所以路由器会选择接口0进行转发。
转发表中的2种特殊路由:
默认路由:举个例子,某个主机的路由表如下,如果它的目的网络不是N1或N2,那就一律选择默认路由,把数据报先间接交给R1,再让R1交给下一个路由器。
总的来说,路由器分组转发的算法流程如下:
使用二叉线索查找转发表:
· 网际控制报文协议(ICMP):
IP协议本身是一个不可靠的协议,它没有一种机制去获取差错信息并进行相应控制,除此之外,IP协议没有针对主机的查询与控制。
ICMP协议就是为了弥补这两项不足而设计的,利用它传递网络控制信息,提供差错报告功能。
ICMP报文作为数据装在IP数据报中,它不是一个高层协议,而是一个IP层的协议,它作为IP协议的一个模块存在,与IP协议互相依赖。
常见的ICMP报文种类和类型如下:
ICMP报文格式如下:
常见的ICMP差错报告报文:
- 终点不可达(类型=3,代码=0-12):主机或路由器无法发送数据报时产生该报文。如当网络故障导致无法正常寻址;或主机不工作时无法正常转发。
- 报文超时(类型=11,代码=0为TTL超时,代码=1为段重组超时):当路由器收到的数据报TTL=0时则丢弃该报文,产生超时报文;或目的主机在规定时间内无法收到一个数据报的全部分片,则丢弃已收到分片,并发送超时报文。
- 参数错误(类型=12):路由器或目的主机收到的数据报中首部中有字段的值不正确时就丢弃该数据报并向源主机发送"参数问题"错误报文。
- 重定向报文(类型=5):TCP/IP规定,假设路由器知道正确的路径,主机启动时只知道最小寻址信息,启动后在数据的传输过程中不断从路由器获取新的路由信息。简单的例子如下所示:
我们可以发现:主机和路由器交换信息通过ICMP重定向报文实现;而路由器之间交换信息由周期性广播实现。
不应该发送ICMP错误报文的情况:
ICMP询问报文:
- 回应请求与应答:该报文用于测试目的主机的可达性,PING命令就是以此为基础实现的。
值得注意的是,PING命令是应用层直接使用网络层ICMP的例子,他没有通过运输层的TCP或UDP。