为何浏览器网址非得要输入完整网址才找的到?

这是面试中一道非常经典的问题

当你在浏览器网址中输入一个网址,浏览器网址的处理过程如下:

第一步 浏览器网址查找该域名的 IP 地址
第二步 浏览器网址根据解析得到嘚IP地址向 web 服务器发送一个 HTTP 请求
第三步 服务器收到请求并进行处理
第四步 服务器返回一个响应
第五步 浏览器网址对该响应进行解码渲染显礻。
第六步 页面显示完成后浏览器网址发送异步请求。

下面对每个环节做进一步分析:

01 浏览器网址查找该域名的 IP 地址

浏览器网址缓存 首先是查找浏览器网址缓存,浏览器网址会缓存DNS记录一段时间不同浏览器网址保存的时常不等(2分钟到30分钟不等)。 

系统缓存 如果在浏览器網址缓存里没有找到需要的记录浏览器网址会做一个系统调用来查找这个网址的对应DNS信息。 

路由器缓存 如果在系统缓存里没有找到找到對应的IP请求会发向路由器,它一般会有自己的DNS缓存 

ISP DNS服务器 如果在路由器缓存里还是没有对应的IP,请求会被发送到ISP 

根域名服务器 如果還是没有,请求将发向根域名服务器进行搜索找不到就说明此域名不存在。

02 浏览器网址根据解析得到的IP地址向 web 服务器发送一个 HTTP 请求

       例如“”服务器会给浏览器网址响应一个301永久重定向响应,这样浏览器网址就会访问“” 而非“”

服务器重定向的原因有很多,举其中两個: 

       一:跟搜索引擎排名有关你看,如果一个页面有两个地址就像“” 和“”。搜索引擎会认为它们是两个网站结果造成每一个的搜索链接都减少从而降低排名。 

       二:不同的地址会造成缓存友好性变差当一个页面有好几个名字时,它可能会在缓存里出现好几次

然後浏览器网址会跟踪重定向地址 

       通过DNS获取到IP后,目标IP和本机IP分别与子网掩码相与的结果相同那么它们在一个子网,那么通过ARP协议可以查箌目标主机的MAC地址否则的话,需要通过网关转发也就是目标MAC是网关的MAC。 

 请求需要进行编码生成一个HTTP数据包,依次打上TCP、IP、以太网协議的头部其中TCP头部主要信息是本机端口和目标端口号等信息,用于标识同一个主机的不同进程对于HTTP协议,服务器端的默认端口号是80夲机浏览器网址的话生成一个1024到65535之间的端口号。IP头部主要包含本地IP和目标IP等信息以太网协议头部主要是双方的MAC地址,目标MAC可以由第一条所诉方法得到以太网数据包的数据部分,最大长度为1500字节所以如果IP包太大的话还要拆包,比如IP包5000字节要分为4包,每一包都包含一个IP頭部

03 服务器收到请求并进行处理

       负载均衡,即对工作任务进行平衡分摊到多个操作单元上执行,如图片服务器应用服务器。可分为鏈路负载均衡集群负载均衡,操作系统负载均衡 

       请求的数据可能存储在分布式缓存、静态文件或者数据库中如果请求的数据是静态文件,如果在CDN上那么CDN服务器又会处理这个用户的请求。如果在数据库中需要向数据库发起查询请求

04 服务器返回一个响应

       服务器返回一个 HTTP 響应,如果返回状态码304浏览器网址可以直接使用之前缓存的资源。对于内容响应浏览器网址需要进行响应解码,渲染显示

05 浏览器网址对该响应进行解码,渲染显示

       在浏览器网址没有完整接受全部HTML文档时,它就已经开始显示这个页面了如果是个静态的页面,拿到此僦基本结束了如果是是动态的,那么在浏览器网址显示HTML时会获取嵌入在HTML中的对象,浏览器网址会发送获取请求来重新获得这些文件這些请求都要经历一个和HTML读取类似的过程。 

       对于静态的页面内容浏览器网址通常会进行缓存,而对于动态的内容浏览器网址通常不会進行缓存。

06 页面显示完成后浏览器网址发送异步请求。

它会持续与服务器保持联系来及时更新一些页面信息在浏览器网址中执行的 JavaScript代碼会给服务器发送异步请求。这个异步请求发送给特定的地址它是一个按照程式构造的获取或发送请求。

01 每个主机都会在自己的ARP缓冲区Φ建立一个ARP列表以表示IP地址和MAC地址之间的对应关系。 

02 当源主机要发送数据时首先检查ARP列表中是否有对应IP地址的目的主机的MAC地址,如果囿则直接发送数据,如果没有就向本网段的所有主机发送ARP数据包,该数据包包括的内容有:源主机 IP地址源主机MAC地址,目的主机的IP 地址 

03 当本网络的所有主机收到该ARP数据包时,首先检查数据包中的IP地址是否是自己的IP地址如果不是,则忽略该数据包如果是,则首先从數据包中取出源主机的IP和MAC地址写入到ARP列表中如果已经存在,则覆盖然后将自己的MAC地址写入ARP响应包中,告诉源主机自己是它想要找的MAC地址 

04 源主机收到ARP响应包后。将目的主机的IP和MAC地址写入ARP列表并利用此信息发送数据。如果源主机一直没有收到ARP响应数据包表示ARP查询失败。

       RARP是逆地址解析协议作用是完成硬件地址到IP地址的映射,主要用于无盘工作站因为给无盘工作站配置的IP地址不能保存。 

 工作流程:在網络中配置一台RARP服务器里面保存着IP地址和MAC地址的映射关系,当无盘工作站启动后就封装一个RARP数据包,里面有其MAC地址然后广播到网络仩去,当服务器收到请求包后就查找对应的MAC地址的IP地址装入响应报文中发回给请求者。因为需要广播请求报文因此RARP只能用于具有广播能力的网络。

作为一个软件开发者你一定会對网络应用如何工作有一个完整的层次化的认知,同样这里也包括这些应用所用到的技术:像浏览器网址HTTP,HTML网络服务器,需求处理等等

本文将更深入的研究当你输入一个网址的时候,后台到底发生了一件件什么样的事~

顶级域名服务器到Facebook的域名服务器一般DNS服务器的緩存中会有.com域名服务器中的域名,所以到顶级服务器的匹配过程不是那么必要了

DNS递归查找如下图所示:

DNS有一点令人担忧,这就是像这样嘚整个域名看上去只是对应一个单独的IP地址还好,有几种方法可以消除这个瓶颈:

  •  
    头信息以之前请求中的意义相同



  • 请求处理阅读请求忣它的参数和cookies。它会读取也可能更新一些数据并讲数据存储在服务器上。然后需求处理会生成一个HTML响应。

所 有动态网站都面临一个有意思的难点 -如何存储数据小网站一半都会有一个SQL数据库来存储数据,存储大量数据和/或访问量大的网站不得不找一些办法把数据库分配箌多台机器上解决方案 有:sharding (基于主键值讲数据表分散到多个数据库中),复制利用弱语义一致性的简化数据库。

委 托工作给批处理昰一个廉价保持数据更新的技术举例来讲,Fackbook得及时更新新闻feed但数据支持下的“你可能认识的人”功能只需要每晚更新 (作者猜测是这樣的,改功能如何完善不得而知)批处理作业更新会导致一些不太重要的数据陈旧,但能使数据更新耕作更快更简洁

时需要重获取的幾个URL:

    //////”在地址中代表什么?聪明的答案是"Facebook内容分发网络"Facebook利用内容分发网络(CDN)分发像图片,CSS表和JavaScript文件这些静态文件所以,这些文件會在全球很多CDN的数据中心中留下备份

    静态内容往往代表站点的带宽大小,也能通过CDN轻松的复制通常网站会使用第三方的CDN。例如Facebook的静態文件由最大的CDN提供商Akamai来托管。

    举例来讲当你试着ping 的时候,可能会从某个/ajax/chat/buddy_list.php一个发布请求来获取你好友里哪个 在线的状态信息

    提起这个模式,就必须要讲讲"AJAX"-- “异步JavaScript 和 XML”虽然服务器为什么用XML格式来进行响应也没有个一清二白的原因。再举个例子吧对于异步请求,Facebook会返回┅些JavaScript的代码片段

    除了其他,fiddler这个工具能够让你看到浏览器网址发送的异步请求事实上,你不仅可以被动的做为这些请求的看客还能主动出击修改和重新发送它们。AJAX请求这么容易被蒙可着实让那些计分的在线游戏开发者们郁闷的了。(当然可别那样骗人家~)

    Facebook聊天功能提供了关于AJAX一个有意思的问题案例:把数据从服务器端推送到客户端。因为HTTP是一个请求-响应协议所以聊天服务器不能把新消息发给客戶。取而代之的是客户端不得不隔几秒就轮询下服务器端看自己有没有新消息

    这些情况发生时长轮询是个减轻服务器负载挺有趣的技术。如果当被轮询时服务器没有新消息它就不理这个客户端。而当尚未超时的情况下收到了该客户的新消息服务器就会找到未完成的请求,把新消息做为响应返回给客户端

当你在浏览器网址中输入网址(唎如)并且敲了回车以后 浏览器网址首先要做的事情就是获得的IP, 这时候浏览器网址通常会把IP地址给缓存起来,这样下次访问就会加快

囿了服务器的IP, 浏览器网址就要可以发起HTTP请求了但是HTTP Request/Response必须在TCP这个“虚拟的连接”上来发送和接收。想要建立“虚拟的”TCP连接TCP需要知道4個东西:(本机IP, 本机端口,服务器IP, 服务器端口)现在只知道了本机IP,服务器IP, 两个端口怎么办本机端口很简单,操作系统可以给浏览器網址随机分配一个 服务器端口更简单,用的是一个“众所周知”的端口HTTP服务就是80, 我们直接告诉TCP邮差就行

经过三次握手以后,客户端和服务器端的TCP连接就建立起来了! 终于可以发送HTTP请求了



浏览器网址没有办法,只好一个个地下载从使用DNS获取IP开始,之前做过的事情還要再来一遍不同之处在于不会再有应用服务器如Tomcat的介入了。

如果需要下载的外部资源太多浏览器网址会创建多个TCP连接,并行地去下載

但是同一时间对同一域名下的请求数量也不能太多,要不然服务器访问量太大受不了。所以浏览器网址要限制一下 例如Chrome在的内容。

我要回帖

更多关于 浏览器网址 的文章

 

随机推荐