在之前讨论OSI模型和关键角色中,我们简单的讨论到了主机间的通信。终于,在这篇文章中我们可以深入的学习主机通信里的一些具体细节。
互联网的核心思想是两台电脑可以互相交流。尽管很少发生两台主机直连的现象,但了解多台主机通过路由器或者交换机进行通信是非常重要的。
本文重点关注主机之间的通信,以及整个流程中每一个重要的步骤。
主机间的通信
由于下图没有路由器的参与,我们可以知道所有通信发生在同一个网络内——所以,主机A和主机B都配置了属于统一网络的IP地址。
每一个主机都有唯一的IP地址和MAC地址。由于主机所属于第三层(L3)的设备,因此它有ARP的表。不过在目前,ARP的表是空的。
主机A为主机B生成一些数据。主机A知道数据终点的IP地址是10.10.10.20(HOST B)。主机A也知道它自己的IP地址(10.10.10.10),因此它可以创建第三层带有源IP和目标IP的标头。
但我们之前有谈到过,数据包传递是第二层的工作,所以尽管主机可以找到另一台主机的IP,但是第二层的标头还是要创建的。
源主机第二层的标头是A的MAC地址(aaaa.aaaa.aaaa)。目标的第二层的标头应该是主机B的MAC地址,但在这时,主机A的ARP表里还没有指向B主机IP地址的入口,因此主机A还不知道主机B的MAC地址。
结果是,主机A不能创建正确的将数据包传递给主机B的第二层标头。所以需要主机A初始化一个为了获取所需信息的ARP请求。
ARP请求是一个包含“如果有IP为10.10.10.20的同学,请把你的IP地址给我”消息的单个数据包。
记住,此时主机A不知道主机B是否存在。事实上,由于主机A不能直接给主机B发这个消息,因此,它需要让整个网络内的的主机(或者路由器)都知道这条信息。ARP请求是一个广播,网络内所有的的节点都可以收到ARP请求。
注意,主机A的ARP表中是包含自己的MAC地址的,如果主机B的也存在在表中,那么它是可以直接响应主机A发来的请求的。
接收ARP请求也可以让主机B记忆一些东西,比如将主机A的IP(10.10.10.10)和主机A的MAC地址进行关联,并记录在主机B的ARP表中。
主机B用记录的信息直接响应回主机A。ARP的响应是一种称为单播的消息,可以直接发送给消息A。其它在网络内的主机是不会收到这条消息的。
ARP的响应包含主机A请求的信息:主机B的IP地址和MAC地址。主机A会把这些信息保存在自己的ARP表中。
随着主机A的ARP表被填充,主机A现在可以成功的将正确的第二层标头和数据包发送给主机B了。