我们知道 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地址了。
如果市民 A 先生来找门卫大爷询问「北海公园」的地址,门卫大爷会先看一下自己的笔记本,找找看之前有没有人问过北海公园,如果没有,他就会拨打内线去找局长求助。局长说北海是西城区,你去问负责西城区道路信息的赵部长吧。门卫大爷又去问赵部长,赵部长查了一下,说这个地址你去问负责核心区的钱处长吧。门卫大爷又给钱处长打过去电话,钱处长说这个地址我也不掌握啊,你去问一下负责景山片区的科员小孙吧。门卫大爷从小孙那里终于知道了北海公园地址,他赶紧记到自己的小本本上,然后把结果告诉了市民 A 先生。接下来一小时内,如果还有市民 B 先生再来问北海公园的话,门卫大爷就直接用笔记本上记载的结果回复了。当然,如果市民 C 女士过来问别的地址的话,门卫大爷就要把处理 A 先生问询的流程再走一遍了。
从例子中我们也能看出为了优化整个流程效率,从访问节点起经过解析DNS请求的节点,这些节点都会将解析结果记录下来,用TTL(Time To Live)标记缓存时间。也就是在 TTL 时间之内,下一次继续解析记录在案的域名,对应缓存节点直接把域名对应的信息返回给请求方,一旦 TTL 时间到了则开始上述的请求。
前端网络预科 - 预备知识
在网络包发送之前,我们是必须知道接收方的IP地址以及MAC地址。所以在本篇当中,我们主要解决两个问题:
我们知道 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地址了。
在某篇博客看到了这样的例子,讲述解析过程蛮形象的,所以引用了下来:
从例子中我们也能看出为了优化整个流程效率,从访问节点起经过解析DNS请求的节点,这些节点都会将解析结果记录下来,用TTL(Time To Live)标记缓存时间。也就是在 TTL 时间之内,下一次继续解析记录在案的域名,对应缓存节点直接把域名对应的信息返回给请求方,一旦 TTL 时间到了则开始上述的请求。
在解析流程部分提及了域名结构,那么一个域名的结构是怎么样的呢?
当然你同样可以实践一下,查看某个域名背后解析路径是否遵循上述描述,请命令行执行:
现在我们已经获取到了目标服务器的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缓存表信息:
到了这里,我们终于知道了汇聚了构建请求包的必要条件:目标IP地址和MAC地址。接下来就开始创建TCP连接。
参考文献