网络通信之IP地址

724 阅读10分钟

人生就是受苦受难。但勇者不懈抗争,最终主宰自我—— 拿破仑

前言

在上一篇,网络通信之生成HTTP消息中我们介绍了,针对浏览器如何生成 HTTP 消息,并且通过 HTTP 消息进行与服务器之间进行数据交互。我们是从上帝视角对该过程进行了描述,忽略了很多具体细节。而接下来,我们来讲讲和网络通信密不可分的一个部分:IP地址。

简明扼要

  1. IP 地址是一个网卡在网络世界的通讯地址,相当于我们现实世界的门牌号码
  2. lo 全称是loopback,又称环回接口,往往会被分配到 127.0.0.1 这个地址。这个地址用于本机通信,经过内核处理后直接返回,不会在任何网络中出现
  3. 对于 A、B、 C 类主要分两部分,前面一部分是网络号,后面一部分是主机号。
  4. IP 地址的主机号
    全 0:表示整个子网
    全 1:表示向子网上所有设备发送包,即“广播"
  5. 一个网络包要从一个地方传到另一个地方,除了要有确定的地址,还需要有定位功能
  6. MAC 地址更像是身份证,是一个唯一的标识
  7. 只要是在网络上跑的包,都是完整的,可以有下层没上层绝对不可能有上层没下层

文章概要

  1. IP地址是个啥?
  2. 无类型域间选路(CIDR)
  3. 公有 IP 地址和私有 IP 地址
  4. MAC 地址
  5. 动态主机配置协议(DHCP)

1. IP地址是个啥?

客户端(浏览器)生成 HTTP 消息之后,接下来需要委托操作系统将消息发送给 Web 服务器。在委托操作系统发送消息时,必须要提供的不是通信对象的域名,而是它的 IP 地址

我们可以通过一些命令,来查看本机的IP地址。

在 Windows 上是 ipconfig,在 Linux 上是 ifconfig/ip addr

我在自己的电脑中,搭建了一个Linux环境,那就按ip addr执行查看IP命令。

网卡和IP地址

命令显示了这台机器上所有的网卡。大部分的网卡都会有一个 IP 地址。

IP 地址是一个网卡在网络世界的通讯地址,相当于我们现实世界的门牌号码

127.0.0.1 就是一个 IP 地址。这个地址被点分隔为四个部分,每个部分 8 个 bit,所以 IP 地址总共是 32 位。这样产生的 IP 地址的数量很快就不够用了。于是就有了 有128 位的IPv6

这里有一个小的知识点

在 IP 地址的后面有个 scope,如果值是 global,说明这张网卡是可以对外的,可以接收来自各个地方的包。对于 lo 来讲,是 host,说明这张网卡仅仅可以供本机相互通信

lo 全称是loopback,又称环回接口,往往会被分配到 127.0.0.1 这个地址。这个地址用于本机通信,经过内核处理后直接返回,不会在任何网络中出现

本来 32 位的 IP 地址就不够,还被分成了 5 类。

IPv4地址分类

对于 A、B、 C 类主要分两部分,前面一部分是网络号,后面一部分是主机号

相当于现实中某条路上的“×× 号 ×× 室”。其中“号”对应的号码是分配给整个子网的,而“室”对应的号码是分配给子网中的计算机的,这就是网络中的地址。

  • “号”对应的号码称为网络号
  • “室”对应的号码称为主机号

这个地址的整体称为 IP 地址。

A、B、C 三类地址所能包含的主机的数量

C 类地址能包含的最大主机数量实在太少了,只有 254 个。而 B 类地址能包含的最大主机数量又太多了。6 万多台机器放在一个网络下面。


  1. 无类型域间选路(CIDR)

无类型域间选路,简称CIDR。这种方式打破了原来设计的几类地址的做法,将 32 位的 IP 地址一分为二,前面是网络号,后面是主机号。

10.11.12.13/24,这个 IP 地址中有一个斜杠,斜杠后面有个数字 24。这种地址表示形式,就是 CIDR。后面 24 的意思是,32 位中,前 24 位是网络号,后 8 位是主机号。

伴随着 CIDR 存在的,一个是广播地址10.11.12.255。如果发送这个地址,所有 10.11.12 网络里面的机器都可以收到。另一个是子网掩码255.255.255.0

IP 地址的主机号
全 0:表示整个子网
全 1:表示向子网上所有设备发送包,即“广播"


3. 公有 IP 地址和私有 IP 地址

表格最右列是私有 IP 地址段。平时我们看到的数据中心里,办公室、家里或学校的 IP 地址,一般都是私有 IP 地址段。因为这些地址允许组织内部的 IT 人员自己管理、自己分配,而且可以重复。因此,你学校的某个私有 IP 地址段和我学校的可以是一样的。

公有 IP 地址有个组织统一分配,你需要去买。

表格中的 192.168.0.x 是最常用的私有 IP 地址。

针对192.168.0.x/24不需要将十进制转换为二进制 32 位,就能明显看出 192.168.0 是网络号,后面是主机号。而整个网络里面的第一个地址 192.168.0.1,往往就是你这个私有网络的出口地址。

例如,你家里的电脑连接 Wi-Fi,Wi-Fi 路由器的地址就是 192.168.0.1,而 192.168.0.255 就是广播地址。一旦发送这个地址,整个 192.168.0 网络里面的所有机器都能收到。


