面试回答:
1.在浏览器地址栏输入域名
2.DNS解析IP
3.在发送http请求前,先进行DNS域名解析,获取访问的IP地址
4.浏览器向服务器发起tcp连接,与浏览器建立tcp三次握手
5.握手成功后,浏览器向服务器发送http请求
6.服务器接收请求,处理并返回响应
7.浏览器接收到服务器HTTP响应内容
8.浏览器进行渲染,解析HTML生成DOM树,解析CSS生成规则树,js引擎解析js
9.渲染完毕,四次挥手,关闭tcp连接
详细说明:
一、DNS域名解析IP地址
1.先从浏览器缓存里找IP,因为浏览器会缓存DNS记录一段时间
2.如没找到,再从操作系统查找
3.如没找到,再从路由器缓存查找
4.如没好到,再从ISP DNS缓存查找
5.如果都没找到,浏览器域名服务器向根域>COM顶级域>二级域
二、TCP三次握手,(根据ip建立TCP连接)
第一次握手:客户端给服务端发一个 SYN 报文,并指明客户端的初始化序列号 ISN©。此时客户端处于 SYN_Send状态。
第二次握手:服务器收到客户端的 SYN 报文之后,会以自己的 SYN 报文作为应答,并且也是指定了自己的初始化序列号 ISN(s),同时会把客户端的 ISN + 1 作为 ACK 的值,表示自己已经收到了客户端的 SYN,此时服务器处于 SYN_REVD的状态
第三次握手:客户端收到 SYN 报文之后,会发送一个 ACK 报文,当然,也是一样把服务器的 ISN + 1 作为 ACK 的值,表示已经收到了服务端的 SYN 报文,此时客户端处于 establised状态
服务器收到 ACK 报文之后,也处于 establised 状态,此时,双方以建立起了链接
三、HTTP请求发送给服务器
请求行包括:请求方法,URL,协议版本;例如:GET + 空格 + /xxxxx/login.html + 空格 + HTTP/1.1
请求头字段:
Cookie:客户机通过这个头可以向服务器带数据,这是最重要的请求头信息之一。
User-Agent:User-Agent头域的内容包含发出请求的用户信息。
Accept: 浏览器可接受的MIME类型。
Accept-Charset:浏览器可接受的字符集。
Accept-Encoding:浏览器能够进行解码的数据编码方式
Accept-Language:浏览器所希望的语言种类
Authorization:授权信息,通常出现在对服务器发送的WWW-Authenticate头的应答中。
Content-Length:表示请求消息正文的长度。
Host:客户机通过这个头告诉服务器,想访问的主机名。Host头域指定请求资源的Intenet主机和端口号,必须表示请求url的原始服务器或网关的位置。HTTP/1.1请求必须包含主机头域,否则系统会以400状态码返回。
四、服务器处理请求,浏览器接受HTTP响应
响应行由协议版本、状态码及其描述组成;如 :HTTP/1.1 200 OK
其中协议版本HTTP/1.1或者HTTP/1.0,200就是它的状态码,OK则为它的描述。
常见的状态码如下:
1xx:表示服务器已接收了客户端请求,客户端可继续发送请求;
2xx:表示服务器已成功接收到请求并进行处理;
3xx:表示服务器要求客户端重定向;
4xx:表示客户端的请求有非法内容;
5xx:表示服务器未能正常处理客户端的请求而出现意外错误,服务器差错;
状态码描述文本有如下取值:
200 OK:表示客户端请求成功;
400 Bad Request:表示客户端请求有语法错误,不能被服务器所理解;
401 Unauthonzed:表示请求未经授权,该状态代码必须与 WWW-Authenticate 报头域一起使用;
403 Forbidden:表示服务器收到请求,但是拒绝提供服务,通常会在响应正文中给出不提供服务的原因;
404 Not Found:请求的资源不存在,例如,输入了错误的URL;
500 Internal Server Error:表示服务器发生不可预期的错误,导致无法完成客户端的请求;
503 Service Unavailable:表示服务器当前不能够处理客户端的请求,在一段时间之后,服务器可能会恢复正常;
五、页面渲染,构建DOM树
1、服务器通过后台语言程序处理,找到数据返回给浏览器
2、HTML字符串被浏览器接受后被一句句读取解析,解析到link标签后重新发送请求获取css
3、解析到sript标签后发送请求获取js,并执行代码,浏览器会进行渲染
4、浏览器根据HTML和CSS计算得到渲染树,绘制到屏幕上,js会被执行
5、将解析后DOM树和CSS规则树关联起来构建渲染树,计算布局,绘制页面
六、TCP四次挥手(断开连接)
第一次挥手:客户端发送一个 FIN 报文,报文中会指定一个序列号。此时客户端处于FIN_WAIT1状态。
第二次挥手:服务端收到 FIN 之后,会发送 ACK 报文,且把客户端的序列号值 + 1 作为 ACK 报文的序列号值,表明已经收到客户端的报文了,此时服务端处于 CLOSE_WAIT状态。
第三次挥手:如果服务端也想断开连接了,和客户端的第一次挥手一样,发给 FIN 报文,且指定一个序列号。此时服务端处于 LAST_ACK 的状态。
第四次挥手:客户端收到 FIN 之后,一样发送一个 ACK 报文作为应答,且把服务端的序列号值 + 1 作为自己 ACK 报文的序列号值,此时客户端处于 TIME_WAIT 状态。需要过一阵子以确保服务端收到自己的 ACK 报文之后才会进入 CLOSED 状态。
服务端收到 ACK 报文之后,就处于关闭连接了,处于 CLOSED 状态