小白也能看懂的网络基础 05 | IP 地址深度学习
Matrix 是少数派的写作社区,我们主张分享真实的产品体验,有实用价值的经验与思考。我们会不定期挑选 Matrix 最优质的文章,展示来自用户的最真实的体验和观点。
文章代表作者个人观点,少数派仅对标题和排版略作修改。
欢迎来到网络世界,《小白也能看懂的网络基础》系列文章会从零开始帮助你构建网络的基础知识。如果你完全没有接触过网络相关的内容,那我们是一样的,在学习过程中我们肯定遇到了相同的问题!写下这些文章一方面要记录自己的学习历程,另一方面也希望帮到同样想要学习网络基础的小伙伴。
文章的部分内容与素材是我从 Youtube 平台的 Network Direction 发布的系列视频学习和搜集过来的,翻译不易,部分内容可能无法做到尽善尽美,甚至可能会有部分瑕疵,我会尽力让文章内容通俗易懂,覆盖全面。若各位小伙伴发现任何问题,希望能够留言或私信告诉我,在下不胜感激!当然,我也会在第一时间进行更正。
在往后的每一篇文章中,我都会把看到文章的小伙伴当成是完全没有网络经验的小白,我的目标是和零基础小白一起建立坚实的网络基础,网络大神请略过此系列文章。
让我们开始网络之旅吧!
上一章节,我们了解了无类域间路由(CIDR)的真实面貌,知道了 CIDR 可以使用子网划分将网络分解为更小的、更便于我们使用的网络空间!最主要的,还是它可以帮我们节省更多的网络空间。
尽管如此,我们仍然觉得并不是非常方便易用,因为每次我们都需要将其在十进制与二进制之间转换,计算,比较麻烦。因此在本小节,我们要来学习 VLSM 可变长度子网掩码来帮助我们更容易的理解子网划分。
我们拿 172.16.0.0 / 16 来举例,在上一章我们使用 /24 的形式,将子网掩码的前 3 个八位位组的 1 全部打开了,因此得到了 255.255.255.0 的子网掩码。
同时,在上一章节的小测试,我们使用 /20 把前两个八位位组以及第三个八位位组的前 4 位的 1 全部打开 1111 1111.1111 1111.1111 0000.0000 0000,因此得到了 255.255.240.0 的子网掩码。
观察上图,我们现在有三个办公室,每个办公室的网络设备屈指可数,然而上述的子网划分仍然给我们的每个网段划分了 256 个 IP 地址,这造成了极大的浪费。
同时,将多个办公室网段连接在一起的路由器所在的网络,也是一种连接网络,也会占据一个网段,然而这个网段我们一般不会配置类似打印机、工作站之类的设备,若给这个网段分配 256 个地址,同样会造成浪费!
我们会想,有没有什么办法可以解决这个问题?答案是肯定的,我们需要对使用 /24 划分之后的网段再进行进一步的划分!
比如,我们使用 /30 的形式,把 172.168.200.0/30 的 IP 地址八位位组的前 30 位全部打开为 1,我们会得到 255.255.255.252 的子网掩码,这就限制了在 172.168.200.0 这个网段中,只能设置 4 台设备。
观察整个网络结构,我们会发现,有一部分使用了 /24,有一部分使用了 /30,这就是利用 VLSM 创建的不同大小的子网。
到目前为止,我们所说的所有 IP 地址都是分配给我们已知的设备的,这种地址就是所谓的主机地址,通常来说,一个网段中的某一台设备一次只希望将流量发送到另一台设备上,这种行为我们称其为单播流量。
可以理解为,在一个「人满为患」的房间里,你只挑选了你中意的一个小姐姐进行对话交流,忽略其他人的存在,这非常类似于同一网段的众多设备中,我们选择了其中一台进行通信。
有些时候,我们想要在当前网段下获取一段特定的资源,但我们并不知道这一资源来自于哪台主机,因此,我们需要在当前网络下广播一条信息,询问「谁拥有 xx 资源」,或者「我在哪里可以找到这些资源」。
举个例子,有一个我非常中意的小姐姐是艺术系的,但是我不知道她具体是哪个班的,所以我就跑到艺术系的每个班级喊一声「大家安静一下哈,我找 xxx,她是不是在咱们班呢?」。这就是广播流量。
每台设备都拥有一个专门用于广播的特殊 IP 地址,我们称其为广播 IP 地址。得到广播 IP 的方法也很简单,从本网络中找最后一个 IP 地址,这个 IP 一定是广播 IP。
例如 172.16.2.0,这个网段的最后一个 IP 就是 172.16.2.255,因此这就是该网段的广播 IP。我们的设备不能配置或使用该 IP。
另一个我们无法配置的 IP 就是网络 IP,它和广播 IP 正好相反,一般都是网段的第一个 IP,例如 172.16.2.0 就是这个网段的第一个 IP,因此它同样不能被配置。
现在,我们回头看刚才的网络案例,我们使用 /30 给路由器划分了一个网段,之前我们计算得出的结果是,该网段可以划分 4 台设备。
但当我们了解了广播 IP 和网络 IP,我们可以得知,其实这 4 个 IP 中,可用的只有中间的 172.16.200.1 和 172.16.200.2,而 172.16.200.0 为网络 IP 地址,另一个 172.16.200.3 则为广播 IP 地址。
再来看一个案例,上图中 172.16.0.10 / 24,通过 /24 我们就可以得知,该 IP 地址的前三个八位位组打开为 1,因此,172.16.0 为网络位,而后面 .10 为主机位。
我们把主机位八位位组的所有位设置为 0,我们会得到 172.16.0.0,而这就是网络 IP 地址;相反,将主机位八位位组的所有位设置为 1,我们会得到 172.16.0.255,这就是广播地址。
根据主机位范围 0~255 可得知,该网段最多可分配 256 台主机,但是因为有两个特殊地址无法分配,因此真实可用的 IP 地址为 256 - 2 = 254 个。
因此,当我们再去看我们所有划分的网段,我们可以清晰的知道,任何一个网段的第一个和最后一个 IP 都是留给网络 IP 和广播 IP 的。计算一个网段可用 IP 的时候,别忘了把它们两个去掉!
上述案例因为采用标准的子网划分,我们可以很容易的得知一个网段中的网络 IP 和广播 IP,当 VLSM 介入时,再来查找网络 IP 和广播 IP 就变得有些麻烦了。
我们拿 10.42.37.12 / 22 来举例,首先,/22 告诉我们,这不是一个标准的子网划分,而是基于 VLSM 的子网划分。
同时,我们根据 /22 得出它的子网掩码为 255.255.252.0,通过计算可以得知 256-252=4,该子网划分每个网段的间隔为 4,因此我们可以得出 2^6 = 64 个子网空间,分别为:
通过观察 10.42.37.12 我们可以得知,它属于 10.42.36.0~10.42.40.0 这个网段,因此它的网络 IP 为 10.42.36.0,而它的广播 IP 为 10.42.39.255。同时,我们可以得知,每个网段的可用主机数量为 2^10-2=1022。
请写出下列 IP 地址的网络 IP 和广播 IP,算出可划分的网段数量及每个网段的可用主机数量。
通过上述的学习,大家对于 IP 地址是否有了更深层次的了解?我们趁热打铁,接着看后面的内容。我们都知道,路由器是来帮助我们将一个网络中的数据流量传输到另一个网络中的。
那么问题来了,设备是怎么找到路由器的呢?又是如何通过路由器到达目的地的呢?这些目前都是未知数。不知大家是否注意过,当我们在 Windows 上配置 IP 地址的时候,有一个叫做网关的东西。
这个网关通常指的就是本地路由器的 IP 地址,当一台计算机发送信息时,根据发送信息的目标地址,通过子网掩码来判断目标地址是否在本地子网中,若存在,则直接将信息发送到目标地址主机;若不存在,则会讲该信息发送给默认网关即路由器,并由路由器将其发送到其他网络中,进一步寻找目标主机。
现在我们回过头看一下广播 IP,之前我们说到,每一个网段的最后一个 IP 地址,都是广播 IP,但这并不是唯一的解释,在这里我们需要说到另一个同样是用于广播的比较特殊的广播 IP,那就是 255.255.255.255。
不同之处在于,这个广播 IP 并不在意你的本地子网是什么,也不在意你什么时间,往什么地址发送了什么信息。那它有什么意义呢?
举个例子,当你的电脑开机了,但是还没有分配 IP 地址,同时,它也不知道当前网络中的分配地址的服务器在哪里,因此,它就会将广播发送到 255.255.255.255,并说道「兄弟们,谁能给我分配一个 IP 地址?」
这个时候,专门用于分配 IP 地址的服务器在收到你的请求,就会给你分配一个 IP 地址,响应到「在呢,在呢,我给你分配一个」。
这样虽然可以解决问题,但是也存在一些缺点,比如,当计算机发送广播时,一个路由器接收到消息可能会传递给另一个路由器,如此一来,有可能陷入死循环,如图。
解决方法也很简单,那就是让路由器默认不转发广播消息,将所有的 IP 广播消息都保留在本地网络中。虽然可以解决死循环的问题,但如果我们确实需要向网络中的其他部分发布消息呢?
比如,一台服务器要发送多个视频流给网络中多台设备,而这些设备要将视频流合并以方便观看;或者,我们可以将视频流分别发送给每台设备,虽然我们可以这么做,但这就变成了单播流量,效率会非常低下,除此之外,还会遇到其他问题,例如:
因此,我们需要一个解决方法,那就是 多播流量。
多播流量需要使用特殊 IP 地址,也就是我们之前所说的 D 类 IP 地址,D 类 IP 地址的地址范围从 224.0.0.0 到 239.255.255.255,多播是设备选择接受特定流量的一种方式。
发送视频的服务器会将视频流量发送到多播 IP,而其他主机设备则会查找发送到该 IP 的流量信息,路由器则可以转发多播 IP 的视频流量以便其到达其他网络。
举个例子,我们要对班级兴趣小组进行分组,喜欢看电影的、听音乐的、玩游戏的可以分成几组,此时,我们再传达信息时就变得方便且准确了,而且可以直接忽略不想获取信息的其他组
IP 地址必须是唯一的,就像每一户人家的家庭住址,必须保证唯一才能准确定位,如果再其他国家地区存在任何一个相同的家庭住址,则可能会导致本来应该邮寄给我们的包裹邮寄到了他们那里;而他们的包裹邮寄到我们这里,这就乱套了。
那么,问题来了,我们该如何保证网络中的 IP 地址是唯一的呢?如何才能防止其他人盗用我们的地址?
这些 IP 地址统一由 互联网号码分配局 (Internet Assigned Numbers Authority)简称 IANA 进行管理,它们将大量地址分配给分布于世界各地的子机构,我们也称其为 区域性互联网注册管理机构 (Regional Internet Registry)简称 RIR。
每一个地区的 RIR 名称也不尽相同,例如:
RIR 为各地的互联网服务提供商(简称 ISP)分配地址空间,当然如果是拥有庞大用户量的「大客户」可以享受特殊待遇。否则,只能使用国家或地区性的 ISP 所分配的 IP 地址。因此,我们可以构建一个关系网:
这么细致的分配,有必要吗?很有必要,试想一下,几百万人去挤一个部门办事儿是什么后果,速度慢是一方面,出现问题解决起来还慢呢,因此这种细致的划分很有必要。
当我们想要创建一个新的网络,则需要获取更多的 IP 地址,因此,我们只需要找到当地的服务提供商,然后申请即可。另外,因为 IPv4 的地址空间很快就要耗尽,所以为了解决这一系列的问题,在 1990 年就发布了一个称为 RFC1918 的标准。
RFC1918 描述了某些互联网技术的工作原理与细节, 链接地址 ,这个标准非常之详细,而且极其复杂,所以我们不建议大家通篇阅读, 可以确定的是,RFC 现在已经保留了一些 IP 空间供私人使用,这就是私人 IP,例如:
我们可以适合本地网络的任何方式来使用这些 IP 地址,细心的小伙伴现在已经查看了自己的 IP 地址,是不是发现已经属于其中之一了呢?
除了私人 IP 之外的 IP 地址,均属于公共 IP。
私人 IP 是不允许在互联网上使用的,这是为了不与其他公司或企业的 IP 地址冲突,毕竟他们也使用了相同的私人 IP;同时,它还为我们节省了很多 IP 地址,
此时,会有小伙伴提问,既然我们使用的是私人 IP,且私人 IP 地址在互联网上使用,为什么我们依然可以浏览网站呢?
这是因为,互联网服务提供商至少会给我们提供一个公共 IP,举个例子,我们拥有一台配置私人 IP 的设备,它的 IP 为 172.16.0.1,当这台设备要发送信息到 Internet 时,Internet 路由器会将这条信息携带的私人 IP 修改为公共 IP,这个过程称为网络地址转换。
在这个小节,我们主要来看一下设备是如何获取地址的,主要有两种方法,一种比较常见,另一种比较少见。
首先,你可以准备一个测试电脑(Windows)的,并给它配置一个地址,改地址称为静态地址,静态地址的意思是,除非我们手动修改这个地址,否则它不会有任何变化。当我们使用这种方式配置地址,我们需要确保该地址是唯一的,否则会发生冲突,这会导致各种不必要的麻烦。
通常,我们都会使用静态地址分配法,分配我们的路由器或某些服务器这些地址永远不会更改的设备。
第二种方法,就是使用 DHCP 动态分配地址,DHCP 服务器具有可用的 IP 地址池,当我们接入具备该服务器的网络时,我们的设备会向本地网络广播一条信息,而 DHCP 服务器则会自动从 IP 地址池中找到闲置的 IP 分配给我们。
因为 DHCP 服务器会自动检测网络中的设备是否存在相同 IP,因此一般不会出现 IP 冲突的问题,因为它自动分配的特点,我们没有办法确定每次分配的 IP 为同一个 IP。
DBCP 动态分配这一特性,对于手机、平板、笔记本电脑非常友好,因为移动设备的特点就是,移动到新网络时,要自动加入当前无线网络,自动分配地址,所以我们才能在不同的网络中无缝衔接的使用这些设备上网。
回顾一下 OSI 模型,还记得我们是如何在发送数据之前将标头信息添加到数据中的吧,我们在每一层都给数据添加了不同的标头,这就类似于要投递一封信件,需要给新建封装信封、写上地址、贴上邮票一样的道理。
IP 地址也会添加一些标头信息,如图
图标中的每一项信息,都具有独特的意义,目前,我们需要着重了解的是源 IP 地址和目标 IP 地址,也就是图中的这两个位置
左上角的 Version 版本,标志着我们当前使用的 IP 是什么版本的 IP,可能的值为 IPv4 和 IPv6,如图:
有时候,我们传递的数据包过于庞大,因此,设备会将其分解成较小的数据包,然后分别进行发送,这就是数据碎片,图中的 Fragment Offset 是用来查看碎片轨迹的字段,根据碎片的顺序,可以方便在其到达目的地之后的重组。
有些时候,我们可能并不想要将数据分解成碎片传递,因此,我们可以使用 Flags 字段来实现避免分解的操作。
在前面的小节,设备广播时,为了避免路由器内部的死循环,我们可以设置生存周期(Time to Live)这个字段的值,每次发送数据时,都填写一个生存周期(Time to Live),当数据包通过路由器时,一旦出现错误,这个生存周期会开始倒计时,当倒计时到 1 的时候,就会将这个数据包抛弃,从而有效的避免了死循环的出现。
> 下载少数派 客户端 、关注 少数派公众号 ,了解更妙的数字生活 🍃
> 想申请成为少数派作者?冲!