关闭

主程序员的练成:IP、DNS和CDN

1201人阅读 评论(0) 收藏 举报
分类:

目录(?)[+]

有段时间我面试程序员时,喜欢问这个问题:局域网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原理及其解析过程【精彩剖析】》对DNS介绍得挺详细的,这里就不再赘述。

在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以提高更快的访问速度和更低的成本。

聊完IP、DNS和CDN后,有啥意见或疑问,欢迎评论交流 ;)

1
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

浅谈一个网页打开的全过程(涉及DNS、CDN、Nginx负载均衡等)

s
  • king_a_123
  • king_a_123
  • 2016-10-11 10:04
  • 2474

简要对比下HTTP-DNS调度和302跳转调度之间的区别

先上图,图是为了简要说明,没有画的那么具体,那么细。 接来下说干货: 相同之处,都是基于HTTP协议来请求得到调度结果。 不同之处: 1、HTTP-DNS协议只是将域名解析的协议由DNS协议换...
  • charleslei
  • charleslei
  • 2016-04-06 20:08
  • 3318

IP、NAT、DNS、CDN

有段时间我面试程序员时,喜欢问这个问题:局域网IP有哪些IP段?由这个问题再追问NAT(网络地址转换)。   为什么不是每个设备一个公网IP? 先说个关于QQ的小故事,最早开发QQ时,小马哥他们...
  • u013427969
  • u013427969
  • 2016-10-15 23:30
  • 139

优秀IP是怎么练成的

IP的定义: intellectual property的缩写,意思是知识产权,全称 intellectual property right. 一些IP和非IP 举个案例: 喜洋洋与灰太狼,纸牌屋,...
  • u011650048
  • u011650048
  • 2016-08-16 21:54
  • 903

程序员是怎样练成的?

一些人认为,掌握一门计算机语言,会编写几行代码并且能够让这些代码在计算机上运行起来的人,就可以称为程序员。事实上,软件行业里,要成为真正意义上的程序员,对得起 programmer 这个称号,还是要花...
  • u013467956
  • u013467956
  • 2014-01-13 16:21
  • 657

如何用DNS+GeoIP+Nginx+Varnish做世界级的CDN.

  • 2012-09-16 14:30
  • 5KB
  • 下载

自动根据来源ip动态解析的智能主、辅DNS

  • 3天前 11:35
  • 9KB
  • 下载

c-ares DNS域名异步解析成IP

//build1: g++ dns_parse_cares.cc /usr/local/lib/libcares.a -lrt -o test //build2: g++ dns_parse_ca...
  • lx_shudong
  • lx_shudong
  • 2017-05-23 12:56
  • 457

浅谈一个网页打开的全过程(涉及DNS、CDN、Nginx负载均衡等)

s
  • king_a_123
  • king_a_123
  • 2016-10-11 10:04
  • 2474

关于智能DNS和CDN加速介绍

相信有很多的朋友会被这几个名词绕的有些头大,很多朋友觉得智能DNS跟双线加速、CDN加速是类似的技术。其实不然,虽然他们的目的都是一个:让用户更快的访问网站。但是他们的应用原理却大相径庭。 大家一定很...
  • mooncarp
  • mooncarp
  • 2016-06-01 14:57
  • 427
    个人资料
    • 访问:1694107次
    • 积分:20980
    • 等级:
    • 排名:第434名
    • 原创:201篇
    • 转载:1111篇
    • 译文:2篇
    • 评论:202条
    程序员日记
    微信扫描关注我!
    个人淘宝
    博客专栏