网络层解析

个人博客传送门

网络层提供的服务

网络层的任务是将多个网络通过路由器互连成一个互连网络,让网络中的多台计算机可以互相通信。其中网络层最重要的协议是IP协议。在网络层需要实现数据报文的分片与组装、同时需要提供路由选择。IP层中使用的物理器件是路由器。

网络的特点是:向上提供简单灵活的、无连接的、尽最大努力交付的数据包服务。所传送的分组可能出错、丢失、重复和失序,同时也不保证分组交付的时限。但是这样做的话,就可以让路由器做的比较廉价。那么可靠性就需要网络中的主机传输层保证。

IP协议

IP协议是网络层中最重要的协议,跟IP协议搭配使用的协议还有三个:ARP(地址解析协议)、ICMP(网际控制报文协议)、IGMP(网际管理协议)。本来还有一个RARP(逆地址解析协议)但是现在已经被淘汰使用。

IP数据报头格式

  • 四位版本号:当前使用的IP协议的版本号,现在通用的是IPv4(4字节),还有IPv6(16字节)
  • 四位首部长度:每位代表32个比特位,所以字段可以最多可以表示60字节。最小是20字节,也就是(0101),这个是首部的固定长度。这里的区别是有没有选项。这里不进行数据的校验是因为IP报不保证可靠性,数据的正确由上层的传输层保证。
  • 八位区分服务:用来获得更好的服务,但是通常不使用。
  • 十六位总长度:总长度包括首部和数据。总长度为16位,所以最大长度为2^16-1=65535字节。但是实际上不会发送那么大。因为下层的数据链路层中有一个MTU(最大传送单元)。常用的以太网规定MTU的值是1500字节。如果超过了就会进行分片。分片的概念会在待会讲到。
  • 十六位标识符:这个是IP数据报的唯一id。这个id不是序号,他的作用是:当数据报被分片的时候,同一个数据报的小片部分都是使用同一个id,这样到达目的主机的网路层,就可以根据数据报的id进行组装。
  • 三位标志位:第一位保留,没有使用;第二位称为DF,如果DF=1,表示不能分片。此时如果IP数据报超过了MTU,只能被丢弃,因为不能分片,数据链路层没有办法接收;第三位称为MF,这个标志位只有DF=0的时候有意义,表示后面还有分片,最后一个分片的MF=0,表示分片的数据报中,当前是最后一个。
  • 十三位偏偏移:用于分片的时候,指定当前分片数据报在原来分组中的偏移位置。这个偏移位置以8个字节为偏移单位。见下图例子:

  • 八位生存期:跳数(TTL),指明数据报在网络中的生存时间。数据报每经过一个路由器,当前的TTL就减一,当TTL减为0的时候,数据报被丢弃。这样是防止数据报在网络中循环路由,从而影响网络。

  • 八位协议:协议字段。该字段用于指明数据报是使用了什么协议。用来传送到目的主机的时候,让IP层交付给传输层的哪一个协议处理。常见的协议和对应的协议字段值如下:

  • 十六位首部校验和:不使用CRC校验头部,而是简单的计算。如果计算认为错误就丢弃该数据报。
  • 三十二位源IP地址:发送端的IP地址
  • 三十二位目的IP地址:目的端的IP地址
  • 选项:大小从0到40字节。通常不使用。
  • 数据:传输的数据内容。经过传输层封装的数据报文。

IP地址的分类

IP地址是一个基本的概念。IP地址就是给因特网的每一个主机的每一个接口分配在全世界范围内的唯一一个32位标识符(IPv4版本)。通常IP地址分为五类。常用的是A、B、C三类。由图可知IP地址分为两个部分,前面部分是网路号,后面部分是主机号。

但是日常生活中,我们使用的IP地址是点分十进制的,计算机使用的是一个32为的二进制串。

