Java教程

别再恐惧 IP 协议(万字长文 | 多图预警)

本文主要是介绍别再恐惧 IP 协议(万字长文 | 多图预警),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

对我个人来说,本科的时候,除去计算机组成原理,计算机网络堪称复习难度最大的一门课,其中无穷无尽的 IP 地址的计算、子网划分、路由转发简直就是梦靥。现在回过头来再看,其实真的不难,只不过是当时的知识体系实在太乱。

 

???? 尽人事,听天命。博主东南大学硕士在读,热爱健身和篮球,乐于分享技术相关的所见所得,关注公众号 @ 飞天小牛肉,第一时间获取文章更新,成长的路上我们一起进步

???? 本文已收录于 「CS-Wiki」Gitee 官方推荐项目,现已累计 1.5k+ star,致力打造完善的后端知识体系,在技术的路上少走弯路,欢迎各位小伙伴前来交流学习

???? 如果各位小伙伴春招秋招没有拿得出手的项目的话,可以参考我写的一个项目「开源社区系统 Echo」Gitee 官方推荐项目,目前已累计 330+ star,基于 SpringBoot + MyBatis + MySQL + Redis + Kafka + Elasticsearch + Spring Security + ... 并提供详细的开发文档和配套教程。公众号后台回复 Echo 可以获取配套教程,目前尚在更新中

0. 前言

对我个人来说,本科的时候,除去计算机组成原理,计算机网络堪称复习难度最大的一门课,其中无穷无尽的 IP 地址的计算、子网划分、路由转发简直就是梦靥。现在回过头来再看,其实真的不难,只不过是当时的知识体系实在太乱。???? 本篇耗时长达十几个小时,呕心沥血,相信大家看完必定有所收获。

???? 计算机网络的细碎知识点真的是越扣越多......,本文主要讲解 IP 协议相关的重要知识点,一些相对来说比较冷门的就不再说了

1. 从网络层说起

众所周知,IP 协议属于网络层,回顾一下之前文章 一文读懂两台计算机之间是如何通信的 所说的,网络层的作用:

在计算机网络中进行通信的两个计算机之间可能会经过很多个数据链路,也可能还要经过很多通信子网。网络层的任务就是选择合适的网间路由和交换结点, 确保数据及时传送

通俗点来说吧,数据链路层的作用很简单,它是无脑的,只负责在两个相邻节点之间传送数据,它并不知道它所传送的数据最终目的地是哪。而网络层便是它的大脑,网络层负责指定源地址和目的地址,并告诉数据链路层该走哪条路线。下面这张图可以说是非常形象了 ????:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

运输层交付给网络层的数据格式是 TCP/UDP 报文段,那么网络层会将这些报文封装成 IP 数据报交付给数据链路层。在之前的文章中我们说过,每个数据链路上会规定一个最大传输单元 MTU,如果 IP 数据报的长度超过 MTU,那么网络层就会把这些报文分割成一个一个的小组(分组)进行传送。数据链路层收到 IP 数据报之后将其封装成帧。

为什么网络层的传输单元(协议单元)称为 IP 数据报呢?那是因为在 TCP/IP 体系结构中,网络层使用 IP 协议,因此称为 IP 数据报 ,简称数据报。下面我们就来详细讲解 IP 协议 ????

2. 什么是 IP 协议

IP 协议是整个 TCP/IP 协议族的核心,也是构成互联网的基础,位于 TCP/IP 模型的网络层。

IP 协议用于屏蔽下层物理网络的差异,为上层提供统一的 IP 数据报

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

