主程的晋升攻略(3):IP、DNS和CDN
有段时间我面试程序员时,喜欢问这个问题:局域网IP有哪些IP段?由这个问题再追问NAT(网络地址转换)。
为什么不是每个设备一个公网IP?
先说个关于QQ的小故事,最早开发QQ时,小马哥他们也没想到QQ会发展成中国互联网基础设施,就用4字节整形表示QQ号了。早期内部的一些项目有用int表示QQ号,能表示的最大值是2^31-1,即21亿多。在QQ号发放近20亿时,腾讯内部搞了个22亿QQ号测试,要求每个项目检查整改,使用unsigned int表示QQ号,以支持21亿以上的QQ号。随着QQ号的不断增长,迟早会超出4字节的范围,那时估计得启动int64转换了。
可以看出在底层和协议设计中,字段的扩大是非常麻烦的。IP地址也有类似问题。目前广泛使用的是IPv4,一个IP地址4个字节,理论上共有2^32个IP地址,接近43亿。这个数量还不到人均一个,远远不够,自然也不能每个设备一个公网IP了,所以Internet规定了IPv4地址空间的一部份供专用地址使用,这些地址永远不会被当做公用地址来分配,局域网内部IP就是使用这些专用地址。
Internet规定的专用地址有:10.x.x.x,172.16-31.x.x,192.168.x.x,另外127.0.0.1表示本地回环地址,代表设备的本地虚拟接口。
了解这个后,如果你发现你在公司的IP是192.168.0.100,在家里的IP也是192.168.0.100时,就不会诧异了。局域网内部IP只用于局域网内部通讯,要连接广域网,还要用到NAT(网络地址转换)技术。
NAT常用于局域网内部IP和局域网分配的公网IP之间进行转换,使用最多的是端口多路复用(PAT)方式,简单的描述就是,你在局域网内访问百度时,路由器会记录你的内网IP和端口(假设是192.168.0.100:12345),用路由器的公网IP和一个未使用的端口向公网发网络包(假设是202.96.134.133:23456),路由器还会把202.96.134.133:23456~192.168.0.100:12345配对保存起来。当百度的响应发到202.96.134.133:23456后,路由器通过查找配对表就知道是发给192.168.0.100:12345。
参考:百度百科 内网IP http://baike.baidu.com/view/1233066.htm
参考:百度百科 网络地址转换 http://baike.baidu.com/view/875777.htm
小问题:像华为这种公司内部局域网能用192.168.x.x段么?
DNS有话说
搞网络管理的同学对DNS比较熟悉,程序员也需要了解,不管是前端还是后端。
IP地址不好记,于是就有了域名。浏览器访问baidu.com时,会先做一次域名解析,把baidu.com这个域名解析成IP地址,然后才能发出IP包。DNS的详细介绍,这篇博客介绍挺详细的,参见http://369369.blog.51cto.com/319630/812889/。
在windows和linux下解析域名前,会先从本地hosts文件里查找网址映射关系,如果有,就先调用这个IP地址映射,完成域名解析。 我们在做web开发时,会用这种方式来切换开发环境、测试环境、预发布环境和正式环境。
如果你在万网注册了一个个人用的域名,一般会直接用万网的DNS服务器来管理该域名的解析。对于门户网站,则会自己搭建DNS服务器来管理域名,例如baidu.com/qq.com。自建DNS服务器既方便管理,又能提高安全等级,防范DDOS域名攻击。
如果域名的访问量比较大,可以让域名对应多个IP地址,操作系统会随机选择其中一个,这是最常见的web负载均衡方式。但因为DNS的变更生效时间最长可达到24~48小时(自建DNS服务器可以配置更短的生效时间),一旦某个IP的机器故障,而DNS又不能立即刷新,会让部分用户服务不可用。于是就有了用LVS/nginx来动态负载均衡的方式,LVS的负载均衡基于IP层,nginx则是用HTTP层的反向代理机制。
参考:百度百科 LVS http://baike.baidu.com/subview/645050/6406092.htm
在中国搞互联网还要考虑到电信/联通/移动三大运营商跨网的问题(有的叫南北互通问题)。运营商因不公开的原因,他们之间的通讯带宽有限,如果你的服务器在广州的电信机房,那么北京的联通用户访问就会比较慢。所以就有了双线机房的出现。双线机房实际是一个机房有电信和联通两条线路接入。通过双线机房内部路由器设置,及BGP自动路由的分析,实现电信用户访问电信线路,联通用户访问联通线路,这样实现电信联通均可以快速访问 。腾讯在搞开放平台后,还提供了TGW服务,实现了电信/联通/移动多网统一接入、外网网络请求转发、支持自动负载均衡。
参考:百度百科 BGP多线 http://baike.baidu.com/view/8584527.htm
参考:腾讯TGW简介 http://wiki.open.qq.com/wiki/TGW%E7%AE%80%E4%BB%8B
CDN登场
为了给用户提供更快的访问速度,人们发明了CDN(Content Delivery Network,内容分发网络)。简单的说就是,一个域名对应有多个IP,这些IP分布在全国各地,用户访问域名时,DNS服务器根据用户的来源IP,返回一个就近的IP给用户,从而实现更快的访问速度。
参考:百度百科 内容分发网络 http://baike.baidu.com/view/8689800.htm
从上面的描述可以知道,CDN要求各节点的内容是一致的,这样才能让各地用户访问到一致的内容,所以CDN主要用于web静态资源的分发和加速。
web性能优化方案一般会有一条动静分离,即把静态资源使用的域名和动态脚本的域名分开,有了CDN后,一般会把静态资源的域名托管给CDN以提高更快的访问速度和更低的成本。