DNS解析和浏览器输入url解析流程 Day2

本文详细介绍了DNS解析的过程,包括从浏览器缓存、操作系统、hosts文件到本地DNS服务器的查询路径,以及DNS协议使用UDP和TCP的情况。还阐述了浏览器解析URL的步骤,从生成HTTP请求到TCP三次握手和IP传输。另外,文中提到了DNS劫持的概念及防范措施,并讨论了域名缓存在提高查询效率中的作用。

掌握 DNS 的解析过程 + 用到的协议

DNS解析过程

浏览器会先看自身有没有对这个域名的缓存,如果有,就直接返回,如果没有,就去问操作系统,操作系统也会去看自己的缓存,如果有,就直接返回,如果没有,再去 hosts 文件看,也没有,才会去请求「本地 DNS 服务器」。
DNS 中的域名都是用句点来分隔的,比如 www.server.com,这里的句点代表了不同层次之间的界限。
在域名中,越靠右的位置表示其层级越高。最右端省略了一个.表示根域名服务器。它保存在所有DNS服务器中。
本地DNS服务器收到客户端解析器的请求后也会先去缓存里找有没有对应域名IP,没有就会去根域名服务器开始迭代查找,根域名服务器会告知下一步该去哪个顶级域名服务器查找,每次查询要么返回目标IP,要么返回下一个层次的DNS服务器IP,最后本地DNS服务器得到了目标IP 地址或报错,然后把这个结果返回给发起查询的解析器。

用到的协议

DNS协议运行在UDP/TCP协议之上,使用的端口号是53(绝大部分情况DNS解析是使用UDP 53端口)。
以太网帧在局域网中的MTU是1500byte,但是在非局域网环境,如:internet下的时候,MTU是各个路由器进行一个配置的。所以,通常路由器默认的MTU为576字节。所以,为了适应网络环境,DNS协议在返回的数据报大于512的时候,就转化为了TCP协议。
有三种情况会使用TCP。
1.解析器发出一个请求后,返回的response中的TC删节标志比特位被置1时,说明报文因为超长而有删节,因为UDP最大长度是512字节。这时解析器发现后,将使用TCP重发request,TCP允许报文超过512字节。
2.进行区域传输时
一个区中主DNS服务器从自己本机的数据文件中读取该区的DNS数据信息,而辅助DNS服务器则从区的主DNS服务器中读取该区的DNS数据信息,传输协议是tcp。
因为区域传输数据量比单次DNS查询多得多,而且更要求安全性。
3.当域名解析的返回报文的长度超过512字节时,将不能使用udp协议进行解析,此时必须使用tcp。通常传统的UDP报文一般不会大于512字节。

浏览器输入一个url的解析过程

1. 解析url并生成http请求
生成发送给 Web 服务器的请求信息
解析得出协议,服务器名,路径名
生成对应的http请求,(请求行,请求头,请求空行,消息体)