⭐ IP 协议提供无连接的、不可靠的、尽力的数据报投递服务:

  • 1)无连接的投递服务

    发送端可于任何时候自由发送数据,而接收端永远不知道自己会在何时从哪里接收到数据。每个 IP 数据报独立处理和传输, 一台主机发出的数据报序列,可能会走不同的路径, 甚至有可能其中的一部分数据报会在传输过程中丢失

  • 2)不可靠的投递服务

    IP 协议本身不保证 IP 数据报投递的结果。 在传输的过程中,IP 数据报可能会丢失、重复、延迟和乱序等, IP 协议不对内容作任何检测,也不将这些结果通知收发双方

    IP 数据报的丢失,通过路由器发 ICMP 报文 告知(后续文章会详细讲解 ICMP 协议,敬请期待); 必要时,由高层实体(如 TCP)负责差错恢复动作

  • 3)尽力投递服务

    每个数据链路上会规定一个最大传输单元 MTU,如果 IP 数据报的长度超过 MTU,那么网络层就会把这些报文分割成一个一个的小组(分组)进行传送,以适应具体的传输网络

3. IP 协议的重要内容:IP 地址

① IP 地址初探

IP 地址是 IP 协议中非常重要的内容,IP 数据报中含有收/发方的 IP 地址。 那么什么是 IP 地址呢?

那就是给因特网上的每台设备都规定了其全世界唯一的地址,叫做 “IP 地址”,正是由于有了 IP 地址,才保证了用户在连网的计算机上操作时,能够高效而且方便地从千千万万台计算机中选出自己所需的对象来。

IP 地址就好像电话号码(地址码):有了某人的电话号码,你就能与他通话了。同样,有了某台主机的 IP 地址,你就能与这台主机通信了。

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

按照 TCP/IP 协议规定,IP 地址用二进制来表示,每个 IP 地址长 32 比特,也就是 4 个字节(这里说的是 IPV4 地址长 32 比特 / 4 字节,而 IPV6 地址占 128 比特 / 16 字节)。那么,IPV4 地址的最大值就是 ,也就是说:最多给大约 43 亿台接入互联网的设备配置其独一无二的 IPV4 地址。

一个采用二进制形式的 IP 地址是一串很长的数字,人们处理起来也太费劲了。为了方便人们的使用,IP 地址习惯性地被写成十进制的形式,使用 “.” 分开不同的字节。这种表示法叫做点分十进制表示法,这显然比一连串二进制地 1 和 0 容易记忆得多。举个例子:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

 

② IP 地址和 MAC 地址

???? 可能有些小伙伴会以为,一台计算机只能有一个 IP 地址,这种观点是错误的。实际上,IP 地址并不是根据主机台数来配置的,而是根据网卡(网络适配器)来的。像服务器、路由器等设备都是有 2 个以上的网卡,也就是它们会有 2 个以上的 IP 地址。

说到这里,不知大家有没有想起我们之前说的 MAC 地址,没错,MAC 地址(链路层地址)也是根据网卡来配置的,一台主机拥有多少个网卡就有多少个 MAC 地址。

那么,既然有了 MAC 地址用来唯一标识这台计算机了,那还需要 IP 地址干啥?回答这个问题只需要我们回到本文的第一幅图:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

  • 网络层指定了从哪个主机(「源 IP 地址」)发送到哪个主机(「目的 IP 地址」)。源 IP 地址和目标 IP 地址在传输过程中是不会变化的

  • 而数据链路层则是根据 MAC 地址在一个接一个的区间中进行传输的,每个区间内的出发地址即「源 MAC 地址」,每个区间内的目的地址即「目的 MAC 地址」。显然,随着数据的传输,源 MAC 地址和目的 MAC 地址会不断的发生变化

    比如上图,网络层告知了 1-2-3 路线,那么数据链路层就会根据 MAC 地址依次找到 1、2、3,并在他们之间传输数据。

???? 这么说吧,举个形象点的例子:我们把数据链路层当成乘坐高铁从苏州到南京,再在南京转乘到北京,再在北京转乘到西藏的旅客,那么网络层就相当于每个车站的工作人员,在数据链路层每次转乘时,网络层为其购买了一张标有下一个 MAC 地址的车票。因此,即使旅客(数据链路层)不知道其最终目的地也没有关系,工作人员(网络层)会给你做出指引。

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

而实际上,网络层做出指引的过程,我们将其称为路由控制 (下文会详细讲解)

④ IP 地址的分类

互联网诞生之初,32 位的 IP 地址(也就是 IPV4 地址)显得很充裕,于是大佬们对这些看似庞大的 IP 地址进行了分类:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

