1、步骤
(1)
TCP 连接
(3)发送 HTTP 请求
(4)服务器处理请求并返回 HTTP 报文
(5)浏览器解析渲染页面
(6)
2.详细内容
(1)DNS解析
-
-
本地 DNS 服务器会首先查询它的缓存记录,如果有,则直接返回结果,若没有,本地 DNS 服务器还要向 DNS 根服务器进行查询;
-
DNS 根服务器没有记录具体域名和 IP 地址的对应关系,而是告诉本地 DNS 服务器,可到域服务器上继续查询,并给出域服务器地址;
-
本地服务器继续向域服务器发出请求,返回域名的解析服务器地址;
-
本地 DNS 向域名解析服务器发出请求,收到域名与 IP 地址对应关系;
-
(2)TCP连接
主要是三次握手:
1. 建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;
2. 服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
3. 客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。
(3)发送HTTP请求
发送HTTP请求的过程就是构建HTTP请求报文并通过TCP协议中发送到服务器指定端口(HTTP协议80/8080, HTTPS协议443)。HTTP请求报文是由三部分组成: 请求行, 请求头和请求体
1.请求行:Method Request-URL HTTP-Version CRLF ;常用的请求方法有: GET, POST, PUT, DELETE, OPTIONS, HEAD。
2.请求头:常见的请求头有: Accept, Accept-Charset, Accept-Encoding, Accept-Language, Content-Type, Authorization, Cookie, User-Agent等。
3.请求体:当使用POST, PUT等方法时,通常需要客户端向服务器传递数据。这些数据就储存在请求正文中。在请求包头中有一些与请求正文相关的信息,例如: 现在的Web应用通常采用Rest架构,请求的数据格式一般为json。这时就需要设置Content-Type: application/json。
(4)服务器处理请求并返回HTTP报文
服务器在收到浏览器发送的HTTP请求之后,会将收到的HTTP报文封装成HTTP的Request对象,并通过不同的Web服务器进行处理,处理完的结果以HTTP的Response对象返回,HTTP响应报文也是由三部分组成: 状态码, 响应报头和响应报文。
-
-
100 继续
-
101 切换协议
-
-
2XX 成功状态码
-
200 OK 成功处理了请求
-
204 No Content 请求处理成功,但没有资源可返回
-
206 Partial Content 请求资源的某一部分
-
-
3XX 重定向状态码
-
301 永久性重定向,表示请求的资源已被分配了新的 URI
-
302 临时性重定向,资源的 URL 已临时定位到其他位置
-
303 告诉客户端应该用另一个 URL 获取资源
-
304 表示客户端发送附带条件的请求时,服务器端允许请求访问资源,但未满足条件的情况
-
-
4XX 客户端错误状态码
-
400 表示请求报文中存在语法错误
-
401 未授权
-
403 服务器拒绝了请求
-
404 服务器无法找到所请求的 URL
-
-
5XX 服务器错误状态码
-
500 内部服务器错误
-
502 错误网关
-
503 服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。
-
-
(5)浏览器解析渲染页面
浏览器是一个边解析边渲染的过程。首先浏览器解析HTML文件构建DOM树,然后解析CSS文件构建渲染树,等到渲染树构建完成后,浏览器开始布局渲染树并将其绘制到屏幕上。
reflow(回流):也称作Layout,中文叫回流,一般意味着元素的内容、结构、位置或尺寸发生了变化,需要重新计算样式和渲染树,这个过程称为Reflow
repain(重绘):当盒模型的位置,大小以及其他属性,如颜色,字体,等确定下来之后,浏览器便开始绘制内容,这个过程称为repain。
(6)连接结束
主要是四次挥手:
1.客户端发出连接释放报文段(FIN=1,序号seq=u),并停止再发送数据,主动关闭TCP连接,进入FIN_WAIT1(终止等待1)状态,等待服务端的确认。
2.服务端收到连接释放报文段后即发出确认报文段(ACK=1,确认号ack=u+1,序号seq=v),服务端进入CLOSE_WAIT(关闭等待)状态,此时的TCP处于半关闭状态,客户端到服务端的连接释放。客户端收到服务端的确认后,进入FIN_WAIT2(终止等待2)状态,等待服务端发出的连接释放报文段。
3.服务端没有要向客户端发出的数据,服务端发出连接释放报文段(FIN=1,ACK=1,序号seq=w,确认号ack=u+1),服务端进入LAST_ACK(最后确认)状态,等待客户端确认。
4.客户端收到服务端的连接释放报文段后,对此发出确认报文段(ACK=1,seq=u+1,ack=w+1),客户端进入TIME_WAIT(时间等待)状态。此时TCP未释放掉,需要经过时间等待计时器设置的时间2MSL后,客户端才进入CLOSED状态。