我们看待IP地址一定要将网络号和主机号进行区分。下面针对A、B、C三类常用的IP地址进行分析。

  • A类地址的网络号占用1个字节,第一位已经固定为0。所以可以使用的网络号是126(2^7-2)。减二是因为网络号全0表示本网络,是一个保留地址;网络号是127(01111111)作为本地软件环回测试IP地址。该地址只在本网络中使用,不会将数据发送到任何网络。A类地址的主机号是3个字节,因此它的主机有2^24-2个。这里也需要减二,主机号全零表示这是一个网络地址。全一表示当前网络中的所有主机。
  • B类地址的网络号占两个字节,前两位为10已经固定。可以使用的网络号个数是2^14-1,因为128.0.0.0是不使用的。主机号中也是两个字节,其中全零和全一不分配,所以是2^16-2。
  • C类地址的网络号占三个字节,前面三个位是110,可以使用的网络号个数是2^21-1,最小的网络号是192.0.1.0。主机号有一个字节,全零和全一不使用,所以有2^8-2。

我们需要注意一下几点:

  • 每一IP地址都是网络号和主机号组成。这样子做的好处是:路由器只需要根据目的主机的网络号来进行转发分组,而不需要考虑主机号,这样可以让路由器更加高效并节省空间。
  • 当网络号不同的时候,两个IP地址就不属于同一个网络中,此时就需要路由器来连接,所以路由器至少连接了两个不同的IP地址。
  • 通过网桥或转发器连接的两台主机仍然是同一个网络中的主机。

IP地址和硬件地址

我们不能够将IP地址和MAC硬件地址混淆。IP地址是网路层的概念,由网络层及其以上的各层使用,是一个逻辑地址。MAC地址是数据链路层和物理层的概念。

在数据进行封装自上而下交付的时候,IP地址放在了IP数据报的首部,而MAC地址放在了MAC帧的首部,只有将MAC帧的首部和尾部剥去将数据交付给网路层,网络层才能在数据报中找到IP地址。

地址解析协议ARP

在实际应用的过程中,我们通常知道了一个主机或者路由器的IP地址,但是我们并不知道其对应的MAC地址。此时,我们就可以通过ARP协议,用目的IP地址得到MAC地址。从而可以将IP数据报封装为MAC帧在数据链路层中使用。ARP协议本是网络层的协议,但是它作用在数据帧上,所以也可以将其认为是数据链路层的协议。注意ARP适用于局域网内部,不同网络间的联通需要使用路由器。下面就结合图进行分析。

现在我们已知的是机器1的IP地址192.168.1.2,MAC地址是MAC1;机器2的IP地址是192.168.1.3,MAC地址是MAC2;现在我们想要用机器1给机器2发送消息。首先明白一点,机器1知道自己的IP地址,MAC地,和机器2的IP地址。但是我们在数据链路层上传输,还需要知道机器2的MAC地址。

  • 机器1封装了数据帧的时候,发现不知道机器2的MAC地址,所以就停止发送数据帧。
  • 转而发送一个ARP请求,ARP数据包的组成见图,其中MAC2的位置填入了全1,表示这是一个广播方式的数据包。
  • 当前局域网内的所以主机都会收到该数据包,主机收到之后检查数据包中的IP地址和自己的IP地址是否一致,如果一致就收下,不一致就丢弃。
  • 机器2收下ARP数据包之后,将数据包中的机器1的IP和MAC地址保存到ARP高速缓冲中,然后回应一个ARP应答,该应答中填入了自己MAC地址,并且这不是广播式的,直接发送到机器1。
  • 机器1收到ARP应答之后,将机器2的MAC地址保存到自己的ARP高速缓冲中,然后将机器2的MAC地址写入到数据帧中,进行发送。

每个主机的高速缓冲区中缓冲了大量的MAC地址,及其对应IP,这样可以节省时间。这个缓冲具有一定的身存时间,超过生存时间就将MAC地址从中删除。为什么要超时删除呢,因为DHCP技术,同一台机器的IP地址会不一样,所以长时间不使用的IP跟MAC的对应关系应该被删除。

ARP的动作是主动的,使用主机的用户不需要手动触发。每次机器重启的时候,会自动发起ARP请求,将同一个局域网中的主机的MAC地址跟IP的对应关系获取到。

