Content Distribution Newwork
尽管上篇文章讲的FS都已经做到了一定的scalability,但单个数据中心依然无法存放大量数据,因此必须进行content distribution。
Client Side
cache 本地副本
- browser cache file
- proxy cache url
- DNS resolver cache record(URL->IP)
- NFS client cache data
Server Side
CDN DNS
网站提供商将数据push到CDN,而DNS(Domain Name Service)会找最近的CDN,由这些CDN提供服务(同一个host name根据位置指向不同的server)。(例如谷歌的服务器基本遍布全球)
DNS Design
DNS实现了IP和域名的绑定
Why Domain Name?
- IP是结构化的,以特定规则进行组织。无法自定义,而域名可以有自然语义。
- IP不够用户友好,难以记忆。
- 增加间接层,方便redirect(一个IP有多个域名,一个域名对应多个IP),例如上海使用上海服务器的ip.均摊压力。
我们需要存储这些映射关系。
本地存储-每个机器都有hosts.txt(没钱买和谐软件的时候就去博客找找改host,懂得都懂,然而大部分都是过期的IP哭了)。这种做法不具备scalability。
网络存储-伯克利本科生开发的BIND
由于域名的数量很大,因此我们使用分级委托(顺序从小到大,英文地址喜欢这么玩)。root不具有名称,因此这个.可以省略。
e.g.
http://xxx.sjtu.edu.cn,root - cn - edu - sjtu
http://zhuhu.com,root - com
实际查找时,从root处询问cn的IP,然后向cn询问edu的IP,以此类推。因此一旦上层dns崩溃,那么所有依赖的域名都会失效。因此一般同一个名称会对应多个NDS服务器,进行冗余备份。
解析顺序
- 直接找IP /etc/hosts
- 找对应的DNS /etc/resolv.conf
- 问root服务器
Recursion
递归实现减少了Client开销,但是也对name server的算力提出了要求。
Cache
Client和Server都会对name的IP进行缓存,并设置了一个TTL(Time To Live),一旦超时,那么cache失效。
DNS Security
DNS 污染
通过使用错误的数据包,让DNS存储错误的cache,DNS服务器就会将域名解析到错误的ID,称为DNS缓存污染(GFW)。由于DNS本质是中心化的,如果对中心服务器进行了控制,就可以对域名解析进行篡改。例如把google网页重定向为交大官网,交大官网马上就会扑该。
这也是改hosts的原理,因为上文的解析顺序,我们可以通过改hosts越过原本的DNS服务器。不过不同于先前的DNS阻断,现在的GFW已经升级到了IP阻断,也就是说路由在寻址的时候就被终止,因此现在一些简单的改hosts已经凉了。
DNS DDOS