点击上方“前端印象”,选择“设为星标”第一时间关注技术干货!

本文是该系列文章的第二篇,将了解Internet中使用的网络层地址,又称IP地址。每个设备都至少需要一个IP地址,其可以作为我们设备的标识,就跟我们的电话号码一样,知道了电话号码就能找到我们,所以每个IP地址都是唯一的,所以在给每台设备分配IP时,会根据一套编号方案进行,本篇文章我们就来详细地了解一下它。

一、IP地址的表示

IP作用于OSI参考模型中的网络层,在终端通信中作为唯一标识,便于确定数据的传递目标。

IP地址分为:IPv4IPv6

大多数用户熟悉并且流行的IP地址是IPv4,其是用点分四组十进制的表示方法展示的,例如 165.195.130.107197.101.0.0 等,每一组的数字都是非负的整数,范围在 [0, 255] 之间。

IPv4还有种写法是用二进制表示的,例如:

十进制表示 二进制表示
0.0.0.0 00000000 00000000 00000000 00000000
1.2.3.4 00000001 00000010 00000011 00000100
10.0.0.255 00001010 00000000 00000000 11111111
165.195.130.107 10100101 11000011 10000010 01101011
255.255.255.255 11111111 11111111 11111111 11111111

因此称IPv4是32位的。而IPv6的位数就比较大了,是128位的,长度是IPv4的4倍,并且其表示方式是分块的八组四个十六进制数,例如:5f05:2000:80ad:5800:0058:0800:2023:1d71,每个块儿之间都是用 : 隔开的。

IPv6看着特别得长,所以它的简化表示法已经有一套标准,规则如下:

  1. 每个块儿中前导的零可省略。例如5f05:2000:80ad:5800:0058:0800:2023:1d71 按照此规则简化后为 5f05:2000:80ad:5800:58:800:2023:1d71
  2. 整个块儿都为零的可以省略不写,并用 :: 代替其位置,但整个IPv6地址中只能出现一次 :: 符号。例如 0:0:0:0:0:0:0:1 按照此规则简化后为 ::1

当然IPv6也是可以用二进制表示的,表示结果如下:

十六进制表示 二进制表示
5f05:2000:80ad:5800:0058:0800:2023:1d71 0101111100000101 0010000000000000 1000000010101101 0101100000000000 0000000001011000 0000100000000000 0010000000100011 0001110101110001
::1 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000001

如果把IPv6和端口号一起使用的话,可能会出现这样的情况:http://2001:0db8:85a3:08d3:1319:8a2e:0370:7344:443/,该URL中,最后一个 :443 其实表示的是端口号,但与IPv6一起使用时看起来好像也成为了一个块儿部分,因此我们需要用 [] 符号将IPv6部分包裹起来,结果如下:http://[2001:0db8:85a3:08d3:1319:8a2e:0370:7344]:443/

二、IP地址结构

上面提到,IP是作为终端的唯一表示,因此只有当保证每个IP都不同时,才能保证IP的唯一性。其中,IPv4地址的长度为32位,因此就有 种可能的地址,那么同理,IPv6地址的长度为128位,因此就有 种可能的地址。

这些地址就是作为数据包发送的目的地址,当然每个地址都会有它们各自的含义,例如单播组播广播等,当然还有一些地址是会被保留用于实验的

  • 单播可以理解为一台主机发送单一的数据包给另一台主机;
  • 组播可以理解为一台主机发送单一的数据包给多台主机;
  • 广播可以理解为一个节点向其它所有的节点发送数据包;

IPv4中大多数的的地址都为单播

(1)分类寻址

那么IP地址既然是作为识别特定主机的唯一标识,那么到底是如何被识别的呢?其实在长度为32位的IPv4地址中,有一段连续位称为网络号,还有一段连续位称为主机号

因为有时在同一个网络中,可能会有多台主机,就例如一个电子计算机教室看成一个网络,教室中有60台电脑,那么这60台电脑都属于这一个教室所处的网络,而每台电脑又需要在该网络下单独分配一个唯一的标识

因此,在识别IP地址时,就是先通过识别IP地址中的网络号来确认目的地址处于哪个网络区域,然后再识别主机号,来确认这个网络中特定的主机。

我们将IPv4地址用二进制表示,一段地址的网络号和主机号分类可以分为5类:A类B类C类D类E类,区别如下图:

IPv4地址分类
  • A类: 网络号共8位,首位固定为 0,接下来连续的7位可以自由设定;主机号为24位
  • B类: 网络号共16位,前两位固定为 1 0,接下来连续的14位可以自由设定;主机号为16位
  • C类: 网络号共24位,前三位固定为 1 1 0,接下来连续的21位可以自由设定;主机号为8位
  • D类: 为组播地址,共32位,前四位固定为 1 1 1 0
  • E类: 为保留地址,共32位,前四位固定为 1 1 1 1

