计算机网络基础 2

1,089 阅读13分钟

上一篇文章,我们顺着计算机网络的发展,一直谈到了为何计算机网络应该有路由和IP地址,接下来我们接着上一篇往下讲。

路由 &&IP

上一篇,我们谈到了交换机没有办法解决广播风暴的问题,所以我们在 MAC 地址的基础上增加了一个逻辑地址,即 IP 地址。引入了 IP 地址之后,所有的通信都要靠 IP 地址并且,多个广播域之间使用路由器连接,这个网络变成下面的样子。

图片描述

这样,一个大的广播域被路由器分割成多个小的广播域。现在两台主机之间的通信根据通信双方是否在同一个网段中分成了两种情况。

主机在同一个网段中

通信主机在同一个网段中,也就意味着通信不经过路由器就可以完成,通信形式跟在交换机中通信差不多,但是由于接收方只知道接收方 IP 地址,并不知道对方的 MAC 地址,发送发没有办法把数据发送给接收方。所以整个通信过程增加了一个步骤。

  • 主机 A 通过接收方 B 的 IP 地址发现接收方跟自己在同一个网段内,但是它只知道接收方的 IP 地址,不知道 MAC 地址,所以没有办法发送数据。
  • 于是主机A发起了一个广播询问 IP 地址为 XX 的主机的 MAC 地址是多少
  • 其他主机收到这个广播之后,跟自己的 IP 地址比对,发现自己的 IP 地址正是 XX,于是就把自己的 MAC 地址发送给 A。
  • A知道了接收方的 MAC 地址之后,就可以根据 MAC 地址向对方主机发送数据。

上面的通信过程,A 知道接收方的地址,但是不知道对方的 MAC 地址,于是发起了一个广播来询问。这种通过目标的 IP 地址来获得对方的MAC地址的过程称为地址解析协议 (ARP)

主机在不同网段中

通信主机在不同的网段中,这就意味着两台主机通信得经过路由器。 如此,通信过程就变成了下面这样:

  • 主机 A 通过接收方 X 的 ip 地址发现,接收方跟自己不在同一个网段中,于是直接把数据报文发送给路由器的端口 R1。
  • A 只知道路由器接口 R1 的 ip 地址,不知道 MAC 地址(这个时候 A 跟 R1 的通信还是在同一个网段中)。所以主机 A 通过 ARP 协议获取到了 R1 的 MAC 地址,然后把数据报文发送给路由器的接口 R1。
  • 路由器收到数据报文之后,得到接收方的 IP 地址。判断出接收方 IP 地址所在的网段,分析出可以通过 R2 接口可以到达这个网段,于是通过接口R2发送数据。
  • 接口R2知道接收方 X 的 IP 地址,但是同网段内通信要靠 MAC 地址,所以 R2 通过 ARP 协议获取到了 X 的 MAC 地址, 然后把数据发送给 X。

根据上面的过程,我们明白 IP 地址在整个通信中做了两件事:

  1. 用来判断通信双方是否在同一个网段中。
  2. 根据 IP 地址确定对方的 MAC 地址,然后才能发送数据。

现在回顾一下上面的通信过程,仍然存在着三个疑点:

  1. 路由器中 R1 跟 R2 的 MAC 地址一样么?
  2. 路由器怎么知道怎么通过接收方的地址判断出接收方在哪个网段上?
  3. 为什么主机A判断主机B跟自己不在同一个网段上,就会把数据发送给路由?
  4. 主机 A 为什么通过 IP 地址就可以确定接收方跟自己是否在同一个网段?

一个一个来回答这些问题:

路由器中 R1 跟 R2 的 MAC 地址一样么?

这个问题的本质是问路由器是否有多个 MAC 地址。我们这里以家用路由器为例,一般路由器会有两个 MAC 地址。家里用的无线路由器一般会分有 LAN (局域网)和 WAN (广域网)两种接口。这两种接口分别各自对应一个 MAC 地址。

而且,你会发现你家无线路由器会有多个 LAN 接口,但是WAN接口就一个,其中

  • WAN 接口接的网线是从运行商那里接过来的网线,这个网线通向了整个互联网世界。
  • 多个 LAN 接口是用于连接你家多台电脑设备的。

所以,你发现,如果 WAN 口没有接网线,你家多台电脑也可以通过连接 LAN 互相通信。

路由器怎么知道怎么通过接收方的地址判断出接收方在哪个网段上?

