了解完网络协议,我们会发现,网络通信的五层模型里,有两个很重要的概念:IP 地址和 MAC 地址。
那么 IP 地址是怎么来的,又是怎么没的?MAC 地址与 IP 地址又有什么区别?
这回答上面问题前,先热下身,大家知道如何查看本机的 IP 吗?这个问题,即便是没有专业学过计算机的人,只要折腾过电脑,重装过系统,大多都会知道答案:在 Windows 下是 ipconfig,在 linux 下是 ifconfig。
(资料图片仅供参考)
在 Windows 下输入 ipconfig,我们会看到这个界面:
在 linux 下输入 ifconfig,我们会看到这个界面:
IP 地址
可以看到,无论是在 Windows 还是在 linux 下,输入相关命令都能显示出这台机器上所有的网卡。大部分的网卡都会有一个 IP 地址。就像 192.168.1.73 ,就是我本机以太网的 IP 地址。
IP 地址是一个网卡在网络世界中的通讯地址,相当于我们现实世界的门牌号码。
注意,IP 地址是网卡的通讯地址,不是一台机器的通讯地址。很多时候,我们会说一个电脑只有一个 IP 地址,这种说法实质上并不正确,准确的来说,应该是:
一个网卡在同一时段只能有一个 IP 地址,一台机器可以有多个 IP 地址。
就像我们的笔记本,一般都会有线网卡和无线网卡,则有线网卡有一个 IP 地址,无线网卡也有一个 IP 地址。
一台机器有多个 IP 地址,那 IP 地址会不会重复呢?其实我们应该会碰到 IP 地址重复的情况。有时候我们电脑弹出网络地址冲突,出现无法上网的情况,那多半就是 IP 地址冲突了。
格式
就像上面输出的结果,192.168.1.73 就是一个 IP 地址。这个地址被点(.)分割为四个部分,每个部分有 8 个 bit,所以 IP 地址总共是 32 位。显然,32 位产生的 IP 地址在当今这个互联网社会,很明显就是”狼多肉少”。于是就有了 IPv6,也就是上面结果中的 fe80::515d:5483:ff4d:6db9/64。这个有 128 位,能满足我们现在的需求了。至于后面会不会出现 IPv8 ,那就看后面互联网世界的发展了。
分类
我们应该都听说过,IP 地址分为 A、B、C、D、E 五类。对于 A、B、C 类,主要分两部分,前面一部分是网络号,后面一部分是主机号。
下图是 A、B、C 三类地址所能包含的主机数量。
这里面有个问题,C 类地址包含的主机数量太少,而 B 类地址包含的主机数量又太多,于是就有了一个折中的方式叫做无类型域间选路。
无类型域间选路
顾名思义,无类型域间选路(CIDR)基本思想是取消地址的分类结构,取而代之的是允许以可变长分界的方式分配网络数。192.168.1.73/24 就是无类型域间选路格式的 IP 地址。这种格式的 IP 地址,将 32 位的 IP 地址一分为二,前面是网络号,后面是主机号。从哪里分呢?如果注意观察的话可以看到,上面地址中有一个斜杠,斜杠后一个数字 24。这个 24 的含义就是,前24 位是网络号,后 8 位是主机号。
公有 IP 地址和私有 IP 地址
继续看上面的表格。表格最右列是私有 IP 地址段。平时我们在一个局域网内,看到的 IP 地址都是私有 IP 地址。因为这些地址允许组织内部的 IT 人员自己管理和分配,而且还可以重复。所以会出现你局域网的私有 IP 地址段和我局域网的是一样的。
就像我们上面说的,小明在自己家里给同单元的小伙伴说自己是五单元 101 号,小伙伴能理解,但是他如果这样和小红说,小红就会问,你是哪个小区的?这里的小区实际上就是公有 IP 地址,而五单元 101 号就是私有 IP 地址。
表格中的 192.168.0.x 是最常见的私有 IP 地址段。就像我们家里的路由器地址一般是 192.168.0.1 一样。
IP 分配与释放
IP 分配我们平时应该接触比较少。还记得在大学的时候,刚入学第一件事就是赶紧交网费。交网费时会有一个步骤,网管会让你提供 MAC 地址,然后把 IP 地址和 MAC 地址绑定,这也就是博主在隔壁宿舍无法通过网线上网的原因。
其实,如果你有相关的知识积累,可以用命令行自己配置 IP 地址。当然,能不能通信就看你的知识储备量了。
除了命令行配置外,我们平时应该对于 IP 分配应该都是用的 “拿来主义”。无论是在学校还是在办公室,都会有网络管理员把分配好的 IP 给你,直接使用就可以了。但是有时候也会好奇,网管是怎么分配 IP 的呢?难不成通过命令行一个个配置?这时候就要用到动态主机配置协议(DHCP)。
动态主机配置协议
这个协议的工作原理是怎样的呢?我们就拿一台机器新加入一个网络为例,来走一遍 DHCP 的工作流程。
当一台机器新加入一个网络时,肯定一脸懵逼,啥情况也不知道,只知道自己的 MAC 地址。没人理你怎么办?那不管三七二十一,先吼一声,告诉所有人,我来了,有人吗?这时候的沟通基本靠”吼”。这一步,我们称为 DHCP Discover。
新来的机器使用 IP 地址 0.0.0.0 发送了一个广播包,目的 IP 地址是 255.255.255.255。广播包封装在 UDP 里面,UDP 封装在 BOOTP 里面。在这个广播包里,新人大喊:我是新来的(Boot Request),我的 MAC 地址是 xxx,我还没有 IP,谁能给我个 IP 地址?格式就像下面这样:
这时候,网络里的 DHCP Server 就相当于这个局域网的管理员。他知道来了一个”新人”,需要给它分配一个 IP 地址,这个过程就是 DHCP Offer。同时,DHCP Server 保留为此机器提供的 IP 地址,从而不会再将相同的 IP 地址分配给其它的机器。而 DHCP Offer 的格式就像下图,里面有给新人分配的地址。
DHCP Server 仍然使用广播地址作为目的地址,因为,此时请求分配的新人还没有自己的 IP 地址。如果一个局域网中有多个 DHCP Server,这台新机器会收到多个 DHCP Offer。
它会选择其中一个 DHCP Offer,一般是最先到达的那个,并且会向网络发送一个 DHCP Request 广播数据表,包中包含客户端的 MAC 地址、接受分配的 IP 地址、提供此 IP 的 DHCP 服务器地址等,并告诉所有的 DHCP Server 它将接受哪一台服务器提供的 IP 地址,告诉其他 DHCP 服务器撤销它们提供的 IP 地址,以便提供给下一个 IP 请求分配者。新人广播包格式如下:
此时,由于还没有得到 DHCP Server 的最后确认,新机器仍然使用 0.0.0.0 为源 IP 地址、255.255.255.255 为目标地址进行广播。
当 DHCP Server 接收到新机器的 DHCP Request 之后,会广播返回给新机器一个 DHCP ACK 消息包,表明已经接受新机器的选择,并将这一 IP 地址分配信息和其他配置信息都放入该广播包,发给新机器。DHCP ACK 格式如下:
新机器收到 DHCP ACK 后,会检测分配的 IP 地址是否能够适应,如果不能使用,它就会给 DHCP Server 发出 DHCP Decline 消息,通知 DHCP Server 禁用这个 IP 地址,然后新机器就开始新的地址申请过程。
在新机器使用 IP 租期超过 50% 时,DHCP Client 会以单播形式向 DHCP Server 发送 DHCP Request 报文来续租 IP 地址。如果 DHCP Client 成功收到 DHCP Server 发送的 DHCP ACK 报文,则按相应时间延长 IP 地址租期;如果没有收到 DHCP Server 发送的 DHCP ACK 报文,则 DHCP Client 继续使用这个 IP 地址。
在新机器使用 IP 租期超过 87.5% 时,DHCP Client 会以广播形式向 DHCP Server 发送 DHCPRequest 报文来续租 IP 地址。如果 DHCP Client 成功收到 DHCP Server 发送的 DHCP ACK 报文,则按相应时间延长 IP 地址租期;如果没有收到 DHCP Server 发送的 DHCP ACK 报文,则 DHCP Client 继续使用这个IP地址,直到 IP 地址使用租期到期时,DHCP Client 才会向 DHCP Server 发送 DHCP Release 报文来释放这个 IP 地址,并开始新的 IP 地址申请过程。
MAC 地址
在我们查询 IP 地址的输出结果中,有一行:
Link encap:Ethernet HWaddr 28:d2:44:ce:77:51
这个被称为 MAC 地址,是一个网卡的物理地址,用十六进制,6 个 byte 表示。
MAC 地址是一个很容易让人误解的地址。因为 MAC 地址号称全球唯一,不会存在有相同 MAC 地址的网卡。这就很容易让我们想,既然全球唯一,那网络通信直接用 MAC 地址不行吗?为什么要加个 IP 地址,多封装一层,再去通信呢?
当然是不行的。我们想把一个网络包从一个地方传到另一个地方,除了有确定的地址外,还需要有定位功能。就像你去广州找博主一样,我只告诉你我的身份证号,你能在广州找到我吗?这种寻找无异于大海捞针。但是如果我告诉你我的详细地址,你就可以直接通过导航找到对应的地址,然后再找到我。
IP 地址在一定程度上就承担了详细地址这种远程地位的功能。MAC 地址更像是身份证号,是一个唯一的标识。它的唯一性设计是为了组网的时候,不同的网卡放在一个网络里面,不用担心冲突。
当然,MAC 地址也有一定的定位功能。就像你来到了博主所在的办公室,你可以在办公室喊身份证号是 XXX 的是哪位?博主听到了,就会站起来回答你。但是如果你在博主听不到的地方喊,那肯定不会有人应你。这就说明,MAC 地址的通信范围比较小,仅仅局限在一个子网内。