本章博客是介绍web请求会话过程中网络执行的情况,不涉及服务器内部执行流程。话不多说,一起学习吧!
过程概览
- 域名解析 (目的:得到服务器IP地址,定位地址)
- TCP握手 (目的:建立连接状态)
- 发送HTTP请求 (目的:发起请求)
- 响应HTTP请求 (目的:得到资源)
- TCP挥手 (目的:结束连接状态,此过程和Connection:keep-alive有关,原因详情看下文)
- 浏览器解析/渲染资源展现给用户
一、域名解析
域名解析的目的就是为了拿到目的服务器的IP地址,此过程解析顺序如下:浏览器DNS缓存→操作系统DNS缓存→hosts文件映射→DNS服务器解析。此过程不一定全部执行,只要在某个环节找到IP地址就无需继续进行。
- 浏览器检查自身的DNS缓存,如果缓存中有,则拿到IP。以谷歌浏览器为例,可以输入
chrome://net-internals/#dns
来查看缓存,浏览器的DNS缓存有容量上线。 - 操作系统检查自身的DNS缓存在这里插入代码片以拿到IP,Windows可以在DOS命令中输入
ipconfig /displaydns
命令来查看系统DNS缓存。 - hosts文件映射,如果文件中定义了该域名IP映射就可以直接拿到,Windows系统中hosts存在于
C:\Windows\System32\drivers\etc
目录下。 - 如果到了第三不也没有找到IP映射关系,浏览器会向本地的DNS服务器发起一个域名解析的请求以得到IP
二、TCP三次握手
通过wireshark抓包软件可以看到,建立HTTP连接的确是基于TCP三次握手开始
HTTP是建立在TCP/IP协议之上的应用层协议,浏览器拿到域名对应的IP地址后,就会开始向服务器发起连接的请求,TCP连接要经历三次握手(图片来源于百度):
第一次握手:客户端发送syn包(seq=x)到服务器,并进入SYN-SEND状态,等待服务器确认。
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(seq=y),即SYN+ACK包,此时服务器进入SYN-RECV状态。
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
三、发送HTTP请求
建立好客户端与服务器的TCP连接以后,就开始HTTP的请求了,此过程在前一章已经讨论过了,再次不做赘述,此过程目的就是客户端发起HTTP请求,告诉服务器自己想要什么资源。
四、响应HTTP请求
此过程详情在上一章也做了介绍,目的就是得到服务器传回的资源文件。
五、TCP挥手
此过程稍微有点特殊,并不是所有过程都有此步骤,取决于Connection请求头。在上一章介绍过这个请求头,Connection:keep-alive表示持久连接,也就是说如果客户端在发起HTTP请求时,标明了此头信息,则在服务器响应HTTP完成后,不断开连接,以便于下一次继续传输数据,这也是HTTP1.0所没有的功能。但是并不是有了此头信息就会保持长连接,这也取决于此头信息的配置标准,比如超时时间,连接次数
第一次挥手:主动关闭方发送一个FIN,用来关闭主动方到被动关闭方的数据传送,也就是主动关闭方告诉被动关闭方:我已经不会再给你发数据了(当 然,在fin包之前发送出去的数据,如果没有收到对应的ack确认报文,主动关闭方依然会重发这些数据),但此时主动关闭方还可以接受数据。
第二次挥手:被动关闭方收到FIN包后,发送一个ACK给对方,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号)。
第三次挥手:被动关闭方发送一个FIN,用来关闭被动关闭方到主动关闭方的数据传送,也就是告诉主动关闭方,我的数据也发送完了,不会再给你发数据了。
第四次挥手:主动关闭方收到FIN后,发送一个ACK给被动关闭方,确认序号为收到序号+1,至此,完成四次挥手,连接断开。
六、浏览器解析/渲染资源
浏览器拿到服务器传回的资源后(例如:HTML文件)就会开始解析,构建DOM模型,解析CSS文件渲染模型,解释JS等等,渲染出页面。