互联网是由各种不同作业(或角色)组成的奇妙世界,它让数以亿计的设备在一起进行交流。在这篇文章中,我们将深入到互联网中的一些关键角色,并剖析它们在网络中完成了哪些工作。
下面描写的内容不是全部,但足以涵盖数据包穿过整个互联网的流程。
主机 Host
主机通常来说指的是整个互联网的终端。任何在互联网的通信中作为起点或者终点的设备都可以被称为主机。
传统的例子是家庭电脑或者笔记本电脑。但在现代,终端有了更多的形态:智能手机,智能电视,智能手表,甚至是冰箱。
主机通过软件和应用来与用户进行交互,它们有时也需要在线路中进行一些传输。因此,我们可以说主机在OSI所有七层模型中运行。
网络通信的一个非常典型的例子,就是两个主机一个充当客户端,一个充当服务器。
客户端是请求的发起者,它需要一些信息或者数据。服务器是请求的接收者,它拥有客户端所需要的信息,数据。
网络 Network
网络是两个或多个设备,以相同的目的或者物理形式组成在一起。网络可以有多种形式,比如:
- 学校机房里多台电脑在一起属于同一个网络
- 屋子里的电脑,手机,或者打印机被相同的物理地址所连接,属于一个网络。
- 咖啡店的WIFI允许消费者连接到相同的WIFI网络
- 大公司可能使用多个网络,不同的工作角色使用不同的网络。
基于不同的目的,网络内的设备会与同一网络内的设备通信,也可能与不同网络内的设备通信。
交换机 Switch
交换机的主要目的是在网络内进行消息的转发。
交换机运作在OSI模型的第二层,所以它只查看第二层的标头。第二层包含的信息需要确保实现跳对跳,比如来源和最终的MAC地址。
交换机通过维护一个叫MAC地址表的东西来运行。这个表将MAC地址和插入的交换机端口做映射。
MAC地址表填充接收帧的源MAC地址字段。
为了转发帧,交换机在地址表中寻找目的地的MAC地址来决定使用哪个端口。
如果交换机遇到了一个它无法知道路径的MAC地址,它将被复制并从所有的端口泛洪(flood)出去。
路由器 router
路由器主要用来在不同网络间进行交流的网络设备。路由器的每个接口都会创建一个网络边界。
路由器在OSI模型的第三层运行,这意味着它只关注第三层的标头。第三层包含的信息需要确保实现端对端,比如IP地址。
在上图中,路由器R1和路由器R2分出了三段网络。(11.11.11.x, 22.22.22.x, and 33.33.33.x)R1右侧接口和R2左侧接口处在相同的网络中。
将数据从11.11.11.x发送到33.33.33.x的唯一方法就是就是将数据包转发到R1,再转发到R2,最终转发到目标服务器。
路由器通过一个路由表来完成这一系列的工作。这个表包含所有已知要达到的路径。这些路径被称为路由,每个路由都包括一个ip地址,和一个指向下一个路由地址的接口或ip地址。
记住,从每个路由器的角度,路由表映射的是已存在的每个网络。如果接收了一个去往不知道明确路径的数据包,那么对路由器来说,目标网络就是不存在的。因此,当路由器接收到一个数据包要发往没有存在路由表中的网络,数据包将被丢弃。
地址解决协议(ARP)
之前我们讨论了在第二层的MAC地址和第三层的IP地址,那么如果链接MAC和IP呢?答案就是地址解决协议——ARP。
一般来说,当两台主机通信。它们已经知道了对方的IP地址。了解对方IP地址的方法有很多种,有时是用户提供,有时是其它协议提供(比如DNS)。
然而,它们却不知道对方的MAC地址。所以主机会使用ARP来获取对方的MAC地址。换句话说,ARP使用已知的IP地址,来探索未知的MAC地址。探索的结果会保存在ARP表中,它映射IP地址和MAC地址。
下图桥接了第二层和第三层,并且展示了ARP的作用:
上图中有三个网络:紫色网络,灰色网络和红色网络。我们用这张图来描述两个ARP实例:第一个实例是与网络内的主机通信(客户端到紫色服务器)。第二个实例是和不同网络的主机进行通信(客户端到红色服务器)。
当客户端需要和紫色服务器通信,它会知道紫色服务器的IP地址,从而知道它在同一网络内。当客户端尝试在相同网络内与主机通信,客户端会向主机的MAC地址发送ARP请求。
ARP请求完成后数据包的头如下:
当客户端和红色服务器进行通信,它会知道服务器的IP地址,从而知道服务器不在同一网络内,因此数据包会发送到最近的路由器,也就是我们常说的默认网关。
客户端一般来说已经设置过默认网关了,在上图中就是R1。当客户端尝试向网络外的主机通讯时,客户端会向默认网关的MAC地址发送ARP请求。
此时数据包的头如下:
总结一下ARP的行为:
- 当客户端与网络内的主机通话,ARP向主机的MAC地址发送ARP请求。
- 当客户端与网络外的主机通话,ARP向默认网关的MAC地址发送ARP请求。
ARP的作用是帮助客户端根据第三层的标头创建第二层的标头,以便将数据包从一跳到下一跳。
还应该注意的是,任何设备打算根据IP地址(第三层)转发数据包,必须有能力传递数据包到下一跳(第二层)。