计算机网络-DNS和HTTPDNS了解
DNS 和 HTTPDNS
DNS
用户与互联网中的某台主机通信的时,必须知道对方的 IP 地址,然而用户很难记住长达 32 位的 IP 二进制主机地址,即使是点分十进制的 IP 地址也是不太容易记忆。为了方便记忆,引入了域名系统,用来便于人们使用的机器名字转换成 IP 地址。
域名和 IP 地址的映射关系就是记录在 DNS 服务器中的。
域名解析的过程
主机向本地域名服务器的查询采⽤递归查询。如果本地域名服务器不能解析域名的 IP 地址,本地域名服务器就以 DNS 客户的身份,向根域名服务器发出查询请求报⽂;
本地域名服务器向根域名服务器的查询采⽤迭代查询。当根域名服务器收到本地域名服务器的迭代查询请求报⽂时,要么给出所要查询的 IP 地址,要么告诉本地域名服务器:“你下⼀步应当向哪⼀个域名服务器进⾏查询”。
这里首先来看几个重要的概念
根域名服务器
根域名服务器是最高层次,最重要的域名服务器。根域名服务器知道所有的顶级域名服务器的域名和 IP 地址。本地域名服务器要对互联⽹上任何⼀个域名进⾏解析,如果⾃⼰⽆法解析,⾸先求助根域名服务器。
顶级域名服务器
这些域名服务器负责管理在该顶级域名服务器注册的所有二级域名。当收到 DNS 查询请求时,就给出相应的回答(可能是最后的结果,也可能是下一步应当查找的域名服务器的 IP 地址)
权限域名服务器
负责一个区的域名服务器,当一个权限域名服务器,还不能给出最后的查询回答时,就会告诉发出请求的 DNS 客户端,下一步应当找哪个权限域名服务器。
本地域名服务器
当一个主机发出 DNS 查询的时候,首先就是发送给本地域名服务器。每一个互联网提供者 ISP ,或者一个大学都可以有自己的本地域名服务器。
如果是通过DHCP配置,本地 DNS 由你的网络服务商(ISP),如电信、移动等自动分配,它通常就在你网络服务商的某个机房。
来看下查询的步骤
1、主机向本地域名服务器查询 www.tsinghua.edu.cn
的 IP 地址,这一步是递归查询;
2、本地域名服务器会在自己的服务器中查找对应的域名映射关系,如果找了直接返回 IP 地址,没有就会询问根域名服务器;
3、根域名服务器会告诉本地域名服务器,下一次查询的顶级域名服务器的 IP 地址;
4、本地服务器继续向顶级域名服务器发起查询请求;
5、顶级域名服务器找到了就返回结果,如果没找到就会告诉本地域名服务器,下一次查询的权限域名服务器的 IP 地址;
6、本地服务器继续向权限域名服务器发起查询请求;
7、权限域名服务器会告诉本地域名服务器,查询的主机 IP 地址,当一个权限域名服务器,还不能给出最后的查询回答时,就会告诉发出请求的 DNS 客户端,下一步应当找哪个权限域名服务器;
8、本地域名服务器最终把查询结果返回给主机,主机就能和目标建立连接了。
传统 DNS 存在的问题
1、域名缓存问题
会在本地做一个缓存,这样就不用每一个请求都去请求权威 DNS 服务器,当再次访问直接拿取本地的缓存即可。
既然是有缓存,就会存在缓存同步不及时的情况,这样一些请求就会发送到旧的页面。
再就是本地的缓存,往往使得全局负载均衡失败,因为上次进行缓存的时候,缓存中的地址不一定是这次访问离客户最近的地方,如果把这个地址返回给客户,那肯定就会绕远路。
2、域名转发问题
经过域名转发,域名查询可能会跨运营商。
栗如:
如果是A运营商的客户,访问自己运营商的 DNS 服务器,如果 A 运营商去权威 DNS 服务器查询的话,权威 DNS 服务器知道你是A运营商的,就返回给一个部署在 A 运营商的网站地址,这样针对相同运营商的访问,速度就会快很多。
但是A运营商偷懒,将解析的请求转发给 B 运营商,B 运营商去权威 DNS 服务器查询的话,权威服务器会误认为,你是 B 运营商的,那就返回给你一个在 B 运营商的网站地址吧,结果客户的每次访问都要跨运营商,速度就会很慢。
3、出口 NAT 问题
我们知道,网络出口的时候,很多机房都会配置NAT,也即网络地址转换,使得从这个网关出去的包,都换成新的IP地址。NAT不仅能解决IP地址不足的问题,而且还能够有效地避免来自网络外部的攻击,隐藏并保护网络内部的计算机。当然请求返回的时候,在这个网关,再将IP地址转换回去,所以对于访问来说是没有任何问题。
但是一旦做了网络地址的转换,权威的DNS服务器,就没办法通过这个地址,来判断客户到底是来自哪个运营商,而且极有可能因为转换过后的地址,误判运营商,导致跨运营商的访问。
4、DNS 域名更新问题
本地DNS服务器是由不同地区、不同运营商独立部署的。对域名解析缓存的处理上,实现策略也有区别,有的会偷懒,忽略域名解析结果的TTL时间限制,在权威DNS服务器解析变更的时候,解析结果在全网生效的周期非常漫长。但是有的时候,在DNS的切换中,场景对生效时间要求比较高。
例如双机房部署的时候,跨机房的负载均衡和容灾多使用DNS来做。当一个机房出问题之后,需要修改权威DNS,将域名指向新的IP地址,但是如果更新太慢,那很多用户都会出现访问异常。
5、解析延迟问题
DNS的查询过程需要递归遍历多个DNS服务器,才能获得最终的解析结果,这会带来一定的时延,甚至会解析超时。
6、运营商劫持
本地运营商可能对某些域名进行劫持、屏蔽。
DNS劫持就是劫持 DNS 服务器,通过某些手段取得某域名的解析记录控制权,进而修改此域名的解析结果,导致对该域名的访问由原 IP 地址转入到修改后的指定 IP,其结果就是对特定的网址不能访问或访问的是假网址,从而实现窃取资料或者破坏原有正常服务的目的。
HTTPDNS
因为传统的 DNS 存在上面的一些问题,所以这里引出了 HTTPDNS。
HTTPNDS 其实就是,不走传统的 DNS 解析,而是自己搭建基于 HTTP 协议的 DNS 服务器集群,分布在多个地点和多个运营商。当客户端需要 DNS 解析的时候,直接通过 HTTP 协议进行请求这个服务器集群,得到就近的地址。
同时因为默认的域名解析都是走 DNS 的,使用 HTTPDNS 需要绕过默认的 DNS 路径,所以使用 HTTPDNS 的,大多数是手机应用,需要在手机端嵌入支持 HTTPDNS 的客户端 SDK。
HTTPDNS 的优点
1、跳过 LocalDNS,防止本地 DNS 劫持;
2、直接通过 IP 访问,平均访问延迟下降;
3、服务器算法筛选最佳节点 IP,提升请求成功率;
4、快速更换 IP(不受 TTL 的限制)。
HTTPDNS 的适用场景
1、App 防止恶意劫持;
2、对访问速度要求高的应用;
3、应用、视频加速服务,配合 CDN,通过 DNS 服务器返回最佳节点,提高访问效率;
4、提供更灵活的流量调度能力。
HTTPDNS 的工作模式
1、在客户端的 SDK 里动态请求服务端,获取 HTTPDNS 服务器的IP列表,缓存到本地。随着不断地解析域名,SDK 也会在本地缓存 DNS 域名解析的结果;
2、当手机应用要访问一个地址的时候,首先看是否有本地的缓存,如果有就直接返回,没有就请求 HTTPDNS 服务器;
2、请求 HTTPDNS 的服务器,HTTPDNS 的服务器都会提供 api 接口,选择对应的接口发出接口请求,会返回一个要访问的网站的 IP 列表;
3、客户端,收到返回的 IP 列表,就能选择 IP ,建立连接,发起正常访问操作;
4、若客户端向 HttpDNS 服务器请求失败,则启用备选,走正常 DNS 解析过程,向 Local DNS
发起请求;
5、LocalDNS
进行递归查询;
6、最终返回 DNS 结果;
7、客户端拿到最优 IP 后,建立连接,发起正常访问操作。
总结
1、传统的DNS有很多问题,例如解析慢、更新不及时。因为缓存、转发、NAT 问题导致客户端误会自己所在的位置和运营商,从而影响流量的调度。
2、HTTPDNS 通过客户端 SDK 和服务端,通过 HTTP 直接调用解析 DNS 的方式,绕过了传统 DNS 的这些缺点,实现了智能的调度。
参考
【极客时间-趣谈网络协议】https://time.geekbang.org/column/intro/100007101
【计算机网络第八版】https://www.bilibili.com/video/BV1WP4y1j7JU?p=1
【计算机网络学习笔记】https://github.com/boilingfrog/Go-POINT/tree/master/tcp
【全面理解DNS及HTTPDNS】https://juejin.cn/post/6844903987796246542
【计算机网络-DNS和HTTPDNS】https://boilingfrog.github.io/2022/08/26/计算机网络-DNS和HTTPDNS/
计算机网络-DNS和HTTPDNS了解的更多相关文章
- 计算机网络——DNS协议的学习与实现
1. 主要内容 不说废话,直接进入正题.先说说本文本文的主要内容,好让你决定是否看下去: 介绍DNS是干什么的: 介绍DNS是如何工作的: 介绍DNS请求与响应的消息格式: 编程实现一个简单的DNS服 ...
- [计算机网络] DNS劫持和DNS污染
DNS劫持,指用户访问一个被标记的地址时,DNS服务器故意将此地址指向一个错误的IP地址的行为.范例就是收到各种推送广告等网站. DNS污染,指的是用户访问一个地址,国内的服务器(非DNS)监控到用户 ...
- [计算机网络] DNS何时使用TCP协议,何时使用UDP协议
DNS同时占用UDP和TCP端口53是公认的,这种单个应用协议同时使用两种传输协议的情况在TCP/IP栈也算是个另类.但很少有人知道DNS分别在什么情况下使用这两种协议. 先简单介绍下TCP与UDP. ...
- 计算机网络--DNS
1.域名系统DNS(domain name system)是因特网使用的命名系统,用来把便于人们时用的机器名字转换为IP地址.因特网的域名系统DNS被设计成一个联机分布式数据库系统,并采用客户服务器方 ...
- Android 网络优化,使用 HTTPDNS 优化 DNS,从原理到 OkHttp 集成
一.前言 谈到优化,首先第一步,肯定是把一个大功能,拆分成一个个细小的环节,再单个拎出来找到可以优化的点,App 的网络优化也是如此. 在 App 访问网络的时候,DNS 解析是网络请求的第一步,默认 ...
- 网络协议学习笔记(八)DNS协议和HttpDNS协议
概述 上一篇主要讲解了流媒体协议和p2p协议,现在我给大家讲解一下关于DNS和HttpDNS的相关知识. DNS协议:网络世界的地址簿 在网络世界,也是这样的.你肯定记得住网站的名称,但是很难记住网站 ...
- 百度APP移动端网络深度优化实践分享(一):DNS优化篇
本文由百度技术团队“蔡锐”原创发表于“百度App技术”公众号,原题为<百度App网络深度优化系列<一>DNS优化>,感谢原作者的无私分享. 一.前言 网络优化是客户端几大技术方 ...
- HttpDns原理
什么是 DNS DNS(Domain Name System,域名系统),DNS 服务用于在网络请求时,将域名转为 IP 地址.能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的 IP 数 ...
- HTTP DNS
试用地址 https://www.dnspod.cn/httpdns/demo 哪些人适合使用HTTP DNS 1.希望降低访问延迟.减少跨网访问的资讯.游戏类APP: 2.希望降低连接失败率,提升业 ...
随机推荐
- java提前工作、第一个程序
java提前工作 我们学习编程肯定会 运用到相应的软件 在这里 我个人推荐 eclipse.idea 这里的软件呢 都是用我们的java编程出来的,那它也需要用java来支持他的开发环境 这里就运用到 ...
- client offset scroll 之间的区别
一.client 属性 值 clientWidth 元素被设置的宽度 + padding左右内间距 clientHeight 元素被设置的高度 + padding上下内间距 clientLeft 左 ...
- 论文阅读 Real-Time Streaming Graph Embedding Through Local Actions 11
9 Real-Time Streaming Graph Embedding Through Local Actions 11 link:https://scholar.google.com.sg/sc ...
- Spring Data JPA系列2:SpringBoot集成JPA详细教程,快速在项目中熟练使用JPA
大家好,又见面了. 这是Spring Data JPA系列的第2篇,在上一篇<Spring Data JPA系列1:JDBC.ORM.JPA.Spring Data JPA,傻傻分不清楚?给你个 ...
- Vue数据双向绑定原理(vue2向vue3的过渡)
众所周知,Vue的两大重要概念: 数据驱动 组件系统 1 2 接下来我们浅析数据双向绑定的原理 一.vue2 1.认识defineProperty vue2中的双向绑定是基于definePropert ...
- Python基础教程:模块重载的五种方法
环境准备 新建一个 foo 文件夹,其下包含一个 bar.py 文件 $ tree foo foo └── bar.py 0 directories, 1 file bar.py 的内容非常简单,只写 ...
- Electron学习(三)之简单交互操作
写在前面 最近一直在做批量测试工具的开发,打包的exe,执行也是一个黑乎乎的dos窗口,真的丑死了,总感觉没个界面,体验不好,所以就想尝试写桌面应用程序. 在技术选型时,Java窗体实现使用JavaF ...
- typescript+webpack构建一个js库
依赖说明 入口文件 tsconfig配置 webpack配置文件 webpack入口文件配置 webpack为typescript和less文件配置各自的loader webpack的output配置 ...
- JDBCToolsV2:利用ThreadLocal保证当前线程操作同一个数据库连接对象。
JDBCToolsV2: 利用ThreadLocal保证当前线程操作同一个数据库连接对象. package com.dgd.test; import com.alibaba.druid.poo ...
- Ubuntu出现视频无法正常播放的问题
原因是没有安装相关的解码包,参考这个方法: ubuntu下B站(bilibili)视频无法播放 一条命令解决 sudo apt install ubuntu-restricted-extras 要是有 ...