上图中我们可以看到,A 类 IP 地址的首位是 0,B 类 IP 地址的前几位是 10,C 类 IP 地址的前几位是 110......,我们将这些称之为分类号,用于区分 IP 地址的类别。

其中,A、B、C 类地址主要分为网络号和主机号两个部分:

  • 什么是网络号:网络号表示其属于互联网的哪一个网络

  • 什么是主机号:主机号表示其属于该网络中的哪一台主机

大 ???? 可能有这个疑问:为什么要分离网络号和主机号

因为两台计算机要通讯,首先要判断是否处于同一个广播域内,即网络地址(网络号)是否相同:

  • 如果网络地址相同,表明接受方在本网络上(本地网络主机),那么可以把数据包直接发送到目标主机,无需转发给其他的网络

  • 网络号不相同的主机称之为远程网络主机,远程网络中的主机要相互通信必须通过本地网关(Gateway)来传递转发数据

路由器寻址工作中,也就是通过这样的方式来找到对应的网络号的,进而把数据包转发给对应的网络内。

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

???? IP 地址分类的优点显而易见,不管是路由器还是主机解析到一个 IP 地址时候,可以很快的找出网络地址和主机地址:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

???? A、B、C 类地址对应的地址范围和最大主机个数如下:

网络类别第一个可用的网络号最后一个可用的网络号每个网络中的最大主机数
A1126
B128.1191.255
C192.0.1223.255.255

OK,看完上表大家必定有很多疑惑,下面一一为大家解答:

❓ 1)第一个可用的网络号如何计算出来的?很简单,网络号全为 0 即可,看下图,以 B 类地址为例:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

由上图,B 类地址的第一个可用的网络号应该是 128.0 啊,为什么是 128.1 呢?

???? 其实这是一个历史问题,RFC 791 中说:A value of zero in the network field means this network. 即网络号全 0 代表本网络。因此真正可用的网络号应该是从 1 开始。

所以,B 类地址的第一个可用的网络号就是 128.1

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

A 类和 C 类地址同理,这里我就不再画图了。

不过实际上 128.0.0.1-128.0.0.255 这段地址已经有明确的归属,国家是 NL。而 128.0.1.0/24 这段同样也分掉了,国家是 RO。而 192.0.0.1 这个地址查出来是没有被分配的。在 RFC 3330 中里有关于这两段地址的明确说明:

128.0.0.0/16 - This block, corresponding to the numerically lowest of
the former Class B addresses, was initially and is still reserved by
the IANA. Given the present classless nature of the IP address
space, the basis for the reservation no longer applies and addresses
in this block are subject to future allocation to a Regional Internet
Registry for assignment in the normal manner.
192.0.0.0/24 - This block, corresponding to the numerically lowest of
the former Class C addresses, was initially and is still reserved by
the IANA. Given the present classless nature of the IP address
space, the basis for the reservation no longer applies and addresses
in this block are subject to future allocation to a Regional Internet
Registry for assignment in the normal manner.

这个 RFC 发表于 2002 年,对于这两段地址明确表示因为无类地址空间的原因,不再需要保留,地址将在今后进行分配。

❓ 2)最后一个可用的网络号如何计算出来的?同理,网络号全为 1 即可,看下图,以 B 类地址为例:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

❓ 3)每个网络中的最大主机数为什么都要减 2 呢?

首先我们要明白,计算网络中的最大主机数就是要看主机号的位数,比如 B 类地址的主机号占 8 位,那么 B 类地址的最大主机个数就是 个。为什么要减 2 呢?

⭐ 那是因为主机号全为 0 和主机号全为 1 的这两个 IP 地址是特殊的,在主机号的分配过程中,应该去掉这两种情况

  • 第一种情况:主机号全为 1 指定某个网络下的所有主机,用于广播

    watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

  • 第二种情况:主机号全为 0 指定某个网络

    watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

④ IP 单播/广播/多播

Ⅰ IP 广播

上文中我们提到了主机号全为 1 指定某个网络下的所有主机,用于广播,那么什么是广播呢?

广播地址用于在同一个链路中相互连接的主机之间发送数据包,即一个发送方对应多个接收方。接收方在接收到数据包之后,可以根据自己的需要选择接收还是丢弃。

???? 比如说学校的广播通知哪几个同学来办公室,那么虽然所有同学都接收到了这条消息,但是不需要去办公室的同学就不必理会

当主机号全为 1 时,就表示该网络的广播地址。例如把 172.20.0.0/16 用二进制表示如下:

10101100.00010100.00000000.00000000

将这个地址的主机部分全部改为 1,则形成广播地址:

10101100.00010100.11111111.11111111

再将这个地址用十进制表示,则为 172.20.255.255

广播地址可以分为本地广播和直接广播两种:

1)在本网络内广播的叫做本地广播。例如网络地址为 192.168.0.0/24 的情况下,广播地址是 192.168.0.255。因为这个广播地址的 IP 包会被路由器屏蔽(即路由器不转发该广播包,广播包无法穿透路由器),所以不会到达 192.168.0.0/24 以外的其他链路上。

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

2)在不同网络之间的广播叫做直接广播。例如网络地址为 192.168.0.0/24 的主机向 192.168.1.255/24 的目标地址发送 IP 包。收到这个包的路由器,将数据转发给 192.168.1.0/24,从而使得所有 192.168.1.1 ~ 192.168.1.254 的主机都能收到这个包。

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

???? 由于直接广播有一定的安全问题,多数情况下会在路由器上设置为不转发广播包,即本地广播,广播包无法穿透路由

Ⅰ IP 单播

广播模式下,有一个发送方,多个接收方,而在单播模式下,只有一个发送方和一个接收方。单播是可以穿透路由器的,也即路由器会对数据包其进行转发:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

Ⅲ IP 多播

上面我们讲了 A、B、C 类地址,D、E 类还没讲。D 类和 E 类地址是没有主机号的,所以不可用于主机 IP。

多播使用 D 类地址,因此如果首位是 1110,就可以认为是多播地址,而剩下的 28 位可以称为多播的组编号。E 类是预留的分类,暂时未使用。

那么什么是多播(组播)呢?多播用于将包发送给特定组内的所有主机(可以穿透路由器),即一个发送方,特定的多个接收方。由于其直接使用 IP 协议,因此也不存在可靠传输。

???? 在人们使用多播功能之前,一直采用广播的方式。通过广播将数据发送给所有终端主机,再由这些主机 IP 之上的一层去判断是否有必要接收数据。这种方式会给那些毫无关系的网络或主机带来影响,造成网络上很多不必要的流量。再者,由于我们在大部分情况下使用的本地广播是无法穿透路由的,所以多播这种既能够穿透路由,又可以实现只给那些必要的组发送数据包的技术就成为必选之路了。

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

⑤ 子网划分

子网划分应该是整个 IP 协议中最让人头大的部分,写这部分的时候我也参考了很多资料,对于如何能够循序渐进讲完这部分知识点绞尽脑汁,构思了很久,相信大家看完一定能够有所收获 ????

Ⅰ 为什么要进行子网划分

为什么要进行子网划分呢?那是因为传统的 IP 地址分类可能会造成资源浪费:????

上文我们说过,网络号相同的计算机属于同一个链路,以 B 类网络为例,网络号 16 位(除首位 “10”,啊hi有 14 位),也就是说理论上一个链路上允许大约 万台计算机连接。然而,在实际架构中,一般不会出现一个链路上连接这么多计算机的情况。因此,直接使用 A 类、B 类或 C 类地址,确实有些浪费资源。

为此,人们开始一种新的组合方式以减少这种浪费。

Ⅰ 子网划分初探

所谓子网划分就是:将传统的两级 IP 地址(网络号 + 主机号)转换成粒度更小的三级 IP 地址(网络号 + 子网号 + 主机号),也就是将主机地址划分为子网号和子网内的主机号

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

同样的,子网主机号不能全 0 或全 1

