baixiaoji / blog

writting & thinking
3 stars 0 forks source link

前端网络预科 - 预备知识 #30

Open baixiaoji opened 4 years ago

baixiaoji commented 4 years ago

前端网络预科 - 预备知识

在网络包发送之前,我们是必须知道接收方的IP地址以及MAC地址。所以在本篇当中,我们主要解决两个问题:

  1. 如何知道接受方的 IP 地址?(DNS)
  2. 如何知道接收方的 MAC 地址?(ARP)

我们知道 IP 是 32 位的二进制数字,为了让人方便记忆和使用,我们每八位隔开并将其转化为十进制数字。即便是这样的数字,记个一两个还是可以接受的;倘若记个10个以上的IP地址,这应该算是一种折磨了吧。所以在 1983 年保罗·莫卡派乔斯发明了域名以及域名的周边服务。

域名比IP更容易记忆,本质上只是为 IP 提供了易于记忆的别名,就好像我们的通讯录中的映射关系,域名就好像通讯录中的朋友的姓名,而电话号码就好像IP一样。

单凭一个别名是无法访问到正确的地址,只有能够域名解析成实际的网络地址,才能访问成功。而解析这项工作则有 域名系统 (DNS - Domain Name System)完成。

那DNS的解析流程是怎么样的呢?

在客户端中输入域名(www.domain.unknow.com)的时候,客户端会请求最近的一台 DNS 服务器(也就是你电脑上网络设置中填写的DNS服务器的IP地址),由于最近的 DNS 服务器并没存放域名对应IP的信息,所以就开始从顶层向下查找。首先去根域 DNS 服务器下查看,明显根域并没有对应的信息,但根据域名结构可以判断,这个域名属于 com 域,因此根域返回 com 域的DNS服务器的 IP地址最近的DNS服务器。然后最近的DNS服务器,开始给com域的DNS服务器发送查询请求。但com域的DNS服务器同样没有对应的信息,同样根据域名结构给出来 unknow.com 域下的DNS 服务器IP地址。同样的最近的DNS服务器再次请求,以此类推多次请求过后,最终是可以找到目标DNS服务器,然后向目标DNS发送请求,即可获得对应的IP地址了。

某篇博客看到了这样的例子,讲述解析过程蛮形象的,所以引用了下来:

假设北京市设立了一个专门的「道路咨询局」,里面设置了局长、部长、处长、科员好几个级别的公务员,不同的部门、科室、人员负责解答不同区域的道路问题。这里的人都有一个共同特点,信奉「好记性不如烂笔头」的哲理,喜欢将自己了解到的信息记录到笔记本上。但是有一点遗憾的是,他们写字用的墨水只有一种,叫「魔术墨水」,初写字迹浓厚,之后会慢慢变淡,1 小时之后则会完全消失。道路咨询局门口还有一个门卫大爷,所有的人要问路都需要通过他来传达和回复,市民并不能进入办公楼。

如果市民 A 先生来找门卫大爷询问「北海公园」的地址,门卫大爷会先看一下自己的笔记本,找找看之前有没有人问过北海公园,如果没有,他就会拨打内线去找局长求助。局长说北海是西城区,你去问负责西城区道路信息的赵部长吧。门卫大爷又去问赵部长,赵部长查了一下,说这个地址你去问负责核心区的钱处长吧。门卫大爷又给钱处长打过去电话,钱处长说这个地址我也不掌握啊,你去问一下负责景山片区的科员小孙吧。门卫大爷从小孙那里终于知道了北海公园地址,他赶紧记到自己的小本本上,然后把结果告诉了市民 A 先生。接下来一小时内,如果还有市民 B 先生再来问北海公园的话,门卫大爷就直接用笔记本上记载的结果回复了。当然,如果市民 C 女士过来问别的地址的话,门卫大爷就要把处理 A 先生问询的流程再走一遍了。

从例子中我们也能看出为了优化整个流程效率,从访问节点起经过解析DNS请求的节点,这些节点都会将解析结果记录下来,用TTL(Time To Live)标记缓存时间。也就是在 TTL 时间之内,下一次继续解析记录在案的域名,对应缓存节点直接把域名对应的信息返回给请求方,一旦 TTL 时间到了则开始上述的请求。

在解析流程部分提及了域名结构,那么一个域名的结构是怎么样的呢?

# 主机名.次域名.顶级域名.根域名
# www.domain.unknow.com.root

当然你同样可以实践一下,查看某个域名背后解析路径是否遵循上述描述,请命令行执行:

dig +trace <domain_name>

现在我们已经获取到了目标服务器的IP地址了,但是请求包中还差一个目标服务器的MAC地址,而这个地址如何获取呢?—— ARP (Address Resolution Protocol)。

ARP 的工作原理是什么样的呢?

在局域网中,本机发送以广播的形式发送ARP请求包,而包中的信息大概是:「请IP为xxx的机器告诉我你的MAC地址,署名我的IP:xxx,MAC:XXX」。然后交换机或是WIFI设备接受到了广播包,将其发送给局域网内的所有机器,接收到了请求包的机器拆开看IP不是本机IP就丢弃了请求包,唯独请求包中的目标IP与本机IP相同的机器,开始定向向发送方发送ARP响应包,发送方一旦接受到ARP响应包,则写入本机的ARP缓存表中。

上述是同网段请求MAC地址,可我们日常生活中需要知道的是跨网段IP的MAC地址。

这种情况下,ARP请求包会转发给网关,然后网关将自身的MAC地址回复给请求方,而自身同样同个广播ARP请求包形式去获取对应IP的MAC地址,最终请求方存储在自身机器上的ARP缓存表是网段网关地址的MAC地址。

你可以通过如下命令去查看机器的ARP缓存表信息:

arp -a

到了这里,我们终于知道了汇聚了构建请求包的必要条件:目标IP地址和MAC地址。接下来就开始创建TCP连接。

参考文献

  1. 网络是怎样连接的
  2. 域名背后那些事
  3. 图解ARP协议(一)