其中A 、B 、C类地址大多都是单播地址,因此它们可用于接口分配。举个例子,A类地址网络号共8位,其中首位固定为 0,那么还有7位可以自由设定,那么就共有 个网络数;主机号共24位,那么就共有 个主机数。(同样的,我们可以推出其它类别的地址的网络数和主机数)因此我们可以理解为,用A类地址一共可以为 个电子计算机教室分配使用,每个教室可以容纳 台主机

IPv4地址的范围在 0.0.0.0 ~ 255.255.255.255 之间,那么我们来看看这五类地址各自的地址范围是如何的吧~

A类地址首位固定为 0,因此A类地址用二进制表示为 0XXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX,因此A类地址用十进制表示时,第一组最小为0,其余三组最小也为0,即 0.0.0.0

B类地址前两位固定为 1 0,因此B类地址用二进制表示为 10XXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX,因此B类地址为十进制表示时,第一组最小为128,其余三组最小为0,即 128.0.0.0,那么A类地址的范围就可以确定为 0.0.0.0 ~ 127.255.255.255

C类地址前两位固定为 1 1 0,因此B类地址用二进制表示为 110XXXXXX XXXXXXXX XXXXXXXX XXXXXXXX,因此C类地址为十进制表示时,第一组最小为192,其余三组最小为0,即 192.0.0.0,那么B类地址的范围就可以确定为 128.0.0.0 ~ 191.255.255.255

以此类推,即可推出D 、E类的地址范围

我们将IPv4地址的空间划分情况总结在了下表中:

地址范围 网络数 主机数
A 0.0.0.0 ~  127.255.255.255 27 224
B 128.0.0.0 ~ 191.255.255.255 214 216
C 192.0.0.0 ~ 223.255.255.255 221 28
D 224.0.0.0 ~ 239.255.255.255 / /
E 240.0.0.0 ~ 255.255.255 / /

上面有提到,A、B、C类地址中大多都是单播,那么也有几个地址不作为单播地址使用,一般都是地址块儿中的第一个地址和最后一个地址不使用,所以假设分配得到的地址块儿为 127.0.0.0,那么实际能分配的单播地址数就为

(2)子网寻址

查看上述的A类地址,它可使用的主机数有 个,那么当分配了A类IP地址后,却发现并没有那么多的主机,这样就造成了剩余可用主机数的浪费;或者说被分配了C类地址后,却发现有上万台主机,而C类地址可用的主机数只有 个,因此只能给其多分配几个C类地址,那么C类地址就很容易被消耗完

为了解决上述办法,又采用了一种叫做子网寻址的方法,即假设当一个站点被分配了B类地址,那么该站点的管理员可以将B类地址的主机号部分继续分成两部分,分别为 子网号主机号,这两者所占的位数可以根据实际需求自由分配,例如分配给子网号8位,分配给主机号8位,即平分,结果如下图:

子网寻址

此时的站点可以支持 个子网,每个子网中最多可支持 台主机(每个子网的第一个地址和最后一个地址不会被使用)

这样在站点内,路由器就可以根据子网号和主机号监测到不同子网的流量了,如下图所示:


上图中,该站点被分配了一个B类地址 128.32.x.x,而管理员此时选择将其继续划分为多个子网,如图中的子网1和子网2,它们分别是开始于 128.32.1128.32.2,并且左右两台主机都分别属于各自的子网。

那么路由器是如何在地址中寻找子网号的呢?这就要设置一个名为子网掩码的参数了

(3)子网掩码

子网掩码是由一台主机或路由器使用的分配位,用以确定如何从一台主机对应的IP地址中获得网络和子网信息,更通俗点说,通过它可以确定一个IP地址的网络/子网部分的结束和主机部分的开始。

子网掩码跟IP地址的长度相等(IPv4为32位,IPv6为128位),对于IPv4来说,子网掩码也是用点分四组十进制来表示的。当子网掩码用二进制表示时,结构非常简单且容易记忆,从左边开始由一段连续的1组成,紧接着又一段连续的0组成直到最后。其中连续的1的长度称为前缀长度,用 /长度 来表示

举例各种类型的子网掩码:

十进制表示 前缀长度 二进制表示
128.0.0.0 /1 10000000 00000000 00000000 00000000
255.0.0.0 /8 11111111  00000000 00000000 00000000
255.192.0.0 /10 11111111  11000000 00000000 00000000
255.255.0.0 /16 11111111  11111111  00000000 00000000
255.255.254.0 /23 11111111  11111111  11111110  00000000
255.255.255.224 /27 11111111  11111111  11111111  11100000
255.255.255.255 /32 11111111  11111111  11111111  11111111

