域名系统(Domain Name
System,缩写:DNS)是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网
分类
正向解析
根据主机名(域名)查找对应的IP地址
反向解析
根据IP地址查找对应的主机名(域名)
关于DNS的案例分析
在cmd中ping zhihu.com,得到知乎的IP地址为:118.89.204.192
在浏览器中输入得到的IP地址118.89.204.192后发现返回400错误,被拒绝访问
在cmd中ping baidu.com,得到百度的IP地址为:220.181.57.216
在浏览器中输入得到的IP地址220.181.57.216后发现可以成功访问百度
同样的操作步骤,为什么百度就可以用解析的IP地址访问,而知乎不可以呢?原因→_→
CDN服务器
可以说是一种缓存服务器。当我们要访问某个网站的资源时,如果该网站的服务器离我们很远,这样的话响应速度就会很慢,为了让响应速度快一些,我们可以把资源分布放在各个地方,然后响应客户端的时候,把离客户端较近的资源传送给他
SNI机制
(Server Name Indication)是 TLS 的扩展,用来解决一个服务器拥有多个域名的情况。在客户端和服务端建立 HTTPS 的过程中要先进行
TLS 握手,握手后会将 HTTP 报文使用协商好的密钥加密传输。在 TLS
握手信息中并没有携带客户端要访问的目标地址。这样会导致一个问题,如果一台服务器有多个虚拟主机,且每个主机的域名不一样,使用了不一样的证书,该和哪台虚拟主机进行通信?和
HTTP 协议用来解决服务器多域名的方案类似,HTTP 在请求头中使用 Host 字段来指定要访问的域名。TLS 的做法,也是加 Host,在 TLS
握手第一阶段 ClientHello 的报文中添加。
这里的Servername就是要访问的域名
DNS案例分析.png
ipv4的ip地址是非常有限的,如果每个人都想拥有一个全球ip,那肯定是不够分配的,很多网站在发布的时候,是有可能几个域名共用一个CDN服务器的。当我们用域名访问知乎的时候,CDN服务器可以根据访问的域名知道你想要的是哪个网站的资源,然后直接给你返回对应的资源。但是当你用公网ip访问就不一样了,由于一个CDN服务器的公网ip对应多个域名网站,他不知道你想要的是哪个网站的资源,也就是说,当你用
118.89.204.192 去访问知乎的时候,CDN服务器不知道你要访问的是 zhihu.com,还是访问 a.com 或 b.com,所以会拒绝你的请求
CDN服务器.png
问题是我输入域名之后,DNS服务器帮我自动解析成对应的ip,去访问知乎的时候,也还是用ip访问的啊,这貌似和ip访问没啥区别啊
确实,访问的时候,DNS服务器都会帮们我把域名解析成ip去访问,CDN服务器之所以能够检测到对应的域名,是因为当客户端用域名访问知乎的时候,DNS会解析成对应的ip去访问CDN服务器,然后CDN服务器可以根据SNI机制获得该IP对应的来源域名,然后返回对应的资源
为什么百度ip和域名都可以访问呢?因为百度用的CDN服务器,只对应一个网站域名,因此用域名还是IP地址访问的效果都是一样的