自己总结:
解析DNS(host文件->远程DNS服务器)
发送http请求(头部和一个请求体)
服务器脚本处理生成内容(连接数据库等)
服务器发回HTML响应
客户端渲染解析(html,css,js)
继续加载其他地址的资源,如CDN上的图片
按需执行AJAX
1)把URL分割成几个部分:协议、网络地址、资源路径。其中网络地址指示该连接网络上哪一台计算机,可以是域名或者IP地址,可以包括端口号;协议是从该计算机获取资源的方式,常见的是HTTP、FTP,不同协议有不同的通讯内容格式;资源路径指示从服务器上获取哪一项资源。
例如:http://www.guokr.com/question/554991/
协议部分:http
网络地址:www.guokr.com
资源路径:/question/554991/
2)如果地址不是一个IP地址,通过DNS(域名系统)将该地址解析成IP地址。IP地址对应着网络上一台计算机,DNS服务器本身也有IP,你的网络设置包含DNS服务器的IP。
例如:www.guokr.com 不是一个IP,向DNS询问请求www.guokr.com 对应的IP,获得IP: 111.13.57.142。这个过程里,你的电脑直接询问的DNS服务器可能没有www.guokr.com 对应的IP,就会向它的上级服务器询问,上级服务器同样可能没有,就依此一层层向上找,最高可达根节点,找到或者全部找不到为止。
3)如果地址不包含端口号,根据协议的默认端口号确定一个。端口号之于计算机就像窗口号之于银行,一家银行有多个窗口,每个窗口都有个号码,不同窗口可以负责不同的服务。端口只是一个逻辑概念,和计算机硬件没有关系。
例如:www.guokr.com 不包含端口号,http协议默认端口号是80。如果你输入的url是http://www.guokr.com:8080/,那表示不使用默认的端口号,而使用指定的端口号8080。
4)向2和3确定的IP和端口号发起网络连接。
例如:向111.13.57.142的80端口发起连接
5)根据http协议要求,组织一个请求的数据包,里面包含大量请求信息,包括请求的资源路径、你的身份
例如:用自然语言来表达这个数据包,大概就是:请求 /question/554991/ ,我的身份是xxxxxxx。
6)服务器响应请求,将数据返回给浏览器。数据可能是根据HTML协议组织的网页,里面包含页面的布局、文字。数据也可能是图片、脚本程序等。现在你可以用浏览器的“查看源代码”功能,感受一下服务器返回的是什么东东。如果资源路径指示的资源不存在,服务器就会返回著名的404错误。
7)如果(6)返回的是一个页面,根据页面里一些外链的URL,例如图片的地址,按照(1)-(6)再次获取。
8)开始根据资源的类型,将资源组织成屏幕上显示的图像,这个过程叫渲染,网页渲染是浏览器最复杂、最核心的功能。
9)将渲染好的页面图像显示出来,并开始响应用户的操作。
以上只是最基本的步骤,实际不可能就这么简单,一些可选的步骤例如网页缓存、连接池、加载策略、加密解密、代理中转等等都没有提及。即使基本步骤本身也有很复杂的子步骤,TCP/IP、DNS、HTTP、HTML:每一个都可以展开成庞大的课题,而浏览器的基础——操作系统、编译器、硬件等更是一个比一个复杂。不是计算机专业的同学看了上面的解释完全不明白是很正常的,可能会问为什么要搞得那么复杂,但我保证这每一个步骤都经过深思熟虑和时间的考验。你输入URL即可浏览互联网,而计算机系统在背后做了无数你看不到的工作,计算机各个子领域无数工程师为此付出你难以想象的努力。
一直在等大神从量子物理层面解释一下 o(╯□╰)o 到现在大神还没粗线,本滥竽来充个数
----------------------------------------------------------------------------------------------------------
不懂量子物理,只从计算机网络角度说说自己的理解:
个人以为,图中问题主要来考察对互联网体系结构相关的基础知识,往细了说会涉及更多知识。这种问题最常出现在网络应用、尤其是Web应用开发的领域(比如大型网站开发)、或Web安全领域职位的面试中,这两个领域会对网络知识覆盖面比较广,尤其是Web安全领域;另一方面,在研发领域最近有个名词叫“全栈工程师”,大意是前端后台无所不通,就需要对网络知识掌握比较全面(架构、设计、编码都属于另外的技能咯),当然,这样的研发工程师比较难得。
依照上述领域对知识技能的要求,大概可分为三个方面:前端、后台和连接前端后台的网络数据传输。
前端:
主要是围绕浏览器的工作展开,包括浏览器处理用户的交互、发送网络请求、收到网络响应之后的处理与渲染等等。
后台:
主要涉及Web服务器(不是大刀片那种的“硬件服务器”)对网络请求的处理。可以直观认为Web服务器就是接受并处理浏览器发送的某些协议的网络请求、并把对应处理结果返回给用户端浏览器的网络应用程序。主流Web服务器有Apache/IIS/Nginx/Tomcat(不同的Web服务器程序与不同的后台脚本程序语言或者技术配套处理网络请求,比如Tomcat主要与JSP语言配套,微软的IIS主要与ASP/ASPX技术配套结合);Web服务器通常可以接受静态请求并直接返回静态内容,但遇到动态内容的请求(目前Web应用大多数动态的),Web服务器就要把请求委托给各种语言和技术开发的“Web后台程序”,由后台程序处理动态请求,再把处理后的结果(响应内容)交给Web服务器,最后Web服务器会把响应通过互联网返回给用户端浏览器。这方面再细节的话主要就是后台程序的架构、开发、优化技术了,此处不详说。
网络数据传输:
个人认为这方面的知识才是图中问题考察的主要部分。这方面的知识从整体到细节,会涉及:
这部分内容相当繁琐复杂,但里面的各种基础知识是从事网络应用开发、网络运维、网络安全领域人员的必备知识,每逢面试,总会反复提及,面试官会以各种姿势提问,防不胜防。
果壳新手,第一次答题,啰啰嗦嗦,多有疏漏,各位轻拍。
回车前
1. 如果用某些输循入法输入, 它会按标准结果、缓存匹配、发送到去端匹配, 给你几个联想结果。
你对结果的修改会反馈到去端。
2. 现在智能的浏览器,输入栏, 也做了第1步的事。
3. 可能有木马hook了地址栏, 或一系列调用链中的某一步,窃取你的信息,可能还会在后面转向你的网页
4. 安全软件可能hook了地址栏,或一系列调用链中的某一步, 分析你的输入, 比如发现是支付网站, 就帮你检查运行环境是否安全。
5. 统计插件也可以上报该网站增加了一次点击了。
回车后
分析域名, 如果不是ip,在本地hosts里查一把, 没查到? 查dns缓存,没查到或过期? 发dns请求(windows一般配主备dns, 不解释了吧)
dns服务器层层再向上查, 到根结点再指向具体网站的dns服务器。具体网站的dns服务器, 还可以做负载均衡, 选则合适的ip返回。 这里可以返回多ip, 但中转的dns怎么缓存, 怎么缓存时又支持不同的负载ip,没去研究。
发dns一般是udp也支持tcp, 它们都是ip网络层之上的。 dns服务器有ip地址,但两个ip地址中间可能隔了很多交换机路由器防火墙。
对于浏览器本地机器来说, 就是查路由表, 找到第一个ip(目标或中转ip)。 开始数据链路层了, 通过arp协议知道对方mac地址(这里可能被欺骗,然后就发给劫持者了,或者被斯诺登窃听了。所以要用https这类密文传输,或者关键字段自已加密,同时要做签名防篡改。整个链路的每两个点之间传输都有这个问题) 然后数据就发出去了
交换机不说了
防火墙, 按源目标ip/port协议等,匹配规则,看是否允许,生成session。新生成Session比较耗cpu, 所以长连接跨墙性能好。 还有应用层的防火墙功能, 还分析数据包, 目前类似绿坝这类,还有企业监控的,XX监控的会用。 但这个性能要求更高。
路由器, 基本功能不在连接session里的再查路由表。udp不像tcp有滑动窗口的,还有惩罚机制限速。
以上网络的部分是通用的, 不只是说dns.
查到ip后
有了ip 端口(按协议http默认80 https默认443), 进行tcp连接
从服务端说哈, 先到网关, 一般网关会做nat, 并会负载均衡到一台缓存机(CDN,或nx、squid等) , 缓存机存静态页面, 动态的有种协议可以在静态页里打个标记,只从后端取这个标记地址,或者动态页面完全不经过缓存机直接到大的web服务器。
web服务器一般会访问数据, 可能有memcache, 或读写分离的数据库,或中间件, 现在一般要分布式,要两地三中心跨城容灾, 在中国要互联互通,在海外建idc就近访问也不被墙。 要专线。。。
如果https还要各种加密签名几次握手做tcp上一层的连接
终于连接上了
send http get请求
终于收到第一个回包了(可能是zip啥格式的浏览器还要解一下)
右键看源码包, 里面还静态引用了无数的链接(脚本、图片、媒体等等)。
本地有没过期的缓存?用本地的, 不然,一个个拉回来吧。
浏览器也有规则怎么显示他们, 比如图片支持从模糊到清晰显示, 页面拉到的部分先显示等等。
页面获取cookie信息进行展现。
页面上的脚本开始跑了, 他们可以后台异步的做些事ajax啥的
脚本从cookie中获取session id get动态页面, 服务器收到session id取服务端未过期的信息。这些cooki/session和登录信息, 可以将行为关联起来, 可以做大数据的生成。 做动态页面的展现,比如精准广告。
再写就鸡叫了