从用户输入网址到网页被返回步骤:
第一步、浏览器中输入域名。
第二步、域名解析。
浏览器会把输入的域名解析成对应的IP,过程如下:
1浏览器查找浏览器缓存,如果有域名对应的IP地址则返回,如果没有继续查找。
2浏览器查看本机的host文件,如果有域名对应的IP地址则返回,如果没有继续查找。
3然后是路由器缓存,路由器一般有自己的缓存,如果有域名对应的IP地址则返回,如果没有继续查找。
4接着是对本地DNS服务器进行递归查询,看是否有域名对应的IP。主机向本地域名服务器的查询一般都是采用递归查询。
所谓递归查询就是如果主机所询问的本地域名服务器不知道被查询域名的IP地址,那么本地域名服务器就以DNS客户的身份,向其他根域名服务器继续发出查询请求报文,而不是让该主机自己进行下一步查询。(本地域名服务器地址是通过DHPC协议获取地址,DHPC是负责分配IP地址的)
5本地域名服务器采用迭代查询,它先向一个根域名服务器查询。本地域名服务器向根域名服务器的查询一般都是采用迭代查询。
所谓迭代查询就是当根域名服务器收到本地域名服务器发出的查询请求报文后,要么告诉本地域名服务器下一步应该查询哪一个域名服务器,然后本地服务器自己进行后续的查询。
6根域名服务器告诉本地域名服务器,下一次应查询的域名服务器dnscom的IP地址。
7本地域名服务器向域名服务器dnscom进行查询。
8域名服务器dnscom告诉本地域名服务器,下一次应查询的权限域名服务器dnsbaiducom的IP地址。
9本地域名服务器向权限域名服务器dnsbaiducom进行查询。
10权限域名服务器dnsbaiducom告诉本地域名服务器,所查询的主机的IP地址。
本地域名服务器最后把查询结果告诉主机。
浏览器中输入URL到页面返回的全过程
第三步、浏览器与目标服务器建立TCP连接
1主机浏览器通过DNS解析得到了目标服务器的IP地址后,与服务器建立TCP连接。
2TCP3次握手连接:浏览器所在的客户机向服务器发出连接请求报文;服务器接收报文后,同意建立连接,向客户机发出确认报文;客户机接收到确认报文后,再次向服务器发出报文,确认已接收到确认报文;此处客户机与服务器之间的TCP连接建立完成,开始通信。
第四步、浏览器通过>
请求行,请求头,请求实体内容。浏览器向主机发起一个>
Accept-Encoding一般采用gzip,压缩之后传输html文件。Cookies如果是首次访问,会提示服务器建立用户缓存信息,如果不是,可以利用Cookies对应键值,找到相应缓存,缓存里面存放着用户名,密码和一些用户设置项。
第五步、服务器给出响应,将指定文件发送给浏览器
状态行,响应头,响应实体内容,返回状态码200OK,表示服务器可以响应请求,返回报文,由于在报头中Content-type为“text/html”,浏览器以HTML形式呈现,而不是下载文件。
注意:但是,对于大型网站存在多个主机站点,往往不会直接返回请求页面,而是重定向。返回的状态码就不是200OK,而是301,302以3开头的重定向码,浏览器在获取了重定向响应后,在响应报文中Location项找到重定向地址,浏览器重新第一步访问即可。
补充一点的就是,重定向是为了负载均衡或者导入流量,提高SEO排名。利用一个前端服务器接受请求,然后负载到不同的主机上,可以大大提高站点的业务并发处理能力;重定向也可将多个域名的访问,集中到一个站点。
由于baiducom,>
第六步、TCP释放链接
1浏览器所在主机向服务器发出连接释放报文,然后停止发送数据;
2服务器接收到释放报文后发出确认报文,然后将服务器上未传送完的数据发送完;
3服务器数据传输完毕后,向客户机发送连接释放报文;
4客户机接收到报文后,发出确认,然后等待一段时间后,释放TCP连接;
第七步、浏览器显示页面中所有文本。
浏览器接收到返回的数据包,根据浏览器的渲染机制对相应的数据进行渲染。渲染后的数据,进行相应的页面呈现和脚步的交互。
域名系统DNS(Domain Name System)是因特网使用的命名系统,用来把便于人们使用的机器名字转换成为IP地址。域名系统其实就是名字系统。为什么不叫“名字”而叫“域名”呢?这是因为在这种因特网的命名系统中使用了许多的“域(domain)”,因此就出现了“域名”这个名词。“域名系统”明确地指明这种系统是应用在因特网中。我们都知道,IP地址是由32位的二进制数字组成的。用户与因特网上某台主机通信时,显然不愿意使用很难记忆的长达32位的二进制主机地址。即使是点分十进制IP地址也并不太容易记忆。相反,大家愿意使用比较容易记忆的主机名字。但是,机器在处理IP数据报时,并不是使用域名而是使用IP地址。这是因为IP地址长度固定,而域名的长度不固定,机器处理起来比较困难。
因为因特网规模很大,所以整个因特网只使用一个域名服务器是不可行的。因此,早在1983年因特网开始采用层次树状结构的命名方法,并使用分布式的域名系统DNS。并采用客户服务器方式。DNS使大多数名字都在本地解析(resolve),仅有少量解析需要在因特网上通信,因此DNS系统的效率很高。由于DNS是分布式系统,即使单个计算机除了故障,也不会妨碍整个DNS系统的正常运行。
域名到IP地址的解析是由分布在因特网上的许多域名服务器程序共同完成的。域名服务器程序在专设的结点上运行,而人们也常把运行域名服务器程序的机器称为域名服务器。
域名到IP地址的解析过程的要点如下:当某一个应用需要把主机名解析为IP地址时,该应用进程就调用解析程序,并称为DNS的一个客户,把待解析的域名放在DNS请求报文中,以UDP用户数据报方式发给本地域名服务器。本地域名服务器在查找域名后,把对应的IP地址放在回答报文中返回。应用程序获得目的主机的IP地址后即可进行通信。
若本地域名服务器不能回答该请求,则此域名服务器就暂时称为DNS的另一个客户,并向其他域名服务器发出查询请求。这种过程直至找到能够回答该请求的域名服务器为止。此过程在后面作进一步讨论。
由于因特网的用户数量较多,所以因特网在命名时采用的是层次树状结构的命名方法。任何一个连接在因特网上的主机或路由器,都有一个唯一的层次结构的名字,即域名(domain name)。这里,“域”(domain)是名字空间中一个可被管理的划分。
从语法上讲,每一个域名都是有标号(label)序列组成,而各标号之间用点(小数点)隔开。
这是中央电视台用于手法电子邮件的计算机的域名,它由三个标号组成,其中标号com是顶级域名,标号cctv是二级域名,标号mail是三级域名。
DNS规定,域名中的标号都有英文和数字组成,每一个标号不超过63个字符(为了记忆方便,一般不会超过12个字符),也不区分大小写字母。标号中除连字符(-)外不能使用其他的标点符号。级别最低的域名写在最左边,而级别最高的字符写在最右边。由多个标号组成的完整域名总共不超过255个字符。DNS既不规定一个域名需要包含多少个下级域名,也不规定每一级域名代表什么意思。各级域名由其上一级的域名管理机构管理,而最高的顶级域名则由ICANN进行管理。用这种方法可使每一个域名在整个互联网范围内是唯一的,并且也容易设计出一种查找域名的机制。
域名只是逻辑概念,并不代表计算机所在的物理地点。据2006年12月统计,现在顶级域名TLD(Top Level Domain)已有265个,分为三大类:
如果采用上述的树状结构,每一个节点都采用一个域名服务器,这样会使得域名服务器的数量太多,使域名服务器系统的运行效率降低。所以在DNS中,采用划分区的方法来解决。
一个服务器所负责管辖(或有权限)的范围叫做区(zone)。各单位根据具体情况来划分自己管辖范围的区。但在一个区中的所有节点必须是能够连通的。每一个区设置相应的权限域名服务器,用来保存该区中的所有主机到域名IP地址的映射。总之,DNS服务器的管辖范围不是以“域”为单位,而是以“区”为单位。区是DNS服务器实际管辖的范围。区 <= 域。
下图是区的不同划分方法的举例。假定abc公司有下属部门x和y,部门x下面有分三个分布们u,v,w,而y下面还有下属部门t。图a表示abc公司只设一个区abccom。这是,区abccom和域abccom指的是同一件事。但图b表示abc公司划分为两个区:abccom和yabccom。这两个区都隶属于域abccom,都各设置了相应的权限域名服务器。不难看出,区是域的子集。
下图是以上图b中abc公司划分的两个区为例,给出了DNS域名服务器树状结构图。这种DNS域名服务器树状结构图可以更准确地反映出DNS的分布式结构。图中的每一个域名服务器都能够部分域名到IP地址的解析。当某个DNS服务器不能进行域名到IP地址的转换时,它就会设法找因特网上别的域名服务器进行解析。
从下图可以看出,因特网上的DNS服务器也是按照层次安排的。每一个域名服务器只对域名体系中的一部分进行管辖。根据域名服务器所起的作用,可以把域名服务器划分为下面四种不同的类型。
根域名服务器:最高层次的域名服务器,也是最重要的域名服务器。所有的根域名服务器都知道所有的顶级域名服务器的域名和IP地址。不管是哪一个本地域名服务器,若要对因特网上任何一个域名进行解析,只要自己无法解析,就首先求助根域名服务器。所以根域名服务器是最重要的域名服务器。假定所有的根域名服务器都瘫痪了,那么整个DNS系统就无法工作。需要注意的是,在很多情况下,根域名服务器并不直接把待查询的域名直接解析出IP地址,而是告诉本地域名服务器下一步应当找哪一个顶级域名服务器进行查询。
顶级域名服务器:负责管理在该顶级域名服务器注册的二级域名。
权限域名服务器:负责一个“区”的域名服务器。
本地域名服务器:本地服务器不属于下图的域名服务器的层次结构,但是它对域名系统非常重要。当一个主机发出DNS查询请求时,这个查询请求报文就发送给本地域名服务器。
注意:
下面举一个例子演示整个查询过程:
链式查询方式、计数器定时查询方式和独立请求方式都是常见的网络请求方式,它们各有优缺点。
链式查询方式
链式查询方式是指在一个 >
优点:
简单易用,可以使用浏览器的地址栏直接输入查询字符串进行访问。
请求的 URL 比较短,可以减小网络传输的数据量。
缺点:
查询参数之间存在依赖关系时,需要在客户端进行拼接处理,增加了一定的开发难度。
查询参数过多时,URL 可能会变得过长,影响可读性和维护性。
安全性较低,查询参数可能会被拦截或篡改。
计数器定时查询方式
计数器定时查询方式是指在客户端维护一个计数器变量,每隔一段时间就向服务器发送一个请求,查询计数器的当前值。这种方式的优点是:
优点:
实现简单,只需要在客户端和服务器端维护一个计数器变量。
对服务器的负载比较小,因为每个客户端都是独立维护计数器的。
可以通过调整查询时间间隔来平衡实时性和网络传输的负载。
缺点:
实时性较差,只有在定时查询时才能获取计数器的最新值。
对网络流量的消耗比较大,因为客户端需要定期向服务器发送查询请求。
计数器可能会因为网络延迟或其他原因出现不一致的情况。
独立请求方式
独立请求方式是指客户端向服务器发送一个请求,服务器返回请求结果后立即关闭连接。这种方式的优点是:
优点:
实时性较好,可以及时获取服务器返回的数据。
安全性较高,因为每个请求都是独立的,不容易被拦截或篡改。
对网络流量的消耗比较小,因为每个请求只会占用较短的时间。
缺点:
实现较为复杂,需要客户端和服务器端分别维护连接状态和请求处理状态。
对服务器的负载较大,因为每个请求都需要服务器进行处理。
请求较为频繁时,可能会导致服务器出现过多的连接和并发请求,影响服务器性能。
总体来说,不同的请求方式适用于不同的场景和需求。在实际应用中,
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)