问题:请谈谈从浏览器输入URL到拿到网页的整个过程
- 浏览器做了哪些事?
- 内核协议栈做了哪些事?
- web服务器做了哪些事?
- CDN加速网络服务。
浏览器
- 当你在搜索栏输入https://www.baidu.com/ ,浏览器进行URL解析。
看到https,就知道要访问的是web服务器,www.baidu.com是web服务器的名字。根据上面的解析结果生成HTTP请求信息。 - 浏览器生成了HTTP请求之后(如果业务有加密需要的话,可以使用HTTPS),需要操作系统把数据发出去,内核协议栈用的是IP,并不是域名,所以要进行域名解析。web浏览器中的gethostbyname,就可以获得IP地址。
- 获得目标IP地址,浏览器调用socket,委托内核帮忙发送数据。
- 发送请求之后,会得到服务器的响应信息,解析报文,对于HTML文件,调用排版引擎、JS引擎等来处理,然后浏览器展示。(近期访问过的网页,很可能缓存在本地,这样再次访问,就不需要去服务器拿数据,提高响应速度)
PS:gethostbyname函数内部就是生成DNS查询消息,发送UDP查询到DNS服务器,得到DNS服务器的响应,从响应消息中取出IP。国内的三大运营商的通用DNS:144.144.144.144;还可以使用一种更加精准的地址簿查找协议HTTPDNS
PS:DNS系统是三层树状、分布式服务。目前全球有13台根域名服务器,又有几百台镜像,保证一定能被访问到。在查询域名www.baidu.com对应的IP时,首先访问根域名服务器,它告诉我们com服务器的地址;访问com域名服务器,它告诉我们baidu.com的地址;最后访问baidu.com域名服务器,得到www.baidu.com的地址。
加速域名解析的一些手段:
- 在公司内部搭建DNS服务器,缓存域名对应的IP
- 在操作系统的hosts文件中,记录域名对应的IP地址
内核协议栈
HTTP协议底层用的是TCP协议(面向连接的,TCP会保证这个包能够到达目的地。如果不能到达,就会重新发送,直至到达),所以要经过三次握手进行连接,传送数据,最后四次挥手断开连接。内核协议栈主要是将应用层HTTP请求按照TCP/IP协议栈的要求,经过层层封装成帧,然后将报文的类似0101001串转换成电信号发送出去。这里要注意MAC头部的目标机器MAC,是下一跳的MAC,如果当前机器没有缓存,就需要ARP广播,先得到去往目标机器的下一跳机器的MAC。这样才能逐跳转发。还有局域网的IP地址也不能在公网上使用,所以在出网关的时候,IP地址通过NAT转换成公网地址。网关往往是一个路由器,到某个IP地址应该怎么走叫做路由表。常见的路由协议有OSPF和BGP。
web服务器相关话题
目标服务器得到客户端的HTTP请求,如果找到相应的资源文件,组成HTTP响应报文,将资源发送回来,如果没有找到,就会给课户端返回404错误。
目标网站的服务器对外表现是一个IP,为了能够抗住高并发,内部往往是一套非常复杂的架构,入口有负载均衡设备,比如四层的LVS和七层的Nginx,后面又许多服务器构成一个集群。
负载均衡服务器先访问内存级的缓存,比如redis,把频繁访问的数据缓存几秒到几分钟,减轻后端服务器的压力。如果缓存没有相应的数据,再把请求转发给应用服务器,应用服务器如果需要数据,再访问后端的数据库服务器,为了提高数据库并发能力,可以做成读写分离,目前主流的数据库都实现了这个功能。
在服务器端如何告诉相关的进程呢?使用往往通过 RPC 调用,即远程过程调用的方式来实现。
CDN加速网络服务
CDN的中文名称是内容分发网络,它主要解决的问题是就近访问的问题。CDN分发源站的内容,也就是把源站的内容缓存在各个节点上。用户上网就不直接访问源站的内容,而是访问距离它最近的一个CDN节点,术语叫做边缘节点,其实就是缓存了源站的内容,就是源站的一个代理服务器,避免远距离访问源站,实现网络加速。
CDN里面缓存的数据,主要是HTML、图片、视频等静态资源。动态资源往往需要源站加载。可以短暂的缓存动态资源,在这段短暂的时间内,动态资源就变成了静态资源,可以被CDN缓存实现加速。
CDN只能缓存最常见的资源。如果访问的资源就在CDN缓存中,也就是命中了,直接返回客户端;如果没有命中,则要去源站取数据,也叫回源。我们应该尽可能提高命中率,降低回源率。
总结
- 浏览器主要发送HTTP请求,接收HTTP响应,然后进行渲染,展示到界面。
- HTTP底层走的是TCP/IP,如果不知道IP,就需要DNS协议解析。
- TCP连接后收发HTTP数据包
- 为了降低服务器压力,加快访问速度,有很缓存,比如客户端缓存,CDN缓存,负载均衡缓存等
来源:IT面试真题讲解
协议的三要素:
- 语法:这一段内容要符合一定的规则和格式。例如括号要成对,结束要使用分号等
- 语义:就是这一段内容要代表某种意义。例如数字减去数字是有意义的,数字减去文本是没有意义的
- 顺序:先干啥后干啥。
下图是OSI七层模型中的每一层所对应的网络协议: