在浏览器输入 URL 后会发生什么?超级详细介绍

一个古老的面试问题:当你在浏览器中输入whosmall.com并且按下回车之后发生了什么? 不过我们不再局限于平常的回答,而是想办法回答地尽可能具体,不遗漏任何细节。 这将是一个协作的过程,所以深入挖掘吧,并且帮助我们一起完善它。仍然有大量的细节等待着你来添加,欢迎向我们发送Pull Requset! 回车键按下为了从头开始,我们选择键盘上的回车键被按到最低处作为起点。在这个时刻,一个专用于回车键的电流回路被直接或者通过电容器闭合了,使得少量的电流进入了键盘的逻辑电路系统。这个系统会扫描每个键的状态,对于按键开关的电位弹跳变化进行噪音消除(debounce),并将其转化为键盘码值。在这里,回车的码值是13。键盘控制器在得到码值之后,将其编码,用于之后的传输。现在这个传输过程几乎都是通过通用串行总线(USB)或者蓝牙(Bluetooth)来进行的,以前是通过PS/2或者ADB连接进行。
USB键盘: 键盘的USB元件通过计算机上的USB接口与USB控制器相连接,USB接口中的第一号针为它提供了5V的电压 键码值存储在键盘内部电路一个叫做"endpo…

于是决定补充一下写得比较简略的部分。本人比较懒,不倾向于码长篇,因此决定分节写。写到哪里算哪里,每次写一小点,有错还望指正。

由于是(一),就聊得宏观一点,关于Web体系结构的。在浏览器地址栏输入URL后会触发到Web体系结构中的哪些部分。

一个简单的版本便如前文所述,1)由客户端本地向DNS服务器请求把URL转换为IP地址,2)从客户端到那个IP地址建立一个TCP连接,3)若加密则需要SSL/TLS握手,其中涉及到接触CA,4)由客户端向那个IP地址发起HTTP请求(就不另说SPDY了,它就是HTTP/2的前身,都统称HTTP吧那就),5)那个IP地址所在机器正好存有所需全部内容,便一股脑dump出来成为HTTP response发送回客户端。Done!这个简单版本涉及了Web体系结构中的客户端,服务器,DNS服务器,CA。而实际情况中远不止这些的。

首先,服务器这个说法显得特别别扭。对于大规模网站来讲,服务器的种类有很多,功能也都不一样。有种说法叫做前端服务器,似乎暗示了服务器有两种,前端和后端。但我时常感到很费解,因为前端服务器到底有多前端呢?这里来粗略给服务器按照从前往后的顺序分一下类。

排在最前端的服务器叫做reverse proxy,就是DNS解析出来的那个IP地址所在地。为什么叫做reverse proxy?它是跟一般指的forward proxy相对应的。个人的理解是,一般指的proxy服务对象是它之前的部分,比如客户,但是reverse proxy服务对象是它之后的部分,即网站的比它后的后端们。为什么需要用到reverse proxy呢?首先,它可以用作load balancer负载均衡器。其次,它可以被安放到离用户很近的位置,缩短整体延迟。reverse proxy的带宽I/O等资源占用较多,CPU占用不多。

在reverse proxy之后的一层就是通常所说的前端服务器(根据各网站需要,在reverse proxy和前端中还可以加一些层,用以不同的功能,这里暂时不讲)。前端服务器的主要功能就是整合服务器端代码的。对于用php的网站就是跑php以生成前端代码,对于用node.js的网站就是跑node以生成前端代码。很明显前端服务器用到的CPU资源会更多。但是前端服务器并不用被放在离用户近的地方,因为这个需求已经由reverse proxy满足了。

在前端服务器之后一层是什么呢?通常来讲还是前端服务器。那它和之前提到的前端服务器有什么联系和区别呢?它们的关系就像slave(从)和master(主)一样。后面这层前端服务器是用来跑网页中的一小部分(pagelets),而前面那层前端服务器通常是用来组合这些pagelets的。那么为什么要搞两层前端服务器而不只用一层?因为快啊,这里快的定义是可观测到的整体延迟,嗯。其实哪些机器跑哪一层都无所谓,主要思想是要让一个页面的pagelets同时生成。一个例子是Quora[2],这篇文章很简明易懂,卖了一圈关子最后的解决方案是用更beefy的EC2机子也是醉了。

在前端服务器之后是什么呢?用户数据呀,也就是所谓的后端。用户数据的存储往往作为最后端的后端,这是为什么呢?因为整体数据量大,但是单个用户用得到的数据量又很小(感觉还是有点强盗逻辑-_-bbb)。如果反过来想想,把部分用户用得到的放前面,所有用户用得到的放后面,那么就会有用户先访问自己不需要的部分,再访问自己需要的部分,就产生了浪费。所以需要把越是共享的部分放前面,越是不共享的部分放后面。

那么在用户数据存储的背后还有什么么?我暂时是想不到了,不过根据某些网站的需求,它的前面还可以有。是什么?简单来说就是缓存,具体来说就是流行的memcached。所有数据以persistent的形式存放在最后的后端的硬盘里,而memcached不persistent但因为在内存里所以快。所以最后一层数据存储应该是占用了较多硬盘资源,而缓存这一层占用较多内存资源。也不是所有数据存储都这样分层的,数据存储还有很多,比如什么redis啊cassandra啊mongodb一类的,我也不是专家,就不在这里献丑了。

那么问题来了,平时说到的大规模数据处理比如Hadoop啊Spark啊属于这里的哪一层?哈哈,别被我绕进来了,它们哪一层都不属于。这里说到的Web体系结构都是实时的,要是实时跑个Hadoop Spark啥的用户一定暴走了亲。倒是有在做实时数据处理的,对Twitter啊Uber啊以及关键词屏蔽(咳咳)一类的应用有用,我不是专家,不献丑。。。

为什么要专门讲讲在浏览器里输入URL后涉及到的Web体系结构呢?有时候提到的一些概念,虽然名字都一样,但具体指什么是跟讲到Web体系结构中的哪一部分密切相关的。比如上面说到的前端,还有经常被提到的网站加速。说实在的我很讨厌“加速”这种说法,首先什么是“速”?延迟,还是吞吐量?哪里的延迟,哪里的吞吐量?站在用户的角度,只有端到端的延迟才是有意义的测量量,而站在网站的角度,某些机子的吞吐量就是有足够意义的测量量了,因为提高吞吐量就是$$$啊。

哦,对了,在Web体系结构中还有很重要的一样东西忘了讲,就是CDN,content distribution network。它主要是用来存储图片和视频等大资源的,它和reverse proxy有点像,主要是需要离用户近,以此来提“速”。这里我用“速”了,因为它提升了网络延迟,带宽,以及更少的丢包,所以用“速”或者说“网速”来统称不为过。最著名的CDN公司就是Akamai了,当然大的网站主要是用自己的CDN,比如Google,Facebook有自己的CDN同时也是Akamai客户。

最后抛出一个问题。在这么多层的Web体系结构中哪些层是所有用户一视同仁的,哪些层是分开对待用户的,为什么?结合它们与用户之间的距离(用层数表示),谈谈为什么会是这样的设计?

原文地址:http://whosmall.com

上一篇:12.Linux软件安装 (一步一步学习大数据系列之 Linux)


下一篇:wrong requestcode when using startActivityForResult