4. MAC 地址

在 IP 地址的上一行是 link/ether xxxx,这个被称为MAC 地址,是一个网卡的物理地址,用十六进制,6 个 byte 表示。

MAC 地址全局唯一,不会有两个网卡有相同的 MAC 地址,而且网卡自生产出来,就带着这个地址。

很多人看到这里就会想,只要知道了对方的 MAC 地址,就可以把信息传过去。这是行不通的。一个网络包要从一个地方传到另一个地方,除了要有确定的地址,还需要有定位功能。 而有门牌号码属性的 IP 地址,才是有远程定位功能的。

MAC 地址更像是身份证,是一个唯一的标识。它的唯一性设计是为了组网的时候,不同的网卡放在一个网络里面的时候,可以不用担心冲突。从硬件角度,保证不同的网卡有不同的标识

MAC 地址是有一定定位功能的,只不过范围非常有限。MAC 地址的通信范围比较小,局限在一个子网里面


5. 动态主机配置协议(DHCP)

只要是在网络上跑的包,都是完整的,可以有下层没上层绝对不可能有上层没下层

假设,我们想要在源 IP 地址为 16.158.23.6 的机器上访问目标 IP 地址 为 192.168.1.6机器的数据。发现包发不出去,这是因为 MAC 层还没填。

自己的 MAC 地址自己知道。但是目标 MAC 填什么呢?是不是填 192.168.1.6 这台机器的 MAC 地址呢?

当然不是。Linux 首先会判断,要去的这个地址和我是一个网段的吗,或者和我的一个网卡是同一网段的吗?只有是一个网段的,它才会发送 ARP 请求,获取 MAC 地址。

如果发现不是,Linux 默认的逻辑是,如果这是一个跨网段的调用,它便不会直接将包发送到网络上,而是企图将包发送到网关

如果你配置了网关的话,Linux 会获取网关的 MAC 地址,然后将包发出去。对于 192.168.1.6 这台机器来讲,虽然路过它家门的这个包,目标 IP 是它,但是无奈 MAC 地址不是它的,所以它的网卡是不会把包收进去的。

手动配置需要不停的对自己机器的IP进行配置。是一件很麻烦的事。

需要有一个自动配置的协议,也就是称动态主机配置协议(Dynamic Host Configuration Protocol),简称DHCP。

只需要配置一段共享的 IP 地址。每一台新接入的机器都通过 DHCP 协议,来这个共享的 IP 地址里申请,然后自动配置好就可以了。等人走了,或者用完了,还回去,这样其他的机器也能用。

解析 DHCP 的工作方式

当一台机器新加入一个网络的时候,只知道自己的 MAC 地址。这时候的沟通基本靠“吼”。这一步,我们称为DHCP Discover

新来的机器使用 IP 地址 0.0.0.0 发送了一个广播包,目的 IP 地址为 255.255.255.255。广播包封装了 UDP,UDP 封装了 BOOTP(Bootstrap Protocol,引导程序协议)。其实 DHCP 是 BOOTP 的增强版。

在这个广播包里面,新人大声喊:我是新来的(Boot request),我的 MAC 地址是这个,我还没有 IP,谁能给租给我个 IP 地址!

广播包

如果在网络里面配置了DHCP Server的话,他就相当于这些 IP 的管理员。当一台机器带着自己的 MAC 地址加入一个网络的时候,MAC 是它唯一的身份,如果连这个都重复了,就没办法配置了。

只有 MAC 唯一,IP 管理员才能知道这是一个新人,需要租给它一个 IP 地址,这个过程我们称为DHCP Offer

DHCP Offer 的包格式

DHCP Server 仍然使用广播地址作为目的地址。因为,此时请求分配 IP 的新人还没有自己的 IP。

如果有多个 DHCP Server,这台新机器会收到多个 IP 地址,它会选择其中一个 DHCP Offer,一般是最先到达的那个,并且会向网络发送一个 DHCP Request 广播数据包,包中包含客户端的 MAC 地址、接受的租约中的 IP 地址、提供此租约的 DHCP 服务器地址等,并告诉所有 DHCP Server 它将接受哪一台服务器提供的 IP 地址,告诉其他 DHCP 服务器,并请求撤销它们提供的 IP 地址,以便提供给下一个 IP 租用请求者。

DHCP Request的包格式

由于还没有得到 DHCP Server 的最后确认,客户端仍然使用 0.0.0.0 为源 IP 地址、255.255.255.255 为目标地址进行广播。

当 DHCP Server 接收到客户机的 DHCP request 之后,会广播返回给客户机一个 DHCP ACK 消息包,表明已经接受客户机的选择,并将这一 IP 地址的合法租用信息和其他的配置信息都放入该广播包,发给客户机。

通过如上操作,一台新的机器就被分配了指定的IP地址。通过该IP地址,就可以和网络中的其他机器进行通信了。

后记

分享是一种态度,这篇文章,主要的篇幅来自于《趣谈网络协议》,算是一个自我学习过程中的一种记录和总结。主要是把自己认为重要的点,都罗列出来。同时,也是为大家节省一下排雷和踩坑的时间。当然,可能由于自己认知能力所限,有些点,没能表达的很好。如果大家想看原文,“墙裂推荐”看原文。

参考资料:

  1. 趣谈网络协议
  2. 网络是如何连接的

看都看到这里了,那就劳烦,动动小手手,一键三连哇