从浏览器地址栏输入网址,到网页彻底打开,中间都发生了什么?

这是一道经典面试题,以前我以为只有我喜欢出这道题,后来在微博上发现其他技术大牛也出这道题。

这道题其实测试的不是具体特定的技术,而是对整个上网这个概念以及背后流程的理解。

我先说一下我所理解或者说我所期待的大概的答题要点,后面再解释这道题的目的和意义,实际上所谓上网这个过程分为三个大的区块,一块是客户端,一块是网络传输层,一块是服务端。

从输入网址开始,这个网址在客户端就会有一个解析,首先浏览器如果有钩子,可能会直接对这个网址做出判断和反馈,比如国内大部分第三方浏览器(IE浏览器基础上加壳的那种),都会直接把地址输入关键词后应该跳转到微软搜索页的那个url劫持掉,所以第一步是浏览器对url的判断和劫持,第二步是本地host文件的判断,在360崛起之前,host文件也是各种木马和流氓软件最爱处理修改的文件,不声不响就把你的hao123给劫持了,而且你几乎看不出来哪里改了。

那么逃脱本地客户端的判断后,这个域名查询请求会发到服务商的dns服务器,服务商的dns服务器会检查缓存,如果不存在你要访问的这个域名或者缓存状态已经过期,会访问根域名服务器,根域名服务器也会先检查缓存,如果无法直接返回结果,会检查这个域名是哪个dns服务器负责解析的,然后将请求转发过去,获得这个域名所对应的ip,然后返回给本地服务商的dns,本地服务商的dns就更新缓存,然后把ip返回给客户端。

当然这里本地dns服务商也可能基于某种目的劫持域名,至于GFW,在这里只能说呵呵吧, 但另一个众所周知的案例是,如果你的IE地址栏输入错关键词,应该默认是跳转到微软的搜索页,假设你用的是原版ie,并且本地没有装各种会给ie加插件的工具,那么你的请求应该是微软搜索页的,但是在地方电信这块依然会被劫持掉,改为当地电信的搜索结果页。所以有时候,有些用户会把自己电脑上网配置的dns修改为更可信赖的公共dns,而不是地方电信的dns。(地方电信的劫持能力当然不止是dns,还包括内容替换,强插。不过这是后面的内容。)

关于解析到ip,复杂点的还可以说说cdn的原理和机制,以及针对不同地区用户智能解析的机制。不过这里就不展开了,当然展开了我也未必说的清楚。

到了ip这里,浏览器发出请求,去指定ip获取指定的文件,这里涉及路由寻址和报文传输,当然如果细说我也说不清了,但是至少知道用tracert可以跟踪路由就好。然后到了指定ip,服务器会在80端口有一个守护进程接受这个请求,细说的话这里还有三次握手的协议,那么下面就是webserver是怎么工作的,静态页面的处理比较简单,动态脚本还需要一个解释器系统工作,执行一段代码后将返回结果输出。这里可能又涉及有服务端缓存的,数据库,负载均衡和轮询等等,也就是可能后面不是一台主机,而是一个集群。再往下变成架构师专题了,就更不能展开了。

但是到这里没完,为什么呢,返回的这个内容页往往又包含了大量的嵌入页面请求,比如css,比如各种小图标,小图片,这又涉及浏览器发出请求,这里也存在一些需要注意的逻辑,比如浏览器在发出请求时,对数量和排队的限制。此外,这个内容页可能还涉及了一些可执行代码,是在浏览器上执行的,这也对你看到什么有重要的影响。

但是到这里依然还没完,在到了目标机房,以及数据返回你的电脑时,都存在一个在子网被劫持被篡改的风险,ARP欺骗,ARP协议是什么,为什么你要访问的内容会被劫持会被篡改。此外,在传输中会不会被侦听,会不会被篡改,上文提过,除了GFW,还有强大的地方电信。

啰嗦这么一堆,可能有人会觉得,我就应聘一个服务端程序员/前端技术/运维工程师,我需要知道这些么?那么问题来了,通常我问这个题目的时候,还会包含一到两个引申题目。

题目1:如果有个用户跟你说,你的网站/游戏很卡很慢,你该怎么分析,怎么响应?

题目2:如果有个用户跟你说,打开你的网站会弹出淫荡小广告或杀毒软件报有木马,你该怎么分析,怎么响应?

看到这些,相信很多人都会发现,哎呀,这还真是个常见问题啊。而这种常见问题的排查,其实就涉及了如上的每个步骤。卡和慢究竟是客户端,网络层还是传输层的问题?如何快速排查和定位出问题,以及影响范围? 这个思考题今天不展开,但是如果没有上面那个流程的认识,这个题目你肯定不可能给出好的结果。

说一个观点,全栈工程师为什么现在这么被看重,是因为大部分问题出现的时候,问题并不会告诉你,它是属于哪个领域的,而需要你来摸索,排查,如果你不具备综合的视野和开阔的思路,你很可能无法找到问题的关键所在。你的能力又怎么体现呢?

其实是不是我们同时需要精通前端,精通网络协议,精通服务端,这个的确太难,但是有一个整体框架的思路,再去精通其中一个领域,你的能力和视野就会上一个台阶,至少在排查问题,技术协同等各个方面会显得更专业,更有自信。

我刚开始接触互联网的时候,刚开始写web程序的时候,那真是一窍不通,我写一个cgi程序,我想让他运行起来,我都糊里糊涂,不知道这个东西是怎么运行的,我跑一个webserver,设置目录权限,糊里糊涂,以及最早看着coolfire的一个黑客手册照猫画虎去拿别人服务器权限的时候,还是糊里糊涂,很长时间都不知道这玩意到底原理是虾米。 我总在想,那些年就没有人跟我讲这些,帮我梳理一下,所以当时很多东西做出来,但是不明白其发生作用的机制,更不明白如何更好的调优和细化。