2.DNS查询IP地址
查询服务器域名对应的 IP 地址,域名用句点分隔,代表了不同层次之间的界限,越靠右层级越高,最右侧表示.根域名,然后是.com顶级域,再往下是权威DNS服务器。层级关系类似一个树状结构。
首先浏览器查看DNS缓存,没有的话操作系统查看hosts文件,再没有会去询问本地DNS服务器。本地DNS收到请求后会先查看缓存,没有就会从根域名迭代查找,最终找到目标ip地址返回给本地DNS服务器,服务器再将ip地址返回给客户端,客户端和目标建立连接。
3. 调用socket委托协议栈工作
协议栈每个部分承担不同的工作,上下关系具有一定规则。上层会向下层委托工作。
协议栈的上半部分有两块,负责收发数据的 TCP 和 UDP 协议,这两个传输协议会接受应用层的委托执行收发数据的操作。
协议栈的下面一半是用 IP 协议控制网络包收发操作,在互联网上传数据时,数据会被切分成一块块的网络包,而将网络包发送给对方的操作就是由 IP 负责的。
IP 中还包括 ICMP 协议和 ARP 协议。
4.传输TCP
增加TCP报文头部,确认源端口号和目标端口号,包的序号,确认号,状态位。还要注意窗口大小作流量控制,除此之外TCP还会控制发送速度,作拥塞控制。在传输HTTP之前,需要做TCP三次握手。由SYN和ACK控制,客户端SYN-SEND,服务端SYN-RCVD,双方ESTABLISHED。三次握手是为了保证双方都有发送和接收的能力。可以通过netstat -napt命令查看TCP状态。
数据会被以 MSS 的长度为单位进行拆分,拆分出来的每一块数据都会被放进单独的网络包中。也就是在每个被拆分的数据加上 TCP 头信息,然后交给 IP 模块来发送数据。
TCP 协议里面会有两个端口,一个是浏览器监听的端口(通常是随机生成的),一个是 Web 服务器监听的端口(HTTP 默认端口号是 80, HTTPS 默认端口号是 443)。
5.IP远程定位
IP头部主要包含源地址 IP 和 目标地址 IP,十六进制协议号(TCP06)。
源地址通过路由表规划,使用route -n 命令查看路由表。
源地址与每一个条目的子网掩码(Genmask)进行与运算,如果和条目的Destination一致,就选择该网卡作为源地址,如果都不一致就选择默认网关,后续就把包发给路由器,Gateway 即是路由器的 IP 地址。
6.MAC两点传输
MAC头部主要包含发送方 MAC 地址和接收方目标 MAC 地址以及协议类型(IP,ARP)。
MAC 地址是在网卡生产时写入到 ROM 里的,接收方MAC获取方式是先通过路由表获取接收方IP,再在ARP缓存中查找有没有对应MAC地址,没有就再通过ARP协议在以太网中以广播的形式,对以太网所有的设备广播IP地址,对应设备会返回MAC地址,后续会把查询结果放置在ARP缓存中。
arp -a命令查看arp缓存。
7.网卡
需要通过网卡将数字信号转化为电信号,通过网卡驱动程序控制网卡硬件,将网络包复制到网卡内的缓存区中,接着会在其开头加上报头和起始帧分界符,在末尾加上用于检测错误的帧校验序列FCS。
8.交换机
将网络包原样转发到目的地。交换机工作在 MAC 层,也称为二层网络设备。
电信号到达网线接口,交换机里的模块进行接收,接下来交换机里的模块将电信号转换为数字信号。
然后通过包末尾的 FCS 校验错误,如果没问题则放到缓冲区。
但是交换机的端口不核对接收方 MAC 地址,而是直接接收所有的包并存放到缓冲区中。因此,和网卡不同,交换机的端口不具有 MAC 地址。
然后查询MAC地址表中是否有接收方MAC记录,找到对应发送端口。如果找不到,说明没有发送过或者纪录被删除,只能将包转发给除了源端口的所有端口上,只有相应的接收者才接收包,而其他设备则会忽略这个包,然后返回响应包,就被写入地址表,就不会再次所有端口发送了。如果MAC是广播地址就会直接发送到所有端口。
9.路由器
在此被转发到下一个路由器或目标设备,路由器是基于 IP 设计的,是三层网络设备,路由器的各个端口都具有 MAC 地址和 IP 地址。
电信号到达网线接口部分,路由器中的模块会将电信号转成数字信号,然后通过包末尾的 FCS 进行错误校验。然后检查MAC是不是发给自己的,是的话就放入缓冲区。
然后丢弃包的MAC头部,获取IP头部,查询路由表,与IP定位过程一样。找不到匹配路由时,就会选择默认路由,路由表中子网掩码为 0.0.0.0 的记录表示「默认路由」。
然后发送包,根据路由表的网关列判断对方的地址。如果网关列为空,则说明已到达终点。然后继续通过ARP缓存或者协议找到目标MAC地址,生成MAC头部,继续通过交换机发送到下一个路由器。
源 IP 和目标 IP 始终是不会变的,一直变化的是 MAC 地址,因为需要 MAC 地址在以太网内进行两个设备之间的包传输。
10.到达服务器和客户端
检查并去掉MAC头部,判断是否发送给自己。
检查并去掉IP头部,判断使用的协议TCP。
检查并去掉TCP头部,查看序列号是否是想要的,是就放入缓存,并返回ACK,同时获取端口号。
HTTP服务正在监听该端口号,服务器就将包发给对应进程,然后将响应数据封装在HTTP 响应报文里。也是以同样的流程将响应发送给客户端,客户端足以后去掉所有头部得到响应数据交给浏览器渲染。
最后,客户端向服务器发送TCP四次挥手,此次连接断开。

