You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
我们知道 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连接。
参考文献
The text was updated successfully, but these errors were encountered: