文章目录
概述
网络层的两个功能
路由器是如何实现转发的操作呢?
每台路由器具有一张转发表,路由器通过检查到达分组首部字段的值来转发分组,通过使用该值在路由器的转发表中进行索引查询,存储在转发表项中的该首部的值指出了该分组将被转发的路由器的输出链路接口。分组首部中的该值可能是该分组的目的地址或该分组所属连接的指示。在下面中我们将更加详细的进行讲解转发,现在先对转发有个初步了解。
网络层的服务模型
其他的网络体系结构已定义和实现了许多超过因特网的尽力而为服务模型,但是我们这里的目的注意到除了因特网的尽力而为模型外,还存在其他模型即可。
说到尽力而为服务,我们可以联想到了运输层中的谁呢?想必我们都想到了是UDP,UDP是一种无连接的,不可靠的运输层协议,因此同样属于尽力而为服务,即不保证数据无损坏,不丢失,无失序,按时到达接收方。
路由器工作原理
通过前面讲到,我们连接了网络层的转发功能是指分组从一个输入链路接口转移到适当的输出链路接口的路由器本地工作。如何转移到适当的链路接口是路由器通过在它的转发表中索引查找分组首部字段的值,从而找到该分组被转发的路由器的输出链路接口。该分组首部字段的值可以是该分组的目的地址或该分组所属连接的指示。
通过上面的图,我们知道了路由器由4个部分组成,分别是输入端口、输出端口、交换结构、路由处理选择器。接下来我们将详细讲解这几个部分。
输入端口
输入端口中具有重要的功能,查找输出端口。正是在输入端口,路由器使用转发标来查找输出端口,使得到达的分组将能经过交换结构转发到对应的输出端口。
交换结构
交换结构位于亿台路由器的核心部位,通过交换结构,分组才能实际地从一个输入端口交换(即转发)到一个输出端口中。下面我们将讲解三种交换方式:
-
经内存交换
一个分组到达一个输入端口时,该端口会先通过中断方式向路由选择处理器发出信号。于是该分组从输入端口处被复制到处理器内存中。路由选择处理器则从其首部中提取出目的地址,在转发表中找出适当的输出端口,并将该分组复制到输出端口的缓存中。同时需要注意的是不能同时转发两个分组,即使他们有两个不同的端口号,因为经过共享系统一次仅能执行一个内存读/写。 -
经总线交换
-
经互联网络交换
输出端口
输出端口处理取出存放在输出端口内存中的分组,并将其发送到输出链路上。这包括选择和取出排队的分组进行传输,执行所需的链路层和物理层传输功能。
同样地,如果交换结构不能快得使所有到达分组无时延地通过它传送(即分组到达输入端口的速度大于交换结构发送分组的速度),则在输入端口也将出现分组排队,因为到达的分组必须加入输入端口队列中,以等待通过交换结构传送到输出端口。
IPv4与IPv6
IPv4
Ipv4数据报格式
Ipv4数据报中的关键字段如下:
- 版本
- 首部长度:大多数的IP数据报不包含选项,所以一般的IP数据报具有20字节得首部。
- 服务类型
- 数据报长度:这是IP数据报的总长度(首部加上数据),以字节计。因为该字段长为16比特,所以IP数据报的理论最长长度为65535字节。然而数据报很少有超过1500字节的。
- 标识、标志、片偏移:这三个字段与IP分片有关。
- 寿命:寿命(Time-To-Live,TTL)字段用来确保数据包不会永远在网络中循环。每当数据报由一台路由器处理时,该字段的值减1,当它的值为0时,则该数据报必须丢弃。
- 上层协议:该字段仅在一个IP数据包到达其最终目的地才会有用。该字段只是了IP数据报的数据部分应交给那个特定的运输层协议。例如,值为6表明数据部分要交给TCP,值为17表明数据要交给UDP。
- 首部检验和:首部检验和用于帮助路由器检测收到的IP数据包中的比特错误。首部检验和是这样计算的:将首部中的每2个字节(即16个比特数字)当作一个数,对这些数求和,该和的反码存放在检验和字段中。路由器要对每个收到的IP数据报计算其首部检验和,如果数据报首部中携带的检验和和器计算得到的检验和不一致,则检测出差错,路由器一般会丢弃检测出错误的数据报。注意在每台路由器上必须重新计算检验和并再次放到原处,因为TTL字段以及可能的选项字段会改变。
- 源IP地址、目的IP地址
- 数据(有效载荷)
注意到一个IP数据报由总长为20字节的首部(假设没有选项字段),如果数据报承载一个TCP报文段,那么每个(无分片的)数据报承载了总长为40字节的首部(20字节的IP首部加上20字节的TCP首部)以及应用层报文。
IPv4分片
并不是所有的链路层协议都能承载相同长度的网络层分组。有的协议能承载大数据报,而有的协议只能承受小分组。例如,以太网帧能承载不超过1500字节的数据,而某些广域网链路的帧可承载不超过576字节的数据。一个链路层帧能够承载的最大数据量叫最大传送单元(Maximum Transmission Unit,MTU).因为发送方与目的地路径上的每段链路可能使用不同的链路层协议,且每种协议可能具有不同的MTU,因此可能会存在IP数据报的长度大于链路的MTU,这时候怎么办呢?解决该问题的方法是将IP数据报中的数据分片成两个或多个较小的IP数据报,用单独的链路层帧封装这些较小的IP数据报,然后向输出链路上发送这些帧,每个这些较小的数据报都称为片。
在目的地,数据报的有效载荷仅当IP层已完全重构为初始IP数据报时,才被传递给目的地运输层。如果一个或多个片没有到达目的地,则该不完整的数据报被丢弃且不会交给目的地的运输层。但是,如在源主机的运输层正使用着TCP,则源主机的TCP重传数据,以恢复这次丢包,因为TCP具有超时重传机制,但是由于UDP没有超时重传机制,所以一旦发生了分片丢失,不会重传,所以对于UDP,我们尽量不要发送一个大于MTU的数据报文。
同时值得注意的是,在TCP中引入了MSS(Maximum Segment Size,最大分段大小),从而对数据报进行分段,其中需要注意的是MSS < MTU,因此不需要了网络层的IP分片了。发生了分片丢失的时候,因为引入了MSS(即进行分段)那么源主机的TCP只需要重传丢失的那一块分片即可。
IPv4的分类
在讲解IP的分类的时候,我们先来了解一下IP地址的书写格式。每个IP地址长度为32比特(等价为4个字节),因为有2^32个可能的IP地址,即约有40亿个可能的IP地址。这些地址一般使用点分十进制记法书写,即地址中的每个字节(即8个比特为一个字节,分为4组)用它的十进制形式书写,各字节间以 **.(点)**隔开。
分类编址的IPv4地址
IP地址有5种类型,分别是A类地址、B类地址、C类地址、D类地址、E类地址。
而D类和E类地址是没有主机号的,所以不可用于主机IP,D类地址常用于多播,E类是预留的分类,暂时未使用。
无分类编制的IPv4地址
IP分类存在缺点:
①一个C类地址子网仅能容纳多达2 ^ 8 - 2 = 254台主机,这对于许多组织来说太少了
②一个B类地址子网可以支持多大2^16 - 2 = 65534台主机,包含的最大主机数量又太多。
因此推出了无分类编制的IP地址,也就是CIDR。即通过斜线记法书写IP地址,也就是在IPv4地址后面加上斜线"/",在斜线后面写上网络号所占的比特数。
表现形式为:a.b.c.d/x,其中前面x个比特是网络号,后面32 - x个比特是主机号。
通过这种形式,我们同样可以获取许多信息,例如可用地址个数等。
划分子网的IPv4地址
在了解划分子网之后,我们来看一下下面的例子,加深印象:
IPv6
在20实际90年代早期,因特网工程任务组就开始致力于开发一种替代IPv4的协议,该努力的最初动机是因为一下现实:由于新的子网和IP结点以惊人的增长率连到因特网上(并被分配唯一的IP地址),32比特的IP地址空间即将用尽。为了应对这种对大IP地址空间的需求,开发了一种新的IP协议,即IPv6。
IPv6的数据包格式:
IPv6地址的标识方法:
IPv4地址采用的是点分十进制来表示,由于IPv4的地址只有32个比特,所以每8个比特为一组,共4组,每组用对应的十进制标识,并且每组用点 . 隔开。
IPv6地址由128个比特,所以需要每16个比特为一组,每组用对应的十六进制来表示,共8组,并且每组用冒号 : 隔开.
IPv6的亮点
- IPv6可自动配置,即使没有DHCP服务器也可以实现自动分配IP地址,实现即插即用。(而IPv4则需要进行DHCP来给主机分配IP地址)
- IPv6去掉了首部检验和,所以不会像IPv4那样(因为TTL字段,和IPv6的跳限制相似)每跳过一台路由器就要重新计算首部检验和,从而大大提高了传输的性能。
- IPv6不允许中间路由器进行分片/重新组装,从而大大加快了IP的转发速度.
- IPv6具有更高的安全性.通过IPv6协议的安全机制,可对网络层的数据进行加密,对IP报文进行校验,这提高了数据的安全性。
对比IPv4与IPv6:
通过观察上图,我们可以发现,IPv6数据报的结构更加简单、更高效。
同时通过比对两者的数据报,我们可以发现IPv6数据报相对于IPv4数据报来说,缺少了分片/重新组装、首部检验和字段、选项.
- 分片/重新组装
IPv4不允许在中间路由器中进行重新组装,而是只能在源与目的地上执行重新组装,而可以在中间路由器中执行分片操作。但是IPv6不允许在中间路由器中进行分片与重新组装操作,只能在源与目的地执行分片/重新组装操作,如果路由器收到的IPv6数据报太大而不能转发到出链路上的话,那么路由器会丢掉数据包,并向发送方发送一个"分组太大"的ICMP差错报文。于是发送方能够使用较小长度的IP数据报重发数据。分片与重新组装是一个耗时的操作,将该功能从路由器中删除并放到端系统中,大大加快了网络中的IP转发速度。 - 首部检验和:
因为因特网的运输层和数据链路层协议执行了检验操作,所以IP设计者大概觉得在网络层中具有该功能实属多余,可以将其去除。所以IPv6去除首部检验和之后,那么不会像IPv4那样,因为IPv4的TTL字段(类似于IPv6的跳限制字段),所以必须在每台路由器中重新计算首部检验和,从而大大加快了网络中的IP转发速度。 - 选项
选项字段不再是标准IP首部的一部分,但它并没有消失,而是可能出现在IPv6首部中由“下一个首部”指定的位置上。IPv6删除选项字段使得IP首部成为定长的40字节。
网络地址转换NAT
假设我们之前的家庭,已经使用了一个IP地址块,那么作为用户,如果我们的设备一直增加,子网变大,需要把块地址变大,这时候明显出现了IPv4地址耗尽的问题,那么我们应该怎么解决呢?答案是通过网络地址转换(Network Address Translation,NAT)
值得注意的是,全球网中的主机不可以在收到局域网的数据报之前就像局域网发送数据报,因为并没有办法在NAT转换表中找到发送的数据报的目的ip地址对应的局域网ip地址,所以局域网没有办法接收数据报。
但是NAT会出现一个问题,如果在NAT转发表中由N个IP地址,而局域网中由超过N个的IP地址数量,这时候明显无法缓解IPv4地址耗尽的问题。所以推出了NAPT(网络地址与端口转换)。
NAPT(网络地址与端口转换):就是利用到了端口号。在NAT转换表中,把IP地址 + 端口号一起进行转换。上面的图中的NAT转发表就是将IP地址和端口号一起转换了。