IP地址和MAC地址都必须要么

我们都知道MAC地址可以是唯一存在的,每一个硬件设备都会有唯一的MAC地址,那么我们为什么不使用MAC地址进行标识主机,而要使用IP地址。在数据链路层中还要通过ARP协议获得IP地址和MAC地址的映射关系,似乎显得IP地址多余。

其实不难理解,MAC地址的作用只在于同一个数据链路中。IP地址就指向了源地址和目标地址。

主机A想要去主机B,如果只是用MAC地址的话根本没有办法实现,因为它需要通过路由器C。我们用MAC地址来获取下一路去哪里,用IP地址来指向我们最终需要去哪里。

同时,可能还有这样一个疑问,为什么我们要使用ARP协议获取到对应关系,我们通过MAC广播不也可以让路由器C获取到主机A的数据吗?如果MAC使用了广播,那么很明显路由器D也会受到这个广播,此时路由器D也会将消息转发给路由器C,这样就造成数据报重复发送了两次。

划分子网和构成超网

从今天看来,当初的IP的划分并不是很科学。第一,A类地址可以有超过1000万台主机,B类地址也可以有6万多台主机。但是通有些网络都不能将全部的主机接入网络。这样就导致了大量的浪费。第二,给每一个物理网络都分配一个网络号会导致路由器的工作变得庞大,同时也需要大量的内存进行保存IP的项目数。第三,两级IP地址不够灵活,如果一个单位需要立刻使用一个新的网络,在申请到新的网络地址之前,是不可能使用新的网络的。

所以为了解决这些问题,出现了一个新的划分方案:划分子网。所谓划分子网就是在当前的网络号之下进行扩展,让二级地址变成三级地址。这样就让网络管理变得更加灵活。后来为了更加好的利用资源,又提出了一种方案,叫做无分类编址CIDR(构成超网)。

  • 引入一个额外的子网掩码来区分网络号和主机号
  • 子网掩码也是一个32为的正整数,通常是一串”0”结尾
  • 将IP地址和子网掩码进行按位与操作就得到了网络号
  • 网络号和主机号的划分就与IP地址是A类、B类还是C类没有关系。

举例:

还有一种比较简洁的方法,例如140.252.20.68/24,表示IP地址为140.252.20.68,子网掩码的高24位是1,255.255.255.0

IP的数量限制

都是到IPv4是16位的,这样就意味着IP地址最多只有42亿个。但是IP地址又不是按照主机的数量来确定的,而是每有一个网卡都需要配置一个IP地址。这样就导致IP地址很快就要消耗完。

虽然通过CIDR的划分方式解决了不少的问题(提高了利用率)但是IP的上限还是没有增加,于是我们采用了下面几种方法解决问题:

  • 推广IPv6,IPv6是128位,这个意味着根本用不完
  • 动态分配IP地址技术:DHCP,只给接入网络的设备分配IP地址,这样同一个MAC地址的设备,每次接入互联网的IP都不一样
  • 网络地址转换(NAT技术):这个技术很大程度上解决了IP地址不够用的情况

私有IP地址和公网IP地址

在解释NAT技术之前,我们先了解一个私有IP地址和公网IP地址的概念。

私有IP地址就是在本局域网内进行通信的IP地址,这些地址不会被网络分配、路由,也就是不能直接用来跟网络连接。公网IP地址就是用来路由传输,在网络上进行通信的地址。

私有IP的地址范围如下:

  • A: 10.0.0.0~10.255.255.255 即10.0.0.0/8
  • B:172.16.0.0~172.31.255.255即172.16.0.0/12
  • C:192.168.0.0~192.168.255.255 即192.168.0.0/16

除了这些之外的IP地址都是公网IP。

NAT技术和NAPT技术