???? 注意:某单位划分子网后,对外仍表现为一个网络,即本单位外的网络看不见本单位内的子网划分。如下图所示,将网络地址 145.13.0.0 划分成 3 个子网,子网的网络地址分别为 145.13.3.0145.13.7.0145.13.21.0

  • 所谓网络地址就是只指定了网络号,未指定主机号,主机号全 0。

  • 子网的网络地址就是指定了网络号和子网号,未指定主机号,主机号全 0。

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

Ⅱ 子网掩码

那么,子网具体是怎么划分的呢?

这里就需要引出一个新的概念:子网掩码 subnet mask子网掩码只有一个作用,就是将某个 IP 地址划分成网络地址和主机地址两部分(为什么需要将 IP 地址分成网络地址和主机地址两部分,在上文我们已经说过了,这里不再赘述)。

子网掩码由一连串的 0 和 1 构成(0 或 1 必须连续),二级 IP 地址中的网络号和三级 IP 地址中的网络号 + 子网号对应到子网掩码中都用 1 来表示,而主机号对应到子网掩码中用 0 来表示。因此 A、B、C 类的子网掩码如下:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

 

将 IP 地址与子网掩码做按位 AND(与)运算(只有两个都为 1,结果才为 1,否则为 0),得出的就是网络地址

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

???? 举个子网划分的例子:假设对 C 类地址进行子网划分,网络地址 192.168.1.0(二级 IP 地址),使用子网掩码 255.255.255.192 对其进行子网划分:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

子网掩码 255.255.255.192 中共有 26 个 1,即代表网络号 + 子网号共 26 位,而 C 类地址的网络号(加上分类号)共 24 位,由此可知,需要从 8 位主机号中借用 2 位作为子网号。由于子网网络地址被划分成 2 位,那么子网地址就有 个,分别是 00、01、10、11,具体划分如下图:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

划分后的 4 个子网如下表格:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

???? 另外说明一点,子网掩码还有一种更为简单明了的写法,子网掩码的作用不就是用来分离网络号和主机号的嘛,我们直接在 IP 地址的后面注明网络号的位数(网络号 + 子网号)不就行了。

以网络地址 192.168.1.0(C 类二级 IP 地址),子网掩码 255.255.255.192 为例,我们可以写成:192.168.1.0/26,表示网络号 + 子网号共 26 位。

4. 拯救枯竭的 IPV4 地址

随着全球上网用户量越来越大,现行的 IPV4 地址越来越不够用,拯救枯竭的 IPV4 地址势在必行:

  • 方案一:无分类 IP 地址 CIDR

  • 方案二:NAT 地址转换

  • ........

然而,这些方案仅仅是解决燃煤之急,相对缓解了 IPV4 地址不够用的问题,但是 IPV4 地址的数量本身有限的事实无法改变,最根本的解决办法还是使用 128 比特的 IPV6 地址(本文最后会粗略讲解)

① 无分类 IP 地址 CIDR

直到 20 世纪 90 年代中期,向各种组织分配 IP 地址都以 A、B、C 等分类为单位进行。对于架构大规模的组织,一般会分配一个 A 类地址;反之,对于小规模的组织,分配一个 C 类地址。???? 然而,A 类地址的派发在全世界最多也无法超过 128 个,加上 C 类地址最多允许 254 台计算机相连,导致众多组织开始申请 B 类地址。其结果就是 B 类地址也开始严重缺乏,无法满足需求。

于是,人们开始放弃 IP 地址的分类,采用任意长度分割 IP 地址的网络号和主机号,这种方式叫作无分类 IP 地址 CIDR,意为 “无类型域间选路”。

CIDR 的表现形式为 a.b.c.d/x,其中 /x 表示前 x 位属于网络号(网络前缀),网络号的长度可以根据需要变化。例如 128.14.35.7/20 表示该 IP 地址的前 20 位为网络号,剩余 12 位是主机号。

CIDR 把网络号(这里用网络前缀可能更好理解,大家看下面这个例子就明白了)都相同的连续 IP 地址组成一个 CIDR 地址块。这样,我们就可以把原来的多个 IP 地址合并成同一个网络,更有效的利用 IPV4 地址。举个例子,应用 CIDR 技术将 203.183.224.1203.183.225.254 的地址合并为同一个网络(它们本来是 2 个 C 类地址):

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

