IP详解

简介

IP(Internet Protocol)的作用是在复杂的网络环境中将数据包发送给最终目的主机。其与MAC(数据链路路)的区别如下:IP的作用是主机之间通信用的,而MAC的作用则是实现「直连」的两个设备之间通信,而IP则负责在「没有直连」的两个网络之间进行通信传输。


IP地址基础

在TCP/IP 网络通信时,为了保证能正常通信,每个设备都需要配置正确的IP地址,否则无法实现正常的通信。

IPv4

IP地址(IPv4地址)由 32位正整数来表示,IP地址在计算机是以二进制的方式处理的。而人类为了方便记忆采用了点分十进制的标记方式,也就是将32位IP地址以每8位为组,共分为4组,每组以「.」隔开,再将每组转换成十进制。

IPv6

IPv4的地址是32位的,大约可以提供42亿个地址,但是早在2011年IPv4地址就已经被分配完了。IPv6的地址是128位的,这可分配的地址数量是大的惊人。

  • IPv4地址长度共32位,是以每8位作为一组,并用点分十进制的表示方式。
  • IPv6地址长度是128位,是以每16位作为一组,每组用冒号:隔开。

广播地址

广播地址用于在同一个链路中相互连接的主机之间发送数据包。

当主机号全为1时,就表示该网络的广播地址。例如把172.20.0.0/16用二进制表示如下: 10101100.00010100.00000000.00000000 将这个地址的主机部分全部改为1,则形成广播地址: 10101100.00010100.11111111.11111111 再将这个地址用十进制表示,则为172.20.255.255 。 广播地址可以分为本地广播和直接广播两种:

  • 在本网络内广播的叫做本地广播。例如网络地址为192.168.0.0/24的情况下,广播地址是 192.168.0.255。因为这个广播地址的IP包会被路由器屏蔽,所以不会到达192.168,0.0/24以外的其他链路上。
  • 在不同网络之间的广播叫做直接广播。例如网络地址为192.168.0.0/24的主机向192.168.1.255/24的目标地址发送IP包。收到这个包的路由器,将数据转发给192.168.1.0/24,从而使得所有192.168.1.1~192.168.1.254的主机都能收到这个包(由于直接广播有一定的安全问题,多数情况下会在路由器上设置为不转发。

IP地址的分类

互联网诞生之初,IP地址显得很充裕,于是计算机科学家们设计了分类地址。IP地址分类成了5种类型,分别是A类、B类、C类、D类、E类。其中对于A、B、C类主要分为两个部分,分别是网络号和主机号

image-20210822234439207
image-20210822234439207

最大主机个数,就是要看主机号的位数,ABC三类的最大主机数如下:

类别 IP地址 最大主机数
A 0.0.0.0~127.255.255.255 16777214
B 128.0.0.0~191.255.255.255 65534
C 192.0.0.0~223.255.255.255 254

在IP地址中,有两个IP是特殊的,分别是主机号全为1和全为0地址,所以占用两个IP,最大主机数要减二:

  • 主机号全为1指定某个网络下的所有主机,用于广播
  • 主机号全为0指定某个网络

而D类和E类地址是没有主机号的,所以不可用于主机 IP,D类常被用于多播(多播⽤用于将包发送给特定组内的所有主机),E类是预留的分类,暂时未使用。

IP分类的优点

不管是路由器还是主机解析到一个IP地址时候,我们判断其IP地址的首位是否为0,为0则为A类地址,那么就能很快的找出网络地址和主机地址。

image-20210822235735548
image-20210822235735548

IP分类的缺点

缺点一: 同一网络下没有地址层次,比如一个公司里用了B类地址,但是可能需要根据生产环境、测试环境、开发环境来划分地址层次,而这种IP分类是没有地址层次划分的功能,所以这就缺少地址的灵活性。 缺点二: A、B、C类有个尴尬处境,就是不能很好的与现实网络匹配。

  • C类地址能包含的最大主机数量实在太少了,只有254个,估计一个网吧都不够用。
  • 而B类地址能包含的最大主机数量又太多了,6万多台机器放在一个网络下面,一般的企业基本达不到这个规模,闲着的地址就是浪费。

这两个缺点,都可以用CIDR(Classless Inter-Domain Routing)无分类地址解决。

无分类地址CIDR

由于IP分类存在许多缺点,所以后面提出了无分类地址的方案,即CIDR 。这种方式不再有分类地址的概念,32比特的IP地址被划分为两部分,前面是网络号,后面是主机号。表示形式a.b.c.d/x ,其中 /x表示前×位属于网络号,x的范围是0~32,这就使得IP地址更加具有灵活性。比如10.100.122.2/24,这种地址表示形式就是 CIDR,/24表示前24位是网络号,剩余的8位是主机号。

image-20210823000245250
image-20210823000245250

子网掩码

子网掩码也是一种划分网络号和主机号的方式。掩码可用于掩盖掉主机号,剩下的就是网络号。(将子网掩码和IP地址按位计算AND,就可得到网络号

image-20210823223237596
image-20210823223237596

子网掩码除了划分主机和网络地址外,还可以划分子网。

公有和私有地址

在A、B、C分类地址,实际上有分公有IP地址和私有IP地址。平时我们办公室、家里、学校用的IP地址,一般都是私有IP地址。因为这些地址允许组织内部的IT人员自己管理、自己分配,而且可以重复。

image-20210823223819995
image-20210823223819995

IP地址和路由控制

IP地址的网络地址这一部分是用于进行路由控制。路由控制表中记录着网络地址与下一步应该发送至路由器的地址。在主机和路由器上都会有各自的路由器控制表。在发送IP包时,首先要确定IP包首部中的目标地址,再从路由控制表中找到与该地址具有相同网络地址的记录,根据该记录将IP包转发给相应的下一个路由器。如果路由控制表中存在多条相同网络地址的记录,就选择相同位数最多的网络地址,也就是最长匹配。

计算机使用一个特殊的IP地址127.0.0.1作为环回地址。与该地址具有相同意义的是一个叫做localhost的主机名。使用这个IP或主机名时,数据包不会流向网络。

IP相关

DNS解析

我们在上网的时候,通常使用的方式是域名,而不是IP地址,因为域名方便人类记忆。那么实现这一技术的就是 DNS域名解析,DNS可以将域名网址自动转换为具体的IP地址。在域名中,越靠右的位置表示其层级越高。

DNS解析工作流程

浏览器首先看一下自己的缓存里有没有,如果没有就向操作系统的缓存要,还没有就检查本机域名解析文件 hosts ,如果还是没有,就会DNS 服务器进行查询,查询的过程如下:

image-20210823224853359
image-20210823224853359

ARP协议

在传输一个IP数据报的时候,确定了源IP地址和目标IP地址后,就会通过主机「路由表」确定IP数据包下一跳。然而,网络层的下一层是数据链路层,所以我们还要知道「下一跳」的MAC地址。由于主机的路由表中可以找到下一跳的IP地址,所以可以通过ARP协议,求得下一跳的MAC地址。简单地说,ARP是借助ARP请求与 ARP响应两种类型的包确定 MAC地址的。

  • 主机会通过广播发送ARP请求,这个包中包含了想要知道的MAC地址的主机IP地址。

  • 当同个链路中的所有设备收到ARP请求时,会去拆开ARP请求包里的内容,如果 ARP请求包中的目标IP地址与自己的IP地址一致,那么这个设备就将自己的MAC地址塞入ARP响应包返回给主机。

操作系统通常会把第一次通过ARP获取的MAC地址缓存起来,以便下次直接从缓存中找到对应IP地址的 MAC地址。不过,MAC地址的缓存是有一定期限的,超过这个期限,缓存的内容将被清除。

ARP协议是已知IP地址求MAC地址,那 RARP 协议正好相反,它是已知MAC地址求IP地址。例如将打印机服务器等小型嵌入式设备接入到网络时就经常会用得到。

通常这需要架设一台RARP服务器,在这个服务器上注册设备的MAC地址及其IP地址。然后再将这个设备接入到网络,接着:

  • 该设备会发送一条「我的MAC地址是XXXX,请告诉我,我的IP地址应该是什么」的请求信息。

  • RARP服务器接到这个消息后返回「MAC地址为XXXX的设备,IP地址为XXXX」的信息给这个设备。

最后,设备就根据从RARP 服务器所收到的应答信息设置自己的IP地址。

DHCP

DHCP 在生活中我们是很常见的了,我们的电脑通常都是通过DHCP 动态获取IP地址,大大省去了配IP信息繁琐的过程。 DHCP客户端进程监听的是68端口号,DHCP服务端进程监听的是67端口号。

  • 客户端首先发起DHCP 发现报文(DHCP DISCOVER)的IP数据报,由于客户端没有IP地址,也不知道DHCP服务器的地址,所以使用的是UDP广播通信,其使用的广播目的地址是 255.255.255.255(端口67)并且使用0.0.0.0(端口68)作为源IP地址。DHCP 客户端将该IP数据报传递给链路层,链路层然后将帧广播到所有的网络中设备。
  • DHCP服务器收到DHCP发现报文时,用 DHCP提供报文(DHCP OFFER)向客户端做出响应。该报文仍然使用IP广播地址255.255.255.255,该报文信息携带服务器提供可租约的Il地址、子网掩码、默认网关、DNS 服务器以及IP地址租用期。
  • 客户端收到一个或多个服务器的DHCP提供报文后,从中选择一个服务器,并向选中的服务器发送DHCP请求报文(DHCP REQUEST)进行响应,回显配置的参数。
  • 最后,服务端用 DHCP ACK报文对DHCP请求报文进行响应,应答所要求的参数。

一旦客户端收到DHCP ACK后,交互便完成了,并且客户端能够在租用期内使用DHCP 服务器分配的IP地址。 如果租约的 DHCP IP地址快期后,客户端会向服务器发送 DHCP请求报文:

  • 服务器如果同意继续租用,则用DHCP ACK报文进行应答,客户端就会延长租期。
  • 服务器如果不同意继续租用,则用DHCP NACK报文,客户端就要停止使用租约的IP地址。

DHCP交互中,全程都是使用UDP广播通信。

为了解决服务器和客户端不在同一个局域网内无法广播这一问题,就出现了DHCP 中继代理。有了DHCP中继代理以后,对不同网段的IP地址分配也可以由一个DHCP服务器统一进行管理。

NAT

IPv4的地址是非常紧缺的,在前面我们也提到可以通过无分类地址来减缓IPv4地址耗尽的速度,但是互联网的用户增速是非常惊人的,所以IPv4地址依然有被耗尽的危险。于是,提出了一种网络地址转换NAT的方法,再次缓解了IPv4地址耗尽的问题。

由于绝大多数的网络应用都是使用传输层协议TCP或UDP来传输数据的。因此,可以把P地址+端口号一起进行转换。这样,就用一个全球IP地址就可以了,这种转换技术就叫网络地址与端口转换NAPT

图中有两个客户端192.168.1.10和192.168.1.11同时与服务器183.232.231.172进行通信,并且这两个客户端的本地端口都是1025。此时,两个私有IP地址都转换IP地址为公有地址120.229.176.121,但是以不同的端口号作为区分。 于是,生成一个NAPT路由器的转换表,就可以正确地转换地址跟端口的组合,令客户端A、B能同时与服务器之间进行通信。这种转换表在NAT路由器上自动生成。例如,在TCP的情况下,建立TCP连接首次握手时的SYN包一经发出,就会生成这个表。而后又随着收到关闭连接时发出FIN包的确认应答从表中被删除。

image-20210823231020092
image-20210823231020092

NAT的缺点

由于NAT/NAPT都依赖于自己的转换表,因此会有以下的问题:

  • 外部无法主动与NAT内部服务器建立连接,因为 NAPT转换表没有转换记录。
  • 转换表的生成与转换操作都会产生性能开销。

  • 通信过程中,如果NAT路由器重启了,所有的 TCP连接都将被重置。

解决方式

第一种就是改用IPv6 IPv6可用范围非常大,以至于每台设备都可以配置一个公有IP地址,就不搞那么多花里胡哨的地址转换了,但是IPv6普及速度还需要一些时间。 第二种NAT 穿透技术 NAT穿透技术拥有这样的功能,它能够让网络应用程序主动发现自己位于NAT设备之后,并且会主动获得NAT设备的公有P,并为自己建立端口映射条目,注意这些都是NAT设备后的应用程序自动完成的。也就是说,在NAT穿透技术中,NAT设备后的应用程序处于主动地位,它已经明确地知道NAT设备要修改它外发的数据包,于是它主动配合NAT 设备的操作,主动地建立好映射,这样就不像以前由NAT设备来建立映射了。说人话,就是客户端主动从NAT设备获取公有IP地址,然后自己建立端映射条目,然后用这个条目对外通信,就不需要NAT设备来进行转换了。

ICMP

ICMP(Internet Control Message Protocol)是互联网控制报文协议。

ICMP主要的功能包括:确认IP包是否成功送达目标地址、报告发送过程中I包被废弃的原因和改善网络设置等。

在IP通信中如果某个IP包因为某种原因未能达到目标地址,那么这个具体的原因将由ICMP 负责通知。

ICMP大致可以分为两大类:

  • 一类是用于诊断的查询消息,也就是「查询报文类型」
  • 另一类是通知出错原因的错误消息,也就是「差错报文类型」
image-20210823231945110
image-20210823231945110

IGMP

在前面我们知道了组播地址,也就是D类地址,既然是组播,那就说明是只有一组的主机能收到数据包,不在一组的主机不能收到数据包,怎么管理是否是在一组呢?那么,就需要IGMP协议了。ICMP跟IGMP是一点关系都没有的