个人博客传送门
网络层的任务是将多个网络通过路由器互连成一个互连网络,让网络中的多台计算机可以互相通信。其中网络层最重要的协议是IP协议。在网络层需要实现数据报文的分片与组装、同时需要提供路由选择。IP层中使用的物理器件是路由器。
网络的特点是:向上提供简单灵活的、无连接的、尽最大努力交付的数据包服务。所传送的分组可能出错、丢失、重复和失序,同时也不保证分组交付的时限。但是这样做的话,就可以让路由器做的比较廉价。那么可靠性就需要网络中的主机传输层保证。
IP协议是网络层中最重要的协议,跟IP协议搭配使用的协议还有三个:ARP(地址解析协议)、ICMP(网际控制报文协议)、IGMP(网际管理协议)。本来还有一个RARP(逆地址解析协议)但是现在已经被淘汰使用。
十三位偏偏移:用于分片的时候,指定当前分片数据报在原来分组中的偏移位置。这个偏移位置以8个字节为偏移单位。见下图例子:
八位生存期:跳数(TTL),指明数据报在网络中的生存时间。数据报每经过一个路由器,当前的TTL就减一,当TTL减为0的时候,数据报被丢弃。这样是防止数据报在网络中循环路由,从而影响网络。
IP地址是一个基本的概念。IP地址就是给因特网的每一个主机的每一个接口分配在全世界范围内的唯一一个32位标识符(IPv4版本)。通常IP地址分为五类。常用的是A、B、C三类。由图可知IP地址分为两个部分,前面部分是网路号,后面部分是主机号。
但是日常生活中,我们使用的IP地址是点分十进制的,计算机使用的是一个32为的二进制串。
我们看待IP地址一定要将网络号和主机号进行区分。下面针对A、B、C三类常用的IP地址进行分析。
我们需要注意一下几点:
我们不能够将IP地址和MAC硬件地址混淆。IP地址是网路层的概念,由网络层及其以上的各层使用,是一个逻辑地址。MAC地址是数据链路层和物理层的概念。
在数据进行封装自上而下交付的时候,IP地址放在了IP数据报的首部,而MAC地址放在了MAC帧的首部,只有将MAC帧的首部和尾部剥去将数据交付给网路层,网络层才能在数据报中找到IP地址。
在实际应用的过程中,我们通常知道了一个主机或者路由器的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地址。
每个主机的高速缓冲区中缓冲了大量的MAC地址,及其对应IP,这样可以节省时间。这个缓冲具有一定的身存时间,超过生存时间就将MAC地址从中删除。为什么要超时删除呢,因为DHCP技术,同一台机器的IP地址会不一样,所以长时间不使用的IP跟MAC的对应关系应该被删除。
ARP的动作是主动的,使用主机的用户不需要手动触发。每次机器重启的时候,会自动发起ARP请求,将同一个局域网中的主机的MAC地址跟IP的对应关系获取到。
我们都知道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(构成超网)。
举例:
还有一种比较简洁的方法,例如140.252.20.68/24,表示IP地址为140.252.20.68,子网掩码的高24位是1,255.255.255.0
都是到IPv4是16位的,这样就意味着IP地址最多只有42亿个。但是IP地址又不是按照主机的数量来确定的,而是每有一个网卡都需要配置一个IP地址。这样就导致IP地址很快就要消耗完。
虽然通过CIDR的划分方式解决了不少的问题(提高了利用率)但是IP的上限还是没有增加,于是我们采用了下面几种方法解决问题:
在解释NAT技术之前,我们先了解一个私有IP地址和公网IP地址的概念。
私有IP地址就是在本局域网内进行通信的IP地址,这些地址不会被网络分配、路由,也就是不能直接用来跟网络连接。公网IP地址就是用来路由传输,在网络上进行通信的地址。
私有IP的地址范围如下:
除了这些之外的IP地址都是公网IP。
那么我们在局域网内使用私有IP,因为它不能在网络上传输,所以在每一个不同的局域网内就可以使用相同的IP,这样就大大节省了IP地址紧缺的问题。只有公网IP才是唯一的,当然在同一个局域网内的私有IP也不能重复。但是说好私有IP不能在网络上进行传输,那么我们使用私有IP的主机如何跟另一个局域网上的主机进行网络通信呢?这里就需要NAT技术和NAPT技术了。
NAT技术
NAT技术是用来将私有IP对外通信时转换为公有IP,它存在于NAT路由器上,因为路由器是分隔不同局域网的设备。它的工作机制如下:
NAPT技术
但是有一个问题,我们局域网内的客户端A和客户端B同时向服务器进行了数据通信。通过NAT技术之后,服务器返回的数据包的目的IP地址都是路由器上的202.244.174.37。那么此时,数据包应该交付给哪一个客户端主机呢?
我们可以通过NAPT技术解决这个问题。NAPT技术就是通过IP+port的方式,确定当前客户端的唯一主机。如下图,下图中的转换表也是由NAT路由器自动维护的,在TCP协议下,建立连接的时候,路由器会生成这个表,当连接断开的时候,这个表就会自动删除。
因为NAT技术依赖于转换表,所以就会有如下的缺陷:
为了解决上面的问题,我们有两种方式,第一种是推行IPv6,只要IP地址够了,就不存在使用NAT的问题。第二种是NAT穿越,通俗的说就是在NAT私有IP一边的应用为了生成NAT转换表,先发送一个虚拟的数据包,这个包只是为了生成转换表。这样转换表构建好了,NAT公网IP一端就可以向内部建立连接了。
ICMP的出现是为了更有效的转发IP数据报和提高交付成功的机会,该协议允许主机或路由器报告差错情况和提供有关异常情况的报告。当我们新搭建好一个网络之后,通常需要检测一下网络是否畅通,但是IP协议不具有可靠性,所以就可以使用ICMP来实现这个功能。ICMP主要功能如下:
ICMP是网络层的协议,但是它的位置在IP数据报的数据部分,不在报头处。
一共有两类:ICMP差错报告报文减和ICMP询问报文。
差错报告报文类型:1、终点不可达;2、源点抑制:网络拥塞,发送数据速度需要减慢;3、时间超过:TTL减为0;4、参数问题:报头数据错误;5、改变路由:路由器改变了路由表
**询问报文类型:**1、回送请求和回答:测试目的主机是否可达,并且可以获得主机的有关状态。经典的例子是PING命令的使用。2、时间戳请求和回答:获取主机回答的当前时间
ICMP的应用举例
PING命令:ping命令用来测试主机之间的连通性,使用的是ICMP的回送请求和回答类型。ping命令还会返回响应时间和TTL。
traceroute命令:该命令可以答应出可执行程序主机到目标主机所经过的路由器