麻烦你说下输入百度网址过后整个过程是什么样子的?

Hello 大家好,我是阿粉。虽然说金三银四已经过去,但是金九银十快要来了,作为一个居安思危的阿粉,无时无刻不在准备着学习和面试,今天这个题目相信很多面试过的小伙伴都被问到过,问题其实不难,只是如果有的小伙伴没有遇到过,可能不会思考到具体的细节,或者说很多东西可能都知道但是并不知道面试官问这个问题的点在哪,所以会有所欠考虑抓不到重点。下面我们就依次来看一下整个过程到底发生了什么。

我们先想一个整个过程中会涉及到哪些流程:

  1. 域名解析
  2. 建立连接
  3. 发送请求
  4. 响应数据
  5. 渲染页面

首先当我们在浏览器里面输入https://www.baidu.com 过后我们想要的是去找百度的服务器请求数据,那么去哪找百度的服务器地址呢?请求服务器必须要知道服务器的 ip 地址,光有域名地址是不行的。这个时候我们想到的就是需要根据域名去找到服务器的 ip 地址,所以会有个 DNS 解析的过程。整个 DNS 解析的过程也很复杂,涉及到 DNS 的一层层向上寻找过程,以及整个复杂的 DNS 负载和解析。这里在面试的过程中如果说对 DNS 了解比较深的话,可以扩展一下,如果说不了解的话简单带过就好,不要给自己挖坑。

这里我们假设经过 DNS 解析和各种负载均衡后得到的某台百度服务器的 ip 地址为 1.2.3.4,那么当得到 ip 地址后,根据 web 服务的标准,我们也知道默认端口为 80,如果不是默认端口的话,地址上面会携带,所以这个时候浏览器就可以与服务器建立连接了,建立连接的过程相信大家都知道,是进行 TCP 的三次握手。

关于 TCP 的建立连接的过程,公众号前面有文章介绍,感兴趣的小伙伴可以去搜索看一下。这里不得不说,TCP 的三次握手和四次挥手也是面试过程中很重要的一个知识点,阿粉在整个职业生涯中不管是参加面试还是面试别人,经常都会遇到这个问题,也不是说这个问题有多考验人,主要是想看下基本功扎不扎实。

当连接建立完成过后客户端和服务端就会进行交互了,现在的互联网服务都是基于 HTTP 的,所以这个时候客户端会发起 HTTP 请求,每个请求会携带相关的请求参数,确保服务端可以根据相关参数返回正确的数据。请求经过网络会到达我们的应用程序,不管中间有没有 Nginx 或者其他负载,最终都会到达我们的应用程序的入口。

这个时候如果应用是基于 SpringMVC 的,那也可以说下 SpringMVC 的前端控制器,处理器映射器,处理器适配器,处理器Handler以及视图解析器的流程,还是那句话,不熟悉的不要说,带过就好。

当服务器根据客户端的请求信息获取到相应数据后会返回响应报文,携带状态码和相关数据给到前端,当前端拿到数据过后,就会进行整个页面的渲染。整个前端页面的渲染说一下就会,作为后端程序员,面试官应该不会问渲染的细节,如果被问到了那就很尴尬了。

其实这个题目可以有很多扩展的问题,比如有上面提到的 DNS 解析的过程是什么样子的和 TCP 连接的三次握手和四次挥手,还可以扩展一下 HTTP 协议和 HTTPS 协议的区别以及网络的七层结构是怎么样的。然后提到 Nginx 和负载均衡也还是可以问一下的,顺便问下自己的项目是如果做负载均衡的,在高并发的场景下是如何控制流量分配的以及扩容和容灾的。

总得来说作为一个程序员要学的东西还是很多的,而且在面试的过程中我们要扬长避短,尽量往自己熟悉的地方说,对于自己不熟悉的地方尽量不要提到,如果实在被问到知道就是知道不知道就是不知道,诚实的跟面试官坦白,千万不要想蒙混过关,要知道面试官也不傻的。

Java Geek Tech wechat
欢迎订阅 Java 极客技术,这里分享关于 Java 的一切。