本文共 2894 字,大约阅读时间需要 9 分钟。
从百度开始说
众所周知,www.baidu.com就是百度网站的首页,它凭内容简单成为了不少电脑测试是否可以上网的直接凭据。www.baidu.com是一个域名,在真正通信的时候,域名是不被服务器这个铁疙瘩所识别的,铁疙瘩认识的就是IP地址。公网上的IP地址是唯一的,每个端口号有代表这一个程序进度。于是“ip地址+端口号”的组合就成了确定机器和它进行的程序的唯一识别码,而“ip地址+端口号”的组合名就叫socket。
QQ这个程序使用的是动态端口,默认是4000端口,如果4000端口被占用,会使用4001,如果4001被占用,会使用4002,以此类推。那默认情况下,192.168.1.99的4000端口的这个socket信息,就是192.168.1.99这个用户的QQ信息。就是这样,把用户发送的数据给确定住。然后一层一层的打包装头,再经过网线/光纤到达目的地的机器上,经过一层一层的拆头拆包,把这句QQ消息还原,呈现在4000端口上,最后呈现屏幕上。这就是QQ聊天的原理。
虽然IP地址表示机器,但是IP地址是四组数字,太不好记,所以就需要域名来代替IP地址。就好比人与人之间打招呼都是称呼名字,而不是称呼对方的身 份-证号码一样,况且将来会升级成IPv6,IP地址数字会更多。但是一个域名是可以有多个IP地址的,比如百度这www.baidu.com,它作为目前最大的中文搜索引擎,他应该最少有10个主ip地址。
在linux状态下使用#host -t A www.baidu.com,就会反馈两个ip地址,然后分别在浏览器的地址栏里输入这两个ip地址,都会打开百度的首页。本人在写文章之时身处黑龙江省,我输入上方的实验的host语句,会得到两个不同的ip地址,这两个不同的ip地址同样也会打开百度的首页。记得在2010年百度被黑掉的五个小时里,四川、福建、江苏、吉林、浙江、北京、广东等省市出现了登陆异常的现象,我想可能是这几个省的主服务器用的是一个服务器,所以ip地址也是同一个了,所以伊朗人一黑就把这几个省的百度服务全黑掉了。DNS协议的原理
DNS是应用层协议,这一点跟http协议是一样的,它的端口号是53,注意!DNS是先用UDP协议查询IP,因为UDP协议比较快,如果UDP不行,才派上TCP协议,所以防火墙要同时放行UDP和TCP两个53端口。无论是iso的7层模型还是简化的4层模型,上下层协议的关系都是这样的:上层协议使用下层协议的服务(比如http协议是加载在tcp协议上的),下层协议给上层协议一个接口。
返回来说DNS,DNS的主要用途就是让那些充满了英文字母的域名与充满数字的IP能进行对应,但是要注意这个对应不是一对一的,比如上面百度的例子,北方人使用的www.baidu.com就至少对应了2个不同的IP,其实同样在上面的例子里,输入180.97.33.107网页页面是百度首页,但是实际上对应的不仅仅是百度首页。这是一个多对多的映射。
这个世界存在若干个DNS服务器(目前为止是13个),他们什么都不干,专门负责记录那些登记上来的域名,然后给他们分发一个ip地址,同时把ip地址与域名进行绑定。不过由于互联网产业是爆炸式发展,屁大点个公司都要弄个网站玩玩,再加上现在许多个人的博客,域名已经成万上亿了,于是这些域名就需要分别进行管理,就被划分成了顶级域名、二级域名和子域名。
举个例子,www.JQK123.net这个网络地址(FQDN比网址多一个.在后面)里,.net是顶级域名,JQK123是二级域名,前面的www是子域名。
再举个例子,网易新闻的地址是news.163.com,.com是顶级域名,163是二级域名,前面的news就是子域名,代表这个域放的都是新闻内容。如果子域名是bbs,代表这个域存放的网页都是论坛相关的内容。http://baike.baidu.com/view/655511.htm,这个网址的具体含义就是“这个网址遵循http协议的,它的内容是baidu.com这个主服务器下baike域里面view文件夹里的叫655511.htm“。
从上面的例子中可以看出,常见的论坛一般都是bbs作为主机名,但是都是bss,这些bbs的不同就是通过后面的二级域名区分的,这个是sina的bbs,那个是taobao的bbs。这种感觉就好比,同样叫做孙悟空,但是一个是中国猴,另一个是赛亚人。
DNS工作流程
DNS的架构是反向树形结构,比如说bbs.123JQK.com和news.123JQK.com与game.163.net的关系,就如图所示。
上一层的DNS服务器所记录的信息只有下一层的主机名,就好比国家主席只需要对各省省长有所掌控,再有各省省长对各市市长进行管控,这样层层递进。而大可不必国家主席直接管每一个市民,假如一台普通的用户上网需要登录上面的bbs.123JQK.com,是怎么实现的?
1)用户在浏览器的地址栏里输入bbs.123JQK.com。这个请求先到本地系统,linux系统的话,会查询/etc/hosts这个文件,如果hosts这个文件里面没有bbs.123JQK.com这个对应的IP。然后查找就近的DNS服务器,DNS服务器同样的先检查自己缓存,缓存是记录这台机器曾经成功登陆网站的信息,如果缓存内有bbs.123JQK.com,那么无需继续查找,就直接按缓存记录里的IP地址跳转即可。如果缓存里没有,那就向上查找。 2)服务器向上“上访”,这里可不是一级一级的上访,而是直接上访到.(root)那里。但是前面说过了上一层的只记录下一层的信息,于是.(root)只说,你这玩意是.com那一片的,你去.com那里问问。 3)然后DNS服务器接到.(root)的指示,将信号发送到.com服务器。这里的服务器告诉123JQK.com的地址。 4)DNS这时候收到.com的指示,调头去了123JQK.com,123JQK.com服务器这时候提供bbs.123JQK.com的IP号。至此,终于得到目标网站的IP号了。 5)查到这个IP之后,DNS机器还先把这个IP号保存到自己的缓存里,不至于下一次再登陆这个网站的时候,再从步骤1跑到步骤4,跑一次其实很消耗系统带宽的。这份缓存也是有时间限制的,通常是24小时,过了24小时之后,缓存会被释放掉。在步骤1中,优先查缓存然后去找DNS,虽然找缓存是优先的做法,而且使用缓存更快,但是不权威,DNS查询是权威的。而且从客户端到本地DNS服务器是属于递归查询,而DNS服务器之间就是的交互查询就是迭代查询。
如果要想在电脑上看到这个查询IP的过程,可以在linux状态下输入"#dig +trace 目标网络地址"【参考文章】http://369369.blog.51cto.com/319630/812889/
本文转自 苏幕遮618 51CTO博客,原文链接:http://blog.51cto.com/chenx1242/1748603
转载地址:http://snhca.baihongyu.com/