这几天看面经觉得这道题十分经典,下文中总结了过程,附了很多之前的文章,介绍细节。
当你在浏览器中输入一个网址,浏览器的处理过程如下:
浏览器查找该域名的 IP 地址
TCP建立连接
浏览器根据解析得到的IP地址向web服务器发送一个 HTTP 请求
服务器给浏览器进行一个301永久重定向响应
浏览器根据重定向地址再次进行HTTP请求。
服务器收到请求并进行处理
服务器返回一个响应
浏览器对该响应进行解码,渲染显示
页面显示完成后,浏览器发送异步请求
浏览器关闭TCP连接
详细分析:
1. 浏览器查找该域名的 IP 地址
也就是DNS域名解析,这个过程分为:
(1)浏览器缓存首先是查找浏览器缓存,浏览器会缓存DNS记录一段时间,不同浏览器保存的时常不等(2分钟到30分钟不等)。
(2)系统缓存。如果在浏览器缓存里没有找到需要的记录,浏览器会做一个系统调用来查找这个网址的对应DNS信息。
(3)路由器缓存。如果在系统缓存里没有找到找到对应的IP,请求会发向路由器,它一般会有自己的DNS缓存。
(4)ISP DNS服务器。如果在路由器缓存里还是没有对应的IP,请求会被发送到ISP。
(5)根域名服务器。如果还是没有,请求将发向根域名服务器进行搜索。
因为全球所有的DNS服务器组成了DNS域名解析系统,在这个系统中,包含了全球所有的主机和IP地址的映射。这是一个递归查找的过程,如果没有找到证明此域名不存在。
关于DNS具体请看博文(这里写链接内容)
2.TCP建立连接
关于TCP三次握手,及常见面试问题。请看博文这里写链接内容
3. 浏览器根据解析得到的IP地址向web服务器发送一个 HTTP 请求
过程简介:
通过DNS获取到IP后,目标IP和本机IP分别与子网掩码相与的结果相同,那么它们在一个子网,就通过ARP协议可以查到目标主机的MAC地址,否则的话,需要通过网关转发,也就是目标MAC是网关的MAC。
关于ARP的详细过程请看博文(这里写链接内容)
生成一个HTTP数据包,需要依次打上TCP、IP、以太网协议的头部。
(1)对于HTTP协议,服务器端的默认端口号是80,本机浏览器的话生成一个1024到65535之间的端口号。
关于HTTP协议请看博文(这里写链接内容)
(2)其中TCP头部主要信息是本机端口和目标端口号等信息,用于标识同一个主机的不同进程;
关于TCP协议请看博文(这里写链接内容)
(3)IP头部主要包含本地IP和目标IP等信息。
关于TCP协议请看博文(这里写链接内容)
(4)以太网协议头部主要是双方的MAC地址,目标MAC可以由第一点ARP得到;
(5)以太网数据包的数据部分,最大长度为1500字节,所以如果IP包太大的话还要拆包。比如IP包5000字节,要分为4包。
关于帧格式,MTU等请看博文(这里写链接内容)
4. 服务器给浏览器进行一个301永久重定向响应
例如:
我们要访问的是“http://baidu.com/”,服务器会给浏览器响应一个301永久重定向响应,这样浏览器就会访问“http://www.facebook.com/”而非“http://facebook.com/”。
5. 浏览器根据重定向地址再次进行HTTP请求。
同第三步
6. 服务器收到请求并进行处理
7. 服务器返回一个响应
过程:
服务器返回一个 HTTP 响应,如果返回状态码304,浏览器可以直接使用之前缓存的资源。对于内容响应,浏览器需要进行响应解码,渲染显示。
8. 浏览器对该响应进行解码,渲染显示
过程:
在浏览器没有完整接受全部HTML文档时,它就已经开始显示这个页面了,如果是个静态的页面,拿到此就基本结束了。
如果是是动态的,那么在浏览器显示HTML时,会获取嵌入在HTML中的对象,浏览器会发送获取请求来重新获得这些文件。这些请求都要经历一个和HTML读取类似的过程。
对于静态的页面内容,浏览器通常会进行缓存,而对于动态的内容,浏览器通常不会进行缓存。
9. 页面显示完成后,浏览器发送异步请求
页面显示完成后客户端仍与服务器端保持着联系。
它会持续与服务器保持联系来及时更新一些页面信息。在浏览器中执行的 JavaScript代码会给服务器发送异步请求。这个异步请求发送给特定的地址,它是一个按照程式构造的获取或发送请求。
10. 浏览器关闭TCP连接
关于TCP四次挥手,及常见面试问题。