那么我们在局域网内使用私有IP,因为它不能在网络上传输,所以在每一个不同的局域网内就可以使用相同的IP,这样就大大节省了IP地址紧缺的问题。只有公网IP才是唯一的,当然在同一个局域网内的私有IP也不能重复。但是说好私有IP不能在网络上进行传输,那么我们使用私有IP的主机如何跟另一个局域网上的主机进行网络通信呢?这里就需要NAT技术和NAPT技术了。

NAT技术

NAT技术是用来将私有IP对外通信时转换为公有IP,它存在于NAT路由器上,因为路由器是分隔不同局域网的设备。它的工作机制如下:

  • 私有网络的客户端A想要跟公有网络的服务器进行通信
  • 在通过NAT路由器的时候,客户端A的IP从私有IP10.0.0.10转换为了公有IP202.244.174.37
  • 这里的转换是直接替换了IP首部的源地址
  • 反之服务器返回数据包的时候,NAT路由去将目标地址从公有IP202.244.174.37转换为客户端A的IP从私有IP10.0.0.10
  • 在NAT路由器的内部,有一张自动生成的用来转换地址的表,当10.0.0.10向服务器发送第一个包的时候,自动生成一张私有IP10.0.0.10跟公有IP202.244.174.37的映射关系。

NAPT技术

但是有一个问题,我们局域网内的客户端A和客户端B同时向服务器进行了数据通信。通过NAT技术之后,服务器返回的数据包的目的IP地址都是路由器上的202.244.174.37。那么此时,数据包应该交付给哪一个客户端主机呢?

我们可以通过NAPT技术解决这个问题。NAPT技术就是通过IP+port的方式,确定当前客户端的唯一主机。如下图,下图中的转换表也是由NAT路由器自动维护的,在TCP协议下,建立连接的时候,路由器会生成这个表,当连接断开的时候,这个表就会自动删除。

NAT技术的缺陷

因为NAT技术依赖于转换表,所以就会有如下的缺陷:

  • 无法从NAT的外部向内部建立连接
  • 转换表的生成和转换都会有一定的消耗
  • 通信过程中一旦NAT遇到了异常需要重启,所以的TCP连接都会重置,就算就进行热备也米有用。因为重启之后,IP地址会发生改变,映射关系出现错误。

为了解决上面的问题,我们有两种方式,第一种是推行IPv6,只要IP地址够了,就不存在使用NAT的问题。第二种是NAT穿越,通俗的说就是在NAT私有IP一边的应用为了生成NAT转换表,先发送一个虚拟的数据包,这个包只是为了生成转换表。这样转换表构建好了,NAT公网IP一端就可以向内部建立连接了。

网际控制报文ICMP

ICMP的出现是为了更有效的转发IP数据报和提高交付成功的机会,该协议允许主机或路由器报告差错情况和提供有关异常情况的报告。当我们新搭建好一个网络之后,通常需要检测一下网络是否畅通,但是IP协议不具有可靠性,所以就可以使用ICMP来实现这个功能。ICMP主要功能如下:

  • 确认IP包是否成功到达目标地址
  • 通知在发送过程中IP包丢失的原因
  • ICMP是针对于IPv4使用的,不能用于IPv6

ICMP是网络层的协议,但是它的位置在IP数据报的数据部分,不在报头处。

ICMP的分类

一共有两类:ICMP差错报告报文减和ICMP询问报文。

差错报告报文类型:1、终点不可达;2、源点抑制:网络拥塞,发送数据速度需要减慢;3、时间超过:TTL减为0;4、参数问题:报头数据错误;5、改变路由:路由器改变了路由表

**询问报文类型:**1、回送请求和回答:测试目的主机是否可达,并且可以获得主机的有关状态。经典的例子是PING命令的使用。2、时间戳请求和回答:获取主机回答的当前时间

ICMP的应用举例

PING命令:ping命令用来测试主机之间的连通性,使用的是ICMP的回送请求和回答类型。ping命令还会返回响应时间和TTL。

traceroute命令:该命令可以答应出可执行程序主机到目标主机所经过的路由器

参考资料

  • 计算机网络第五版
  • 图解TCP/IP

你可能感兴趣的:(Linux,网络)