跟交换机/网桥类似,路由器内部也维护了一张表,称为路由表,概括的讲,这张表就记录了,这张表记录了哪个网段应该通向哪个接口。所以当路由器得到接收方的地址之后,通过接收方的 ip 地址比对路由表,就可以确定这些数据包应该发往哪里。

为什么主机 A 判断主机 B 跟自己不在同一个网段上,就会把数据发送给路由。

这里要引出一个网关的概念,注意,网关并不是一种网络设备,而是一个概念。但是由于历史原因, 很多时候会把网关称为路由器。除了网关,还有一个默认网关的东西,我们这个问题的答案就是默认网关,当 A 发现 B 跟主机不在同一个网络上,所以他没有办法把数据直接发送给 B,于是查找一下自己系统里面配置了一个默认网关地址,然后就直接把数据发送给了这个地址。

通过上面的描述可以知道:主机 A 配置的默认网关地址就是路由器的地址,当发现接收方不在同一个网络里,主机A不知道要把数据发送到哪里,就把数据发送给了路由器。因为主机A里面配置的默认网关地址就是路由器的 IP 地址。

数据发送给路由器之后,路由器通过路由表查找接收方 IP 所在的网段,如果正好路由表里面也没有记录这个 IP 所在 网段的信息,路由器也会查找自己的默认官网,然后把数据发送给这个网关。

上面的描述,我们可以得出一个结论,一台主机的默认网关肯定和这台主机在同一个网段中,因为主机必须要能够发送数据给默认网关。

最后一个问题

主机 A 为什么通过 IP 地址就可以确定接收方跟自己是否在同一个网段上

这个问题,需要展开IP地址的讲解,关于IP地址的内容比较多,独立出一个话题来讲。

IP 地址

你肯定很熟悉 IP 地址,但是不一定系统的了解过。你会经常看到类似 192.168.1.1 的字样就是IP地址。但是其实这只是简写,每个被 . 分割的每个部分其实是一个字节 (8bit) 的二进制数。为了人类可以比较容易的读懂 IP 地址,所以一般写的时候都是使用人类友好的十进制。192.168.1.1的真正面目应该是:11000000.10101000.00000001.00000001 所以你明白了 IP 地址中不可能出现大于 255 的数值,因为 8bit 能表示的最大的值就是 255。

一个 IPv4 地址被分为网络地址和本地地址:

  • 网络地址用来表示不同网络的
  • 本地地址用来表示同一个网络中的主机。

那么如何划分一个 IP 的网络部分和主机部分呢,这就要引入一个新的东西:子网掩码,你可以经常看到的:255.255.255.0 就是一个子网掩码。

把一个 IP 地址与子网掩码按照二进制的数值进行与运算就可以得出网络地址。

比如:IP 地址为 192.168.1.1 的主机 A,子网掩码为 255.255.255.0,那么 11000000.10101000.00000001.00000001 & 11111111.11111111.11111111.00000000 = 192.168.1.0,即网络地址为 192.168.1.0,那么只要有另一个主机 B 的 IP 地址为 192.168.1.X(0<X<255) 那么这 AB 这两台主机就在同一个网络,互相通信不用经过路由器。有时候,你也会看到这样子的写法 192.168.1.1/24 像这种写法就是 192.168.1.1/255.255.255.0 的简写,后面使用 24 表示的就是前面 24 位为网络位。

但是啊,IP 地址不止这么简单,虽然 IPv4 地址一共有 2^32 个,但是也不是所有地址都可以随随便便用的,你想想你一台主机搞个 1.1.1.1 的地址,别人也搞个 1.1.1.1 的地址,那就有问题了,所以有一个机构 ICANN 专门来管理 IP 地址的分配使用。这个机构把IP地址进行了分类,也就是你可能听过的 A 类,B 类,C 类地址,这里对这种划分做一个详细的分析。

A 类地址:

  • 网络位为 8 位,即 A 类地址的子网掩码为 255.0.0.0
  • 现在单独对网络位的 8 位再进行划分,首位为 0,后续的 7 位可以从 0 000 0001 ~ 0 111 1111 变化,即 A 类地址位于 1~127
  • 但是以 127 开头的地址划分为内部回环地址,不能使用,所以A类地址一共有 2^7-1 = 126个。
  • 每个网络可以容乃的主机位 2^24 个,但是主机位全 0 的位网络地址,主机位为 1 的为广播地址。所以真正可以容纳的主机为 2^24-2

