在浏览器中输出 URL 之后,它会执行以下几个流程:
- 执行 DNS 域名解析;
- 封装 HTTP 申请数据包;
- 封装 TCP 申请数据包;
- 建设 TCP 连贯(3 次握手);
- 参数从客户端传递到服务器端;
- 服务器端失去客户端参数之后,进行相应的业务解决,再将后果封装成 HTTP 包,返回给客户端;
- 服务器端和客户端的交互实现,断开 TCP 连贯(4 次挥手);
- 浏览器通过本身执行引擎,渲染并展现最终后果给用户。
1.DNS 域名解析
在网络中定位是依附 IP 进行身份定位的,所以 URL 拜访的第一步便是先要失去服务器端的 IP 地址。而失去服务器的 IP 地址须要应用 DNS(Domain Name System,域名零碎)域名解析,DNS 域名解析就是通过 URL 找到与之绝对应的 IP 地址。
PS:为什么不间接拜访 IP 地址来申请服务器?因为 IP 地址很长,不不便记忆,而 URL 地址好记很多,所以会应用 URL 来代替 IP 地址,而 URL 就像 IP 地址的别名一样,用它能够定位到相应的 IP 地址。
DNS 域名解析的大抵流程如下:
- 先检 查浏览器中的 DNS 缓存,如果浏览器中有对应的记录会间接应用,并实现解析;
- 如果浏览器没有缓存,那就去 查问操作系统的缓存,如果查问到记录就能够间接返回 IP 地址,实现解析;
- 如果操作系统没有 DNS 缓存,就会去 查看本地 host 文件,Windows 操作系统下,host 文件个别位于 “C:\Windows\System32\drivers\etc\hosts”,如果 host 文件有记录则间接应用;
- 如果本地 host 文件没有相应的记录,会 申请本地 DNS 服务器,本地 DNS 服务器个别是由本地网络服务商如挪动、电信提供。通常状况下可通过 DHCP 主动调配,当然你也能够本人手动配置。目前用的比拟多的是谷歌提供的专用 DNS 是 8.8.8.8 和国内的专用 DNS 是 114.114.114.114。
- 如果本地 DNS 服务器没有相应的记录,就会 去根域名服务器查问 了,目前寰球一共有 13 组根域名服务器(这里并不是指 13 台服务器,是指 13 个 ip 地址,按字母 a-m 编号),为了能更高效实现寰球所有域名的解析申请,根域名服务器自身并不会间接去解析域名,而是会把不同的解析申请调配给上面的其余服务器去实现,上面是 DNS 域名零碎的树状结构图:
2. 封装 HTTP 申请数据包
一个 HTTP 申请对象蕴含 4 局部内容:
- 申请行
- 申请报头
- 空行
- 申请注释
它的根本格局如下:
在失去了服务器 IP 之后,紧接着会将本地的申请封装成一个 HTTP 数据包,如上图所示。
3. 封装 TCP 申请数据包
HTTP 底层是依赖 TCP/IP 协定实现的,所以在底层数据传输时,会将 HTTP 申请包进一步封装成 TCP 数据包。
4. 建设 TCP 连贯(3 次握手)
HTTP 通信的根底是 TCP 连贯,TCP 连贯须要 3 次握手,3 次握手就是为了验证客户端的发送能力和接管能力,以及服务器端的产生能力和接管能力,就像打电话一样,通常的通话是这样结尾的:
- _我_:喂,能听到吗?
- _对方_:能听到,你能听到吗?(证实了对方的接管能力和我的发送能力)
- _我_:我也能听到,咱们聊闲事吧。(证实了对方的发送能力和我的接管能力)
通过以上 3 次握手就能够证实客户端的发送能力和接管能力,以及服务器端的产生能力和接管能力,这样就能够正式开始通信了。
5. 服务器端获取到 HTTP 申请参数
数据在通过 TCP 传到到服务器程序之后,又会将 TCP 的数据包转换成 HTTP 数据包(这一切都是 TCP/IP 协定的功绩),这样服务器端就能够失去客户端发送的申请数据了。
6. 服务器端执行业务解决,并返回数据
服务器端拿到了客户端的申请参数之后,会进行相应的业务解决,解决实现之后,再将解决的后果返回给客户端。返回的流程和发送的流程相似,先将后果封装成 HTTP 数据包,HTTP 数据包可分为以下 4 局部:
- 状态行
- 响应报头
- 空行
- 响应注释
它的根本格局如下:
状态行用于形容服务器的返回状态,它由 3 局部组成:
- HTTP 版本号,如 HTTP/1.1;
- 状态码,如 200;
- 状态形容信息,如 OK;
常见的状态码有以下几个:
- 200:返回胜利;
- 301:永恒重定向;
- 302:长期重定向;
- 404:未找到页面;
- 500:服务器程序出错。
响应注释就是返回给客户端的所有数据。
7. 断开 TCP 连贯(4 次挥手)
在通过一次申请和一次响应之后,客户端和服务器的“交换”就完结了,此时就能够执行 TCP 连贯断开的流程了,它须要 4 次挥手:
- _客户端_:咱们离别吧;
- _服务器端_:好的,让我筹备一下。
- _服务器端_:我筹备好了,离别吧。
- _客户端_:好的。
通过了以上流程之后,TCP 的连贯就断开了。
8. 浏览器渲染并展现后果
通过 TCP 交互之后,客户端也失去了服务器端返回的数据,而后应用浏览器本身的执行引擎,将最终的后果展现给用户,整个执行流程就完结了。
参考 & 鸣谢
zhuanlan.zhihu.com/p/58108010
是非审之于己,毁誉听之于人,得失安之于数。
公众号:Java 面试真题解析
面试合集:https://gitee.com/mydb/interview