上例中,合并该区间的地址后,主机数为 个,也就是说从 203.183.224.1203.183.225.254 的这个网络内允许接入 510 台主机:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

② NAT 地址转换

上文我们说过,IP 地址并不是根据主机台数来配置的,而是根据网卡(网络适配器)来的。像服务器、路由器等设备都是有 2 个以上的网卡,也就是它们会有 2 个以上的 IP 地址。32 位的 IPV4 地址最多给大约 43 亿台接入互联网的设备配置其独一无二的 IP 地址。

现在家家户户连入互联网远不止一台电脑吧,再加上若干部手机、若干部平板......,如果这些设备都被分配了全球独一无二的 IP 地址,43 亿的 IP 地址容量显然是不够的,尽管我们采用了无分类 IP 地址(CIDR)的方法来减缓 IPV4 地址的消耗速度,但是互联网的用户增速是非常惊人的,所以 IPv4 地址依然有被耗尽的危险。

于是就诞生了一种可以更换 IP 地址的技术: NAT,使得可连接的计算机数能够远远超过 43 亿台。

NAT(Network Address Translator 网络地址转换):用于在本地网络中使用私有地址,在连接互联网时使转而使用全局 IP 地址的技术。虽然说 NAT 实际上是为正在面临地址枯竭的 IPV4 而开发的技术,不过在 IPV6 中,为了提高网络安全也在使用 NAT。

NAT 的工作机制如下图所示:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

以 10.0.0.10 主机与 163.221.120.9 主机的通信为例。利用 NAT,途中的 NAT 路由器将发送源 IP 地址 10.0.0.10 转化为全局唯一的 IP 地址 202.244.174.37 后,再发送数据。反过来,当数据包从地址 163.221.120.9 发送过来时,目标 IP 地址 202.244.174.37 先被转换成私有 IP 地址 10.0.0.10 后,再被转发。

很显然,实现网络地址转换的关键就在于 NAT 路由器。在 NAT 路由器的内部,有一张自动生成的用来转换地址的表,当 10.0.0.10 主机向 163.221.120.9 主机发送第一个数据包的时候生成这张表,并按照表中的映射关系进行处理。

???? 现在很多互联网服务都仍然基于 IPV4,如果这些服务不能放到 IPV6 中,那么 IPV6 网络环境的优势也就无从谈起了。为了解决这个问题,就产生了 NAT-PT 规范,NAT-PT 是将 IPV6 的首部转换成 IPV4 首部的一种技术,这样,那些只有 IPV6 地址的主机也能够与 IPV4 地址的主机进行通信了。

6. 路由控制

???? 把路由控制放到最后面讲的原因就是,大家对 IP 地址有了一个健全的认识之后,再来学习路由控制,会比较容易上手。

① 路由控制初探

路由控制 Routing 是指将 IP 数据报发送给最终目标地址的功能。即使网络非常复杂,也可以通过路由控制确定到达最终目的地的通路。一旦这个路由控制的运行出现异常,分组数据极有可能迷失方向,无法到达目标地址。

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

为了将数据包发送给目标主机,所有主机和路由器都维护着一张路由控制表(Routing Table),该表记录着如下两个字段:

  • IP 地址

  • 如果想要到达这个 IP 地址,在当前路由器,数据包的下一步应该是发送到哪个路由器

在发送 IP 数据报时,首先要确定 IP 数据报首部中的目标地址,再从路由控制表中找到与该地址具有相同网络地址的记录,根据该记录将 IP 数据报转发给相应的下一个路由器。如果路由控制表中存在多条相同网络地址的记录,就选择相同位数最多的网络地址,也就是最长匹配

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