通俗的解释一下上面的意思 :

  • 主机 A 的地址为 58.1.2.3/8,前面 58 位于 1~127 之间,所以这是一个 A 类地址。
  • 跟主机 A 位于同一个网络中的 IP 地址有 58.0.0.1 ~ 58.255.255.254,一共有 2^24-2 个。
  • 上面的范围不包括 58.0.0.058.255.255.255 两个地址,因为 58.0.0.0 是网络地址,58.255.255.255 是广播地址。
  • A 地址如果向 58.255.255.255 发送数据,那么 IP 地址介于 58.0.0.1 ~ 58.255.255.254 的主机都可以收到这个数据。

B 类地址

B 类地址的划分方式跟 A 类地址一样,只是在数据上有差异 :

  • 网络位为 16 位,即默认子网掩码为 255.255.0.0
  • 对网络位的前 8 位再进行划分,规定前面的 2 位必须为 10,从 10 00 0000 ~ 10 11 1111,即 B 类地址位于 128~191之间。
  • 每个网络可以容乃的主机数为 2^16-2 个。

C 类地址

  • 网络位为 24 位,即默认子网掩码为 255.255。255。0
  • 对网络位的前 8 位再进行划分,规定前面的 2 位必须为 10,即 110 0 0000 ~ 100 1 1111,即 B 类地址位于 192~223 之间。
  • 每个网络可以容乃的主机数位 2^8-2 个。

来一道计算机网络考试中必考的题目:主机 IP 为 192.168.1.1/24,请问该网络的网络地址是多少,可以容纳多少主机?如果你清楚了上面的过程,可以很容易的得出网络地址为 192.168.1.0,可以容纳的主机数为 2^8-2 个。

子网划分

我们发现 A 类网,一个网络中就有 2^24-2 个网络,这些网络地址处于同一个广播域中,显然这是不合理的,而且,很少有机构能够有那么多主机来充分使用这些 IP 地址。所以通常情况下,我们需要对这个大的网络进行子网划分

所谓子网划分就是把一个大的网络划分成多个小的网络,每个网络之间使用路由器来分割。我们使用一个例子来说明。

有一个 C 类地址 200.1.2.0/24。当前情况下,这个网络有 2^8-2 = 62 个 IP 地址。现在希望把这个网络划分成两个网络。

划分子网的主要做法是从 200.1.2.0 中的主机位拿出来若干位当做网络位。具体拿几位根据主机数而定。这里假设拿出 2 位充当网络位

图片描述

那么就有 00,01,10,11 四种可能,但是尽量不去使用 00,11 的地址,所以现在我们还可以划分成 2 个子网。

  • 第 1 个子网 IP 地址的最后 8 位 0100 0001 ~ 1011 1110
  • 第 2 个子网 IP 地址的最后 8 位 1000 0001 ~ 0111 1110

这样子

  • 第一个子网的 IP 地址为 200.1.2.65/26 ~ 200.1.2.126/26
  • 第二个子网的 IP 地址为 200.1.2.129/26 ~ 200.1.0.190/26

私有 IP

考虑一下对于一个公司而言,很多时候需要自己内部进行通信,但是又不想连接到互联网,因为可能造成机密泄露。所以 ICANN 在分配地址的时候就划分出了一些私有地址,其中规定:

  • A 类地址中 10.0.0.0/8~10.255.255.255/8 的地址为私有地址。
  • B 类地址中 172.16.0.0/16 ~ 172.31.0.0/16 为私有地址。
  • C 类地址中 192.168.0.0/24 ~ 192.168.255.0/24 位私有地址。

什么是私有地址?就是任何人都可以自己组建一个局域网使用这些 IP 地址,但是不能够把这些 IP 拿到公网(即互联网)中使用。而且,路由器碰到这些 IP 也不会转发。所以你会很经常看到 192.168.X.X 的 IP 地址,就是因为当前你是处于某一个局域网中。但是你可能就疑惑了虽然你的电脑的 IP 地址为 192.168.X.X 但是你仍然可以上网。这是因为有一个协议:地址转换协议 (NAT)

这个协议大概的作用就是,把私有地址映射到共有网络,典型例子为多台私有地址主机连接到一台具有公有 IP 的路由器(这个路由器应当具有 NAT 功能), 所有需要跟外网通信的主机都通过这台路由器,这台路由器会把私有地址转换成公有地址,这样子局域网的主机就可以访问互联网。

但是,这个协议很尴尬 ,因为他的出现破坏了现在互联网环境, 但是由于现在 IPv4 地址短缺,这个方法又可以有效的缓解 Ipv4 地址短缺的现状。所以预计在 IPv6 时代,这个协议就会被时代淘汰掉。