接下来说说子网掩码是如何使用的,其二进制位1对应IP地址的网络/子网部分;相反,0对应IP地址的主机号部分。换个说法就是子网掩码第一个0所对应IP地址的位为主机号的第一位;也可以借用前缀长度来判断,即前缀长度后一位对应的也是IP地址主机号的第一位。

例如刚才举的例子,站点管理员将B类地址 128.32.x.x 的主机位划分为8位的子网号和8位的主机号,那么他就会提前设置好一个长度为 的子网掩码,即 255.255.255.0,表示前24位是网络/子网部分,那么路由器在处理图中的IPv4地址 128.32.1.14时,会先查看一下子网掩码,此时将IP地址和子网掩码对应的位进行与运算即可获得该IP所处的是哪个子网,运算过程如下图:


结果中的 128.32.1.0 就是IP地址 128.32.1.14 所属的子网

但此时有没有发现一个问题?虽然给地址划分了子网号和主机号,但是每个子网号所对应子网的主机数就固定死了,而且每个子网所支持的主机数都是一样的,这一定是不合理的,因为实际应用中,可能这个区域只需要支持10台主机,而另一个区域需要支持100台主机,那么我们此时在划分子网号和主机号的时候,至少要让每个子网支持的主机数大于100台,那只需要支持10台主机的区域分配到了一个子网,岂不是至少浪费了其中的90个空间么?面对这样的问题,我们又该如何解决呢?

(4)可变长度的子网掩码

上个部分刚说过,路由器在寻找子网号时,是通过我们设置的子网掩码来查找的,那么我们不妨根据不同的需求设置多个子网掩码,来达到子网号和主机号分配比例不唯一的需求,这就是VLSM(Variable Length Subnet Mask,可变长度的子网掩码)的实现

比如,我们上面举得例子,当前站点被分配到了一个B类地址,该站点的某个区域需要支持100台主机,那么我们可以给这个区域分配一个子网号,同时设置其子网掩码为 255.255.255.128,其前缀长度为 25,因此留给主机位的位数还有 位,则该子网支持主机数为 台,可以满足该区域的需求;再来看另一个区域,它们需要支持的主机台数为10,那么我们可以给该区域分配另一个子网号,同时设置子网掩码为 255.255.255.240,其前缀长度为 28,因此留给主机的位数还有 位,则该子网支持的主机数为 台,同样可以满足该区域的需求。

(5)广播地址

在每个IPv4的子网中,都会有一个特殊的地址被保留作为子网的广播地址,那如何获取它呢?我们只需要将子网掩码的所有位都取反,即0变1,1变0,然后将取反后的子网掩码与子网内的IP地址进行或运算即可得到广播地址

仍然延用上面的例子,子网内的IP地址为 128.32.1.14,子网掩码为 255.255.255.0,则比较过程如下图:


图中获得的结果 128.32.1.255 即为子网 128.32.1.0 中的广播地址,前面说过,每个子网中的头尾两个地址一般是不被使用的,所以该子网中可用的单播地址范围就是 128.32.1.1 ~ 128.32.1.254

(6)总结

简单总结一下子网掩码的作用:

  1. 面对不同需求设置不同的子网掩码可以做到不同子网支持不同数量的主机
  2. 通过子网掩码可以获取子网IP
  3. 通过子网掩码可以获取广播地址
  4. 通过子网掩码可以获取该子网内的可用单播地址
  5. 通过子网掩码可以获取子网内支持的主机数

??? 欢迎留言讨论???推荐阅读   详解原生Ajax的实现,并模仿JQuery进行封装

 【JS面试题】数组去重(6种方法)震惊面试官

   建议收藏 | 最全的JavaScript常见的操作数组的函数方法宝典

   多图生动详解浏览器与Node环境下的Event Loop

   HTML5新特性drag API 实现拖放功能

   ES6新特性实现面向对象编程,详解class语法定义类

‍‍‍‍‍‍‍

END‍‍‍‍‍‍‍

❤支持三连

1.看到这里了就点个在看支持下吧,你的在看是我创作的动力。

2.关注公众号前端印象「一起交流进步」

3.关注公众号回复【加群】,拉你进技术交流群一起玩转前端。