用于进行路由控制的是IP 地址中的网络地址这一部分。???? 举个例子:

  • 主机 A 要发送一个 IP 数据报,其源地址是 10.1.1.30 ,目标地址是 10.1.2.10,由于没有在主机 A 的路由表找到与目标地址 10.1.2.10 的网络地址,于是把包被转发到默认路由(路由器 1

  • 路由器 1 收到 IP 数据报后,也在路由器 1 的路由表匹配与目标地址相同的网络地址记录,发现匹配到了,于是就把 IP 数据报转发到了 10.1.0.2 这台路由器 2

  • 路由器 2 收到后,同样对比自身的路由表,发现匹配到了,于是把 IP 数据报从路由器 210.1.2.1 这个接口出去,最终经过交换机把 IP 数据报转发到了目标主机

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

上面我们提到了默认路由,什么是默认路由呢?

  • 默认路由 Default Route 就是指路由表中任何一个地址都能与之匹配的记录。如果一张路由表中包含所有的网络和子网信息,将会造成无端的浪费。这时,默认路由就是一个不错的选择。默认路由一般标记为 0.0.0.0/0default

此外,我们还需要注意一个地址:环回地址。大家对于 localhost127.0.0.1 一定不陌生吧,没错,这就是环回地址,环回地址是同一台计算机上的程序之间在进行网络通信时所使用的一个默认地址。当计算机使用这个特殊的 IP 地址或主机名时,数据包就不会流向网络

② 路由协议

路由控制表的形成有两种方式:

  • 一种是管理员手动设置,也叫静态路由控制

  • 另一种是路由器与其他路由器相互交换信息时自动刷新,也叫动态路由控制

为了让动态路由即时刷新路由控制表,在网络上互联的路由器之间必须设置好某种协议,保证正常读取路由控制信息。这种协议就称为路由协议

当然,随着 IP 网络的发展,只使用一种协议对所有网络进行统一管理是不可能的。因此,人们根据路由控制的范围将路由协议大致分为两类:

  • 外部网关协议 EGP(包含 RIP、OSPF 等协议)

  • 内部网关协议 IGP(包含 BGP 等协议)

没有 EGP 就不可能有世界上各个不同组织机构之间的通信,没有 IGP 就不可能有机构内部的通信

路由协议其实又是一个重难点,不过在面试中鲜有人问津,大多出现在考试卷上,本文的拉锯时间确实有点太久了,此处就不再详细解释,后续可能会单独出一篇路由协议的文章(如果大家需要的话)。

7. 总结

???? 这篇文章花费的时间长达十多个小时,很大一部分时间都花在理顺整篇文章的逻辑上,让别人懂和让自己懂真的是天壤之别。OK,关于 IP 协议本身的重要内容至此就基本说完了,不过和 IP 协议相关的技术(比如 ICMP 网际报文控制协议,IGMP 网际组管理协议,DNS 域名解析协议,ARP 地址解析协议,DHCP 动态主机配置协议)还有很多,诸位任重而道远,我们下期再见 ????

 

???? 关注公众号 | 飞天小牛肉,即时获取更新

  • 博主东南大学硕士在读,利用课余时间运营一个公众号『 飞天小牛肉 』,2020/12/29 日开通,专注分享计算机基础(数据结构 + 算法 + 计算机网络 + 数据库 + 操作系统 + Linux)、Java 基础和面试指南的相关原创技术好文。本公众号的目的就是让大家可以快速掌握重点知识,有的放矢。希望大家多多支持哦,和小牛肉一起成长 ????

  • 并推荐个人维护的开源教程类项目: CS-Wiki(Gitee 推荐项目,现已累计 1.5k+ star), 致力打造完善的后端知识体系,在技术的路上少走弯路,欢迎各位小伙伴前来交流学习 ~ ????

  • 如果各位小伙伴春招秋招没有拿得出手的项目的话,可以参考我写的一个项目「开源社区系统 Echo」Gitee 官方推荐项目,目前已累计 330+ star,基于 SpringBoot + MyBatis + MySQL + Redis + Kafka + Elasticsearch + Spring Security + ... 并提供详细的开发文档和配套教程。公众号后台回复 Echo 可以获取配套教程,目前尚在更新中。

这篇关于别再恐惧 IP 协议(万字长文 | 多图预警)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!