DNS为什么用UDP

当向 DNS 服务器查询域名 ( 域名解析) 的时候,一般返回的内容不会超过 UDP 报文的最大长度,即 512 字节。用 UDP 传输时,不需要经过 TCP 三次握手的过程,从而大大提高了响应速度,但这要求域名解析器和DNS服务器都必须自己处理超时和重传从而保证可靠性。

DNS劫持

DNS 劫持即域名劫持,是通过将原域名对应的 IP 地址进行替换从而使得用户访问到错误的网站或者使得用户无法正常访问网站的一种攻击方式。域名劫持往往只能在特定的网络范围内进行,范围外的 DNS 服务器能够返回正常的 IP 地址。攻击者可以冒充原域名所属机构,通过电子邮件的方式修改组织机构的域名注册信息,或者将域名转让给其它组织,并将新的域名信息保存在所指定的 DNS 服务器中,从而使得用户无法通过对原域名进行解析来访问目的网址。
具体实施步骤如下:
① 获取要劫持的域名信息:攻击者首先会访问域名查询站点查询要劫持的域名信息。
② 控制域名相应的 E-MAIL 账号:在获取到域名信息后,攻击者通过暴力破解或者专门的方法破解公司注册域名时使用的 E-mail 账号所对应的密码。更高级的攻击者甚至能够直接对 E-mail 进行信息窃取。
③ 修改注册信息:当攻击者破解了 E-MAIL 后,会利用相关的更改功能修改该域名的注册信息,包括域名拥有者信息,DNS 服务器信息等。
④ 使用 E-MAIL 收发确认函:在修改完注册信息后,攻击者在 E-mail 真正拥有者之前收到修改域名注册信息的相关确认信息,并回复确认修改文件,待网络公司恢复已成功修改信件后,攻击者便成功完成 DNS 劫持。
用户端的一些预防手段:
直接通过 IP 地址访问网站,避开 DNS 劫持。
由于域名劫持往往只能在特定的网络范围内进行,因此一些高级用户可以通过网络设置让 DNS 指向正常的域名服务器以实现对目的网址的正常访问,例如将计算机首选 DNS 服务器的地址固定为 8.8.8.8。

域名缓存

为了提高 DNS 查询效率,并减轻服务器的负荷和减少因特网上的 DNS 查询报文数量,在域名服务器中广泛使用了高速缓存,用来存放最近查询过的域名以及从何处获得域名映射信息的记录。

由于名字到地址的绑定并不经常改变,为保持高速缓存中的内容正确,域名服务器应为每项内容设置计时器并处理超过合理时间的项(例如:每个项目两天)。当域名服务器已从缓存中删去某项信息后又被请求查询该项信息,就必须重新到授权管理该项的域名服务器绑定信息。当权限服务器回答一个查询请求时,在响应中都指明绑定有效存在的时间值。增加此时间值可减少网络开销,而减少此时间值可提高域名解析的正确性。

不仅在本地域名服务器中需要高速缓存,在主机中也需要。许多主机在启动时从本地服务器下载名字和地址的全部数据库,维护存放自己最近使用的域名的高速缓存,并且只在从缓存中找不到名字时才使用域名服务器。维护本地域名服务器数据库的主机应当定期地检查域名服务器以获取新的映射信息,而且主机必须从缓存中删除无效的项。由于域名改动并不频繁,大多数网点不需花精力就能维护数据库的一致性。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值