0分配不到地址_前端学习计算机网络——IP地址的划分及其分类相关推荐

  1. 联想服务器imm默认地址_命令下配置ip地址

    一.添加 IP 地址及默认网关 (是添加,要重设或更新原来IP的请看第三点) netsh interface ip add address 用法 : add address [name=] [[add ...

  2. java解析ip地址_通过JAVA解析IP地址

    如何用Java获得一个域名的IP地址呢?提供这个功能的类叫做java.net.InetAddress.我们假设现在有这样一个域名,他用一个静态的 getByName来重新获得一个InetAddress ...

  3. win7 计算机名IPDNS修改,怎样改ip地址_怎样更换电脑ip地址-win7之家

    在电脑上,电脑是要拥有一个ip地址才能上网的,ip地址就是电脑的标识,一般都会分配一个固定的ip地址,设置好这个地址才可以上网,那么我们要是想改ip地址的话要怎样改呢,下面小编给大家分享更换电脑ip地 ...

  4. 怎么判断私网地址_如何判断一个IP地址是私有地址

    如何判断一个IP地址是私有地址,首先,我们得先了解什么是私有地址.本文所指的IP地址,皆是IPV4. 一个IPV4地址,由四段组成,最大值为255,一个IP地址其实就是一个32位的bit串,每8位一段 ...

  5. linux设置静态ip地址_什么是静态IP地址,与动态IP地址比较以及如何为Windows和Linux设置?...

    linux设置静态ip地址 IP addresses are the core mechanism of Computer networks. The IP address is used to sp ...

  6. 更换ip地址_手机怎么改ip地址

    为什么会出现手机ip的地址的更换,是因为使用手机的人员越来越多,很多的工作开始使用手机来进行完成.也是因为手机更方便携带,使用也更加的方便,移动用户越来越多.那么手机的ip地址能够修改吗?回答是肯定的 ...

  7. python修改ip地址_怎么更改电脑ip地址?基于 Python 爬虫的ip修改设计与实现

    怎么更改电脑ip地址?基于 Python 爬虫原理的篮球鞋选择程序的设计与实现ip修改 [摘 要]伴随着篮球鞋工艺的进步及产业升级,多类型多种类的篮球鞋出现在大众的视野当中.与此同时,消费者对篮球鞋的 ...

  8. 笔记本java设置ip地址_如何设置苹果笔记本IP地址

    在相对于很少使用苹果笔记本的用户来说设置IP地址可能是个难题,下面我将介绍如何设置苹果笔记本IP地址. 1.单击桌面右上角的无线图标,无线网卡自动搜索环境中的无线网络,如下图所示. 2.点击" ...

  9. 如何查看计算机的网络网址,怎么查看电脑IP地址_如何查看电脑IP地址?-192路由网...

    问:怎么查看电脑IP地址?电脑连接路由器上网的,电脑IP地址设置为自动获得,请问如何查看电脑从路由器上获取到的IP地址? 答:只需要找到电脑上的"本地连接"选项,然后鼠标右键&qu ...

最新文章

  1. 面试题系列——OSI七层模型
  2. 每天一道LeetCode-----链表插入排序
  3. Spring Boot&JPA&Hibernate&Oracle
  4. java .class文件和.class文件区别是什么?
  5. 那些年,备胎一起追的女神
  6. 基于springboot的医院门诊管理系统
  7. vm虚拟机iso镜像linux系统下载地址,Vmware Tools ISO 虚拟机ISO系统镜像大全
  8. eviews建立时间序列模型_如何用eviews分析时间序列(全面).pdf
  9. windows批处理脚本bat命令解析【12】ECHO处于关闭状态
  10. 品味之旅见行见心 ——香港科大EMBA郎酒庄园深度体验之旅
  11. Linux下rsh服务配置
  12. 没错,这就是九大爷平台1225车品狂欢节预告!
  13. python中的列表
  14. 阿里云与海底捞合作QA
  15. 产品经理需求文档(PRD)怎么写?
  16. ESP32C3基于Arduino框架下的 ESP32 RainMaker开发示例教程
  17. 计算机毕业大学生如何解决难就业问题?
  18. Win10截图工具失效怎么办?这个方法帮你轻松修复
  19. 加密算法RSA 【C/C++运用openssl】
  20. 上海大学计算机学院团委,【CES·活动】上海大学计算机学院首届“校友杯”羽毛球赛圆满落幕...

热门文章

  1. 【git重案组】如何逃避git blame的追踪?
  2. nginx rtmp module 代码详解 各模块主要功能
  3. RTMP Handshake
  4. Docker的容器运行时组件Containerd
  5. Hive _练习,更新中
  6. 面试题:聊聊Unix与Java的IO模型?
  7. 如何判断一个常量是废弃常量,一个类是无用类
  8. 【Java爬虫】我的第一个爬虫 -- 简单抓取网页源代码
  9. 如何在eclipse中查看源码
  10. 看动画学算法之:hashtable