在浏览器输入 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
在浏览器输入 URL 后会发生什么?超级详细介绍的更多相关文章
- 在浏览器输入url后并回车发生了哪些过程
1.解析URL ________________________________________________________________________ 关于URL: URL(Universa ...
- 当在浏览器地址栏里输入URL后会发生什么事情
其实这个很多大神已经说的很多了.但是为了自己更好的理解,在自己所接触的层面上,重新对自己讲解一下.当然,这是站在一个前端开发者的角度上来看问题的. 说说一次HTTP完整事务的过程 输入URL 浏览器从 ...
- 在浏览器输入URL后发生了什么?
摘录部分一:https://www.cnblogs.com/kongxy/p/4615226.html 从输入URL到浏览器显示页面发生了什么 当在浏览器地址栏输入网址,如:www.baidu.com ...
- 浏览器输入url后发生的事情以及每步可以做的优化
首先总结下输入url按下回车后的大致流程: 查询url的ip地址. 建立tcp连接,连接服务器. 浏览器发起http/https请求. 服务器响应浏览器的请求. 网页的解析与渲染. 下面分析每个过程 ...
- 天龙八步"细说浏览器输入URL后发生了什么
本文摘要: 1.DNS域名解析: 2.建立TCP连接: 3.发送HTTP请求: 4.服务器处理请求: 5.返回响应结果: 6.关闭TCP连接: 7.浏览器解析HTML: 8.浏览器布局渲染: 总结 输 ...
- 【转】浏览器输入URL后发生了什么
转自:http://www.cnblogs.com/webdeve/p/7865520.html本文摘要: 输入网址 当我们在浏览器输入网址并回车后,一切从这里开始. 一.DNS域名解析 我们在浏览器 ...
- “天龙八步”细说浏览器输入URL后发生了什么
本文摘要: 1.DNS域名解析: 2.建立TCP连接: 3.发送HTTP请求: 4.服务器处理请求: 5.返回响应结果: 6.关闭TCP连接: 7.浏览器解析HTML: 8.浏览器布局渲染: 总结 输 ...
- 细说浏览器输入URL后发生了什么
本文摘要: 1.DNS域名解析: 2.建立TCP连接: 3.发送HTTP请求: 4.服务器处理请求: 5.返回响应结果: 6.关闭TCP连接: 7.浏览器解析HTML: 8.浏览器布局渲染: 总结 ...
- 浏览器输入URL后发生了什么
假如在浏览器中输入了www.cnblogs.com,然后回车 DNS解析 浏览器检查浏览器缓存是否有域名对应的IP. 浏览器查找操作系统是否有对应的DNS解析成果(hosts文件). 查找路由器缓存. ...
随机推荐
- SQLServer中的事务与锁
事务:保持逻辑数据一致性与可恢复性,必不可少的利器. 锁:多用户访问同一数据库资源时,对访问的先后次序权限管理的一种机制,没有他事务或许将会一塌糊涂,不能保证数据的安全正确读写. 死锁:是数据库性能的 ...
- shell note
1 输出重定向:ll > aaa 将输出内容 添加到aaa文件中 ll >> aaa将输出内容追加到aaa中 ll &>> abc 将输出内容不论正确或错误都保存 ...
- 【JavaEE企业应用实战学习记录】struts国际化
<%-- Created by IntelliJ IDEA. User: Administrator Date: 2016/10/6 Time: 16:26 To change this tem ...
- 70 sudo-用来以其他身份来执行命令
sudo命令用来以其他身份来执行命令,预设的身份为root.在/etc/sudoers中设置了可执行sudo指令的用户.若其未经授权的用户企图使用sudo,则会发出警告的邮件给管理员.用户使用sudo ...
- 用自己的话描述wcf中的传输安全与消息安全的区别(三)
消息交换安全模式 PS:很多书上把transfer security和transport security都翻译成“传输安全”,这样易混淆.我这里把transfer说成消息交换安全. 安全的含义分为验 ...
- 创建模型,设置id
/** * 创建模型,设置id */ Ext.onReady(function(){ Ext.define('Person',{ extend:'Ext.data.Model', idProperty ...
- C#反射设置属性值和获取属性值
/// /// 获取类中的属性值 /// /// /// /// public string GetModelValue(string FieldName, object obj) { try { T ...
- Hibernate断网修改配置文件实现正常验证运行
hibernate.cfg.xml中声明部分: <!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Conf ...
- [转]关于jquery中html()、text()、val()的区别
原文地址:http://www.cnblogs.com/xiaolifeidao/p/3715830.html .html()用为读取和修改元素的HTML标签 对应js中的innerHTML . ...
- iOS开发小技巧--学会包装控件(有些view的位置由于代码或系统原因,位置或者尺寸不容易修改或者容易受外界影响)
一.百思项目中遇到了两处这样的问题, 第一处 - 是评论界面的headerView,由于直接把自己搞的xib加载了放在了那里,xib中setFrame写了好多-= +=,每次滚动的时候,会频繁调用x ...