Friparia Blog

Do more

你在浏览器里面输入网址后都发生了什么

| Comments

最近好多面试题里面都有这道题目,而我在看书的时候也在书上发现了差不多的问题,于是就想总结一下这个过程。

当你在地址栏里输入www.friparia.com后按下回车,浏览器首先会进行DNS查询,因为对于网络上的计算机来说,它们的地址其实是由一个32位二进制数(IP地址)所确定的,我们人类上网的话没有办法记住这些数字,于是就有了一个分布式的数据库来保存域名和IP地址的映射关系,使我们更方便的上网。我们在网络设置中看到的DNS服务器一般是指我们的本地局域网的DNS缓存服务器,而全球一共有13组根域名服务器。可以在命令行模式下运行nslookup命令进行DNS查询

当进行完DNS查询后,我们的浏览器便知道我们需要访问的地址是198.52.124.101,此时大多数浏览器会发送两个HTTP请求,一个是GET /index.html,一个是GET /favicon.ico,index.html是网站的主页,而favicon.ico这个文件是所对应的那个小图标。

我们拿/index.html的这个请求单独来说,在应用层,使用的是HTTP协议,HTTP是一个在应用层的协议,服务器端一般使用80端口,下面是一个客户端的请求和一个服务器应答的头的例子。

客户端请求
1
2
GET / HTTP/1.1
Host:www.friparia.com
服务器响应
1
2
3
4
5
6
7
HTTP/1.1 200 OK
Content-Length: 3059
Server:nginx/1.0.15
Last-Modified:Mon, 16 Jun 2014 10:08:28 GMT
Expires:Mon, 25 Aug 2014 10:16:27 GMT
Date:Mon, 25 Aug 2014 12:39:13 GMT
Connection:keep-alive

客户端发出一个HTTP版本为1.1的GET请求,通常客户端请求的方法有GET、POST等,现在RESTful API的设计又将以前不怎么使用的UPDATE、PUT、DELETE等方法用上了。 服务器收到请求后经过处理就会发出一个响应,这个响应的状态号为200 OK,表示找到所需的文档并且回传过来,我们熟知的404 Not Found也是同样的,其实墙不会返回404,404表示的是服务器能和你有连接但是你所需要的文件不存在,而墙会直接把你的IP数据报给处理掉,当然IE旧版本的做法就是显示本地的404页面。上述仅仅是HTTP头的部分,HTTP内容是由头中的Content-Length所定义的,这内容就是我们index.html的具体内容了。

HTTP协议是应用层上的,是由对应的软件(浏览器/HTTP服务器)所使用的,他会将所有数据按字节流送到传输层,使用TCP协议将数据发送出去。计算机网络按照OSI标准分为七层,分别是物理层、数据链路层、网络层、传输层、会话层、表示层、应用层,但是实际的网络并没有严格的使用这个标准。

在TCP协议中,是端对端的通信,是网络中计算机的进程之间的通信,TCP使用了三次握手和四次挥手来保证传输的可靠性,并且使用滑动窗口来进行拥塞控制,以保证我们的数据能够准确的到达目的地。和TCP同样在传输层的协议是UDP,是不可靠的无连接协议,在刚开始我们所说的DNS就是使用了UDP协议进行传输的。

TCP报文封装好之后,便交给下层的进行IP分片,网络层的通信就是计算机之间的了,是一个IP地址到另一个IP地址,IP是有着最大长度1500字节,所以为了保证传输所以要将TCP报文进行分片,再进行传输。在网络层,我们使用路由器来进行数据的中转,比如我在一个局域网中的IP是192.168.1.101,这时候计算机会将数据发送到网关,即就是直接和你相连的那个路由器(或交换机),然后路由器查找自己的路由表将数据传送到下个节点,正是这种分布式的网络,以及易于扩展的特性,使得互联网发展的如此迅速。

说完互联网中两台计算机具体是如何通信的后,我们来了解下局域网内计算机和计算机或者说我们的计算机到路由器之间是怎么传送数据的。每一块网卡在出厂的时候都有一个唯一的MAC地址,当我们在局域网内发送数据的时候,就是使用的MAC地址而不是IP进行查找的。比如我们的路由器收到了服务器的响应,现在要将他发送到你的计算机上,它会先发一条广播信息,询问谁是192.168.1.101,在局域网内(一个广播域内),所有计算机都会收到这条信息,但是只有192.168.1.101进行回答,并且将自己的MAC地址发送回去,路由器便使用这个MAC地址进行局域网内的数据传送,这就是ARP协议。

当这个文件在网络上传输完成时,浏览器会对这个HTML文件进行解析,HTML是一种标记语言,标记一些常用的元素,如标题、段落、表格等,由W3C进行标准的维护。在Webkit(Chrome所使用的内核)中,接受服务器所发送过来的数据,解析成一系列的Tokens,然后在加载结束后建立DOM树,DOM是对HTML或者XML文档的一种结构化表示方法,通过这种方法,用户可以通过提供标准的接口来访问HTML页面中任何元素的相关属性,并可对DOM进行相应的添加、删除和更新操作等。Webkit根据需要来创建Render树,然后基于这个Render树建立一棵新的RenderLayer树,通常各个RenderLayer的内容都绘制在同一块后端储存上,操作系统会将这些储存读取并且渲染在屏幕上。而同时浏览器根据需要进行Javascript的执行等。

简要的叙述了一下从URL输入到页面载入完成发生的事情,基本上都是计算机网络中的,最后的Webkit渲染涉及的不是太多,只是大概看过一本书,没有深入的研究过,也就提一下。

【考研期间刷一下存在。。。。。。。。。

有任何问题可以通过以下方式联系我:

Comments

Recent Posts

GitHub Repos

  • Status updating...