1.DNS(Domain Name System)
• 将网站的域名转换为相应的IP。
• 如何映射
– 每个PC保持一个hosts文件
» www.58.com 10.10.10.10
» 访问是本地hosts查找IP
» hosts文件越来越大
» 没规定命令规则,主机名会冲突
» 维护映射关系代价高
– 应用场景
» 线下测试
• 解决上述问题,1983年Paul Mockapetris提出域名系统
• 分布式数据库系统
• 一种层次的、基于域的命名方案
• 一个完整的请求过程如下:
– 应用程序->DNS服务器发起DNS请求
– DNS服务器返回该域名对应的IP地址
– 应用程序根据返回的IP地址请求对应的服务,获取数据
2. • DNS协议
– Domain_name Time_to_live Class Type Value
» Domain_name: 指出这条记录适用于哪个域名;
» Time_to_live: 用来表明记录的生存周期,也就是说最多可以缓存该记录多长时间(后面会讲到缓存机制);
» Class: 一般总是IN;
» Type: 记录的类型;
» Value: 记录的值,如果是A记录,则value是一个IPv4地址。
• 所有域名记录由DNS服务器集群存储
• 用户计算机不用存储所有的域名->IP映射,hosts文件不大
• 规定了域名的命令规则,保证了主机名字不会重复
• DNS是一个层次的的分布式数据库服务集群
3.– DNS(Domain Name System)解析过程
• 首先查找本地域名服务器(Local Server)【运营商:电信、联通等】
• Local Server没有,查找Root服务器
• Root服务器返回权威服务器地址
• Local Server继续查找权威服务器
• 找到后由Local Server返回给用户
– 和快递原理一样
• 中国->城市->区域->商区->小区->门牌号
• 中国->北京市->朝阳区->酒仙桥->酒仙桥北路甲10号院->58赶集总部
– 域名缓存
• 不变缓存时间可长期
• 可变缓存时间短
• Time to Live字段灵活控制
4.DNS劫持
– 区域域名服务器负责用户解析请求
– 没有机制保证域名映射是否准确
– “流氓的域名服务器”更改一些域名的解析结果
– 或者区域域名服务器被黑客攻击,恶意修改
– 引导用户一个错误的目标IP地址
– 这就是DNS劫持
– 劫持目标
• 阻止用户访问某些特定网站
• 引导用户到广告页面
防DNS劫持解决方案
– 直接使用IP地址
• 客户端处理负责均衡
• 移动端(Android、iOS)
– 使用HttpDNS
• DNS协议->HTTP协议
• 使用HTTP协议的80端口,取代DNS协议的53端口
• 绕过DNS协议请求,解决运营Local DNS劫持问题