梳理一下这些,其实花不了太多时间和精力,而梳理后对认识问题的提升,是巨大的,对技术协同意识的提升,也是巨大的。

时间: 2024-12-22 23:53:57

从浏览器地址栏输入网址,到网页彻底打开,中间都发生了什么?的相关文章

web工作方式,浏览网页,打开浏览器,输入网址按下回车键,然后会显示出内容,这个过程是怎样的呢?

以下内容摘自<Go Web编程>,介绍的通俗易懂. 我们平时浏览网页的时候,会打开浏览器,输入网址后按下回车键,然后就会显示出你想要浏览的内容.在这个看似简单的用户行为背后,到底隐藏了些什么呢?对于普通的上网过程,系统其实是这样做的:浏览器本身是一个客户端,当你输入URL的时候,首先浏览器会去请求DNS服务器,通过DNS获取相应的域名对应的IP,然后通过IP地址找到IP对应的服务器后,要求建立TCP连接,等浏览器发送完HTTP Request(请求)包后,服务器接收到请求包之后才开始处理请求包

浏览器从输入网址发生的事(前端优化)

监控网页与程序性能 当在浏览器地址栏输入一个网址开始,到最终页面的呈现,浏览器完成了他的工作.我们要优化这个程序呈现的速度,首先就得弄明白这其中都发生了 什么事? 1.处理环节与顺序 这张图大致的描述了浏览器的一系列工作. 2.chrome中的performance属性 在chrome 浏览器的console中输入window.performace会得到下图的内容 usedJSHeapSize  js对象占用的内存一定小于totalJSHeapSize totalJSHeapSize  可使用的

从输入网址到网页显示过程是什么?

在监测网站前,我们应先了解网络(Web)基本的运作方式.也就是从我们在浏览器中输入网址到浏览器显示页面,这个过程中到底发生了什么事?一般可分为如下7个步骤:1.浏览器中输入网址.2.发送至DNS服务器并获得域名对应的WEB服务器的ip地址. 3.与WEB服务器建立TCP连接.4.浏览器向WEB服务器的ip地址发送相应的http请求.5.WEB服务器响应请求并返回指定URL的数据,或错误信息,如果设定重定向,则重定向到新的URL地址.6.浏览器下载数据后解析HTML源文件,解析的过程中实现对页面的

浏览器地址栏输入提示功能

要求当用户在浏览器的地址栏输入地址时,浏览器能够根据用户输入的历史记录对用户现在的输入进行匹配,提示用户可能要输入的字符.大概意思就是要实现和现在浏览器差不多的效果,比如用户之前输入过aaa,abcd,abcc(简化以下,不考虑前缀"www."和后缀".com"),当用户再次在浏览器地址栏输入a时,系统能够提示aaa,aaaa,abcd,abcc.输入ab时,系统能够提示abcd,abcc. 思路:感觉可以用树的结构解决该问题,解决过程如下: 1.数据结构选择 用户

调出js控制台可以在浏览器地址栏输入about:blank

调出js控制台可以在浏览器地址栏输入about:blank,如果不输入about:blank,直接 打开一个新的页面,有可能输出的结果不准确.也就是说变量有可能被其他的影响到, 造成结果不准确.

chrome浏览器地址栏输入,变成可编辑文本模式

chrome浏览器地址栏输入以下代码: data:text/html,<html contenteditable> 或者 在浏览器开发者控制台console处输入 document.body.contentEditable = true 原文地址:https://www.cnblogs.com/sunbey/p/8372212.html

从浏览器地址栏输入url到页面呈现

举个栗子,从浏览器地址栏输入https://www.baidu.com 到页面呈现百度页面呈现 1.从DNS中得到链接ip地址 ①从浏览器DNS缓存 ②从系统DNS缓存中去,本机系统hosts文件中如果有映射,就返回映射的ip地址 ③从局域网路由器中DNS缓存获取映射地址 ④从DNS服务器缓存获取映射地址 ⑤服务器中查找,com->baidu->www 2.TCP连接,三次握手 ①浏览器发起,询问服务器是否支持响应 ②服务器发起,回复浏览器已准备,可以响应,正在等待 ③浏览器接收到后,发起确认

在浏览器输入网址到网页打开数据经过的过程

<1>客户端输入网址,请求与服务器的80端口建立连接. <2>服务器收到请求,并响应客户端: <3>客户端接收到服务器的响应,准备开始接收数据.服务器开始发送数据. (三次握手) 第1次握手:客户端通过将一个含有"同步序列号(SYN)"标志位的数据段发送给服务器 请求连接. 第2次握手:服务器用一个带有"确认应答(ACK)"和"同步序列号(SYN)"标志位的 数据段响应客户端. 第3次握手:客户端发送一个数据段

当你在浏览器地址栏输入一个URL后回车,将会发生的事情?

作为一个软件开发者,你一定会对网络应用如何工作有一个完整的层次化的认知,同样这里也包括这些应用所用到的技术:像浏览器,HTTP,HTML,网络服务器,需求处理等等. 本文将更深入的研究当你输入一个网址的时候,后台到底发生了一件件什么样的事- 1. 首先嘛,你得在浏览器里输入要网址: 2. 浏览器查找域名的IP地址 导航的第一步是通过访问的域名找出其IP地址.DNS查找过程如下: 浏览器缓存 – 浏览器会缓存DNS记录一段时间. 有趣的是,操作系统没有告诉浏览器储存DNS记录的时间,这样不同浏览器