BAT面试题:请谈谈从浏览器输入url到拿到网页的整个过程


我们应该从四个方面来回答这个问题:

  • 浏览器做了哪些事情
  • 内核协议栈做了哪些事情
  • web服务器相关
  • CDN加速网络服务

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.0
Host: www.baidu.com
Accept: */*

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

HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
Connection: keep-alive
Content-Length: 2443
Content-Type: text/html

浏览器生成了HTTP请求后,需要操作系统来吧数据发送出去,内核协议栈用得上IP,并不是域名,所以要进行DNS(域名解析)。web浏览器中其实就是gethostbyname(“www.baidu.com”),就可以获得IP地址。
gethostbyname函数内部实现就是生成DNS查询消息,发送UDP查询消息到DNS服务器,得到DNS服务器的响应,从响应消息中取出IP。

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

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

  1. 访问根域名服务器,他会告诉我们com域名服务器地址。
  2. 访问com域名服务器,他告诉我们baidu.com域名服务器的地址。
  3. 访问baidu.com域名服务器,得到www.baidu.com的地址。
    得到目标机器IP地址之后,浏览器就可以用socket,委托内核帮我们发送数据了。浏览器拿到服务器的响应数据,解析报文,对于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就出现了。

扫描二维码关注公众号,回复: 11357174 查看本文章

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缓存,负载均衡器缓存等。

猜你喜欢

转载自blog.csdn.net/qq_43452252/article/details/106844879