吊打名企面试官 | 当我们打开网页时,浏览器究竟做了什么?

系列文章持续更新中

吊打名企面试官 | 当我们打开一个网页时,究竟发生了什么?

吊打名企面试官 | 如何理解java的反射机制?


吊打面试官 | 当我们打开网页时,浏览器究竟做了什么? 

这个题目主要考察面试者对整个计算机网络的理解。涉及的知识面非常广泛,协议、软件、安全、硬件、高并发、高可用等等。

回答要点

  • 浏览器做了哪些事情。

  • 内核协议栈做了哪些事情。

  • web服务器相关话题。

  • CDN加速网络服务。

下面我们就上面4个点分别说明。

1.浏览器做了哪些事情

当输入https://www.baidu.com/index.html,浏览器进行URL解析,首先会看https,就知道我们要访问的是web服务器,www.baidu.com是web服务器名字,后面index.html就是数据源路径和文件名。

根据上面的解析结果生成HTTP请求消息。

GET /index.html HTTP/1.1 <!-- 请求行 -->User-Agent: curl/7.29.0Host: www.baidu.comAccept: */*<!-- 空行 -->

发送请求后,会得到服务器的响应消息。

HTTP/1.1 200 OKAccept-Ranges: bytesCache-Control: private, no-cache, no-store, proxy-revalidate, no-transformConnection: keep-aliveContent-Length: 2443Content-Type: text/html<!-- 空行 -->
<html>    <!-- ........省略...... --></html>

浏览器生成了HTTP请求后,需要操作系统来把数据发送出去,内核协议栈用的是IP,并不是域名,所以要进行域名(DNS)解析。web浏览器中其实就是gethostbyname ("www.baidu.com"),就可以获得IP地址。

gethostbyname函数内部实现就是生成DNS查询消息,发送UDP查询消息到DNS服务器,得到DNS服务器的响应,从响应消息中取出IP。这里需要注意,我们要去DNS服务器查询信息,需要知道DNS服务器的IP地址,所以要配置正确。国内移动、电信、联通的通用DNS:114.114.114.114。

DNS系统是三层树状分布式服务。

目前全球有13组根域名服务器,又有几百台镜像,保证一定能被访问得到。有了这个系统,我们查询域名www.baidu.com对应的IP,按照如下顺序:

  1. 访问根域名服务器,它告诉我们com域名服务器地址。

  2. 访问com域名服务器,它告诉我们baidu.com域名服务器的地址。

  3. 访问baidu.com域名服务器,得到www.baidu.com的地址。

我们为了加速域名解析,也可以在自己公司内部搭建DNS服务器,缓存域名对应的IP。其实我们操作系统也会缓存曾经访问过的域名。当然,我们还可以在操作系统的hosts文件中,记录域名对应的IP地址。如果在这些地方能够找到ip地址,就避免了远程访问DNS服务器,加快了DNS解析过程,也减轻了DNS服务器的压力。

得到了目标机器IP地址,浏览器就可以用socket,委托内核帮我们发送数据了,代码如下:

int fd = socket(AF_INET, SOCK_STREAM, 0);connect(fd, 服务器地址);while ( 1 ) {    write(fd, http请求数据);    read(fd,服务器响应的数据)}close(fd);

浏览器拿到服务器的响应数据,解析报文,对于HTML文件,调用排版引擎、js引擎等来处理,然后在浏览器展示。

当然,如果近期访问过的网页,很有可能缓存在本地,这样再次访问,就不需要去服务器拿数据,直接访问本地缓存数据,可以降低服务器的压力,提高响应速度。

2.内核协议栈做了哪些事情

因为HTTP协议底层用的是TCP协议,所以要经过三次握手进行连接,传送数据,最后四次挥手断开连接。

内核协议栈主要是将应用层HTTP请求按照TCP/IP协议栈的要求,经过层层封装后成帧,然后将报文的类似0101001串转换成电信号发送出去。

这里要注意MAC头部的目标机器MAC,是下一跳机器的MAC,如果当前机器没有缓存,就需要ARP广播,先得到去往目标机器的下一跳机器的MAC,这样才能逐跳转发。还有,局域网的IP地址也不能在公网上使用,所以在出网关的时候,IP地址通过NAT转换成公网地址

3.企业web服务器相关话题招聘

目标服务器得到了客户端的HTTP请求,如果找到相应的资源文件,组成HTTP响应报文,将资源发送回来,如果没有找到,就会给客户端返回404错误。

目标网站的服务器对外表现是一个IP,为了能够扛住高并发,内部往往是一套非常复杂的架构,入口有负载均衡设备,比如四层的LVS和七层的Nginx,后面有许多服务器构成一个集群。

负载均衡服务器先访问内存级的缓存,比如redis,把频繁访问的数据缓存几秒到几分钟,减轻后端服务器的压力。如果缓存没有相应的数据,再把请求转发给应用服务器,应用服务器如果需要数据,再访问后端的数据库服务器。为了提高数据库并发能力可以做成读写分离,目前主流的数据库都实现了这个功能。

4.CDN加速网络服务

 

 

互联网虽然是一个大网,其实它由好多个小网组成,各个小网又相互连通,比如电信、移动、联通,各自是一个网络,它们之间需要联通。

小的网络内部很流畅,网络之间只有很少的联通点。如果网站在中国移动,笔记本在中国联通,那么就必须跨网传输。大量的用户去抢这个联通点,就会带来网络压力,产生比较大的延迟。另外,每过一个网络节点,都需要停顿一下,二层、三层的解析转发,也会带来延迟。为了解决这种上网速度慢的问题,CDN就出现了。

CDN中文名称是内容分发网络,它主要解决的问题是就近访问的问题。CDN分发源站的内容,也就是把源站的内容缓存在各个节点上。用户上网就不直接访问源站的内容,而是访问距离它最近的一个CDN节点,术语叫边缘节点,其实就是缓存了源站的内容,就是源站的一个代理服务器,避免远距离访问源站,实现网络加速。

CDN里面缓存的数据,主要是html、图片、视频等静态资源。动态资源往往都需要源站实时生成,缓存也没有太大意义,不过,我们也可以短暂的缓存动态资源,在这段短暂的时间内,动态资源也就变成了静态资源,可以被CDN缓存以实现加速。

网络上的资源无穷无尽,CDN不可能全部缓存起来,只能缓存最常见的资源。如果所访问的资源就在CDN缓存中,也就是命中了,直接返回给客户端。如果没有命中,则要去源站取数据,也叫回源。

我们应该尽可能的提高命中率,降低回源率。这就需要在存储系统上做更多的事情,比如硬件上,要更大的内存,更大和快速的磁盘,比如SSD,万兆以太网,更高速的CPU等。软件上,可以用redis等尽可能高效利用存储,存下更多的内容。

5.总结

1.浏览器主要发送HTTP请求,接收HTTP响应,然后然后进行渲染,展示到界面。

2.HTTP底层走的是TCP/IP,如果不知道IP,就需要DNS协议解析。

3.TCP连接后收发HTTP数据包。

4.为了降低服务器压力,加快访问速度,有很多缓存,比如,客户端缓存,CDN缓存,负载均衡器缓存等。

由于网络是非常复杂的,本文对所涉及的知识点,只是浅尝辄止,旨在让读者对浏览器输入URL后的过程有一个总体认识。

猜你喜欢

转载自blog.csdn.net/bookanddream/article/details/106853405
今日推荐