HTTP常见面试题
一.从浏览器地址输入到显示页面的步骤:
1. 在浏览器地址栏输入URL
2. 浏览器查看缓存,如果请求资源在缓存中并且新鲜,跳转到转码步骤
a)果资源未缓存,发起新请求
b)如果已缓存,检验是否足够新鲜,足够新鲜直接提供给客户端,否则与服务器进行验证。
c)检验新鲜通常有两个HTTP头进行控制Expires和Cache-Control:
i.HTTP1.0提供Expires,值为一个绝对时间表示缓存新鲜日期
ii.HTTP1.1增加了Cache-Control: max-age=,值为以秒为单位的最大新鲜时间
3. 浏览器解析URL获取协议,主机,端口,path
4. 浏览器组装一个HTTP(GET)请求报文
5. 浏览器获取主机ip地址,过程如下:
a)浏览器缓存
b)本机缓存
c)hosts文件
d)路由器缓存
e)ISP DNS缓存
f)DNS递归查询(可能存在负载均衡导致每次IP不一样)
6. 打开一个socket与目标IP地址,端口建立TCP链接,三次握手如下:
a)客户端发送一个TCP的SYN=1,Seq=X的包到服务器端口
b)服务器发回SYN=1, ACK=X+1, Seq=Y的响应包
c)客户端发送ACK=Y+1, Seq=Z
7. TCP链接建立后发送HTTP请求
8. 服务器接受请求并解析,将请求转发到服务程序,如虚拟主机使用HTTP Host头部判断请求的服务程序
9. 服务器检查HTTP请求头是否包含缓存验证信息如果验证缓存新鲜,返回304等对应状态码
10. 处理程序读取完整请求并准备HTTP响应,可能需要查询数据库等操作
11. 服务器将响应报文通过TCP连接发送回浏览器
12. 浏览器接收HTTP响应,然后根据情况选择关闭TCP连接或者保留重用,关闭TCP连接的四次握手如下:
a)主动方发送Fin=1, Ack=Z, Seq= X报文
b)被动方发送ACK=X+1, Seq=Z报文
c)被动方发送Fin=1, ACK=X, Seq=Y报文
d)主动方发送ACK=Y, Seq=X报文
13. 浏览器检查响应状态吗:是否为1XX,3XX, 4XX, 5XX,这些情况处理与2XX不同
14. 如果资源可缓存,进行缓存
15. 对响应进行解码(例如gzip压缩)
16. 根据资源类型决定如何处理(假设资源为HTML文档)
17. 解析HTML文档,构件DOM树,下载资源,构造CSSOM树,执行js脚本,这些操作没有严格的先后顺序,以下分别解释
18. 构建DOM树:
a)Tokenizing:根据HTML规范将字符流解析为标记
b)Lexing:词法分析将标记转换为对象并定义属性和规则
c)DOM construction:根据HTML标记关系将对象组成DOM树
19. 解析过程中遇到图片、样式表、js文件,启动下载
20. 构建CSSOM树:
a)Tokenizing:字符流转换为标记流
b)Node:根据标记创建节点
c)CSSOM:节点创建CSSOM树
21. 根据DOM树和CSSOM树构建渲染树:
a)从DOM树的根节点遍历所有可见节点,不可见节点包括:1)script,meta这样本身不可见的标签。 2)css隐藏的节点,如display: none
b)对每一个可见节点,找到恰当的CSSOM规则并应用
c)发布可视节点的内容和计算样式
22. js解析如下:
a)浏览器创建Document对象并解析HTML,将解析到的元素和文本节点添加到文档中,此时document.readystate为loading
b)HTML解析器遇到没有async和defer的script时,将他们添加到文档中,然后执行行内或外部脚本。这些脚本会同步执行,并且在脚本下载和执行时解析器会暂停。这样就可以用<document class="write"> </document>()把文本插入到输入流中。同步脚本经常简单定义函数和注册事件处理程序,他们可以遍历和操作script和他们之前的文档内容
c)当解析器遇到设置了async属性的script时,开始下载脚本并继续解析文档。脚本会在它下载完成后尽快执行,但是解析器不会停下来等它下载。异步脚本禁止使用<document class="write"> </document>(),它们可以访问自己script和之前的文档元素
d)当文档完成解析,document.readState变成interactive
e)所有defer脚本会按照在文档出现的顺序执行,延迟脚本能访问完整文档树,禁止使用<document class="write"> </document>()
f)浏览器在Document对象上触发DOMContentLoaded事件
g)此时文档完全解析完成,浏览器可能还在等待如图片等内容加载,等这些内容完成载入并且所有异步脚本完成载入和执行,document.readState变为complete,window触发load事件
23. 显示页面(HTML解析过程中会逐步显示页面)
二、常用状态码
200:OK 请求没问题,实体的主体包含请求的所有内容
202: Accepted 请求已被接受
301:Moved Permanently 在请求的URL已被移除时使用。响应的location首部中应包含资源现在所处的URL
302:Found 与301类似;但是,客户端应该使用location首部给出的URL来定位资源。将来的请求仍应该使用老的URL
304:Not Modified 客户端可以包含的请求首部,使其请求变成有条件的。如果客户端发起了一个条件GET请求,而最近资源未被修改的话,就可以用这个状态码来说明资源未被修改。带有这个状态码的响应不应该包含实体的主要部分。
403:Forbidden 用于说明请求被服务器拒绝了。如果服务器想说明为什么拒绝请求,可以包含实体的主体部分来对原因进行描述。但这个状态码通常是在服务器不想说明拒绝原因的时候使用的。
404:Not found说明服务器无法找到所请求的URL。通常会包含一个实体,以便客户端应用程序显示给用户看。
500:Internal Server Error 服务器遇到一个妨碍它为请求提供服务的错误时,使用此状态码。
501:Not Implemented 客户端发起的请求超出服务器的能力范围(eg:使用了服务器不支持的请求方法)时,使用这个状态码
502:Bad Gateway 作为代理或网关使用的服务器从请求响应链的下一条链路上收到了一条伪响应(eg:无法连接其父网关)时,使用此状态码。
503:Service Unavailable 用来说明服务器现在无法为请求提供服务,但将来可以。如果服务器知道什么时候资源会变为可用,可以在响应中包含一个Retry-After首部。
504:Gateway Timeout与状态码408类似,只是这里的响应来自一个网关或代理,它们在等待另一服务器对其请求进行响应时超时了
三、get和post区别:
get
请求可以被缓存
请求保留在浏览器历史记录中
请求可被收藏为书签
请求不应在处理敏感数据时使用
请求长度有限制
请求只应当用于取回数据
post
请求不会被缓存
请求不会保留在浏览器历史记录中
请求不能被收藏做书签
请求对数据长度没有要求
比较 | GET | POST |
---|---|---|
后退按钮/刷新 | 无害 | 数据会被重新提交(浏览器应该告知用户数据会被重新提交)。 |
书签 | 可收藏为书签 | 不可收藏为书签 |
缓存 | 能被缓存 | 不能缓存 |
编码类型 | application/x-www-form-urlencoded | application/x-www-form-urlencoded 或 multipart/form-data。为二进制数据使用多重编码。 |
历史 | 参数保留在浏览器历史中。 | 参数不会保存在浏览器历史中。 |
对数据长度的限制 | 是的。当发送数据时,GET 方法向 URL 添加数据;URL 的长度是受限制的(URL 的最大长度是 2048 个字符)。 | 无限制。 |
对数据类型的限制 | 只允许 ASCII 字符。 | 没有限制。也允许二进制数据。 |
安全性 | 与 POST 相比,GET 的安全性较差,因为所发送的数据是 URL 的一部分。在发送密码或其他敏感信息时绝不要使用 GET | POST 比 GET 更安全,因为参数不会被保存在浏览器历史或 web 服务器日志中。 |
可见性 | 数据在 URL 中对所有人都是可见的。 | 数据不会显示在 URL 中。 |
四、http cookie状态管理
1.客户端把用户ID和密码等登录信息放入报文的实体部分,通常是以POST方法把请求发送给服务器。而这时,会使用HTTPS通信来进行HTML表单画面的显示和用户输入数据的发送。
2.服务器会发放用以识别用户的Session ID,通过验证从客户端发送过来的登录信息进行身份验证,然后把用户的认证状态和Session ID绑定后记录在服务器端。
向客户端返回响应时,会在首部字段Set-Cookie内写入Session ID
Session ID想象成一种用于区分不同用户的等位号。然而,如果被第三方盗走,对方就可以伪装你的身份进行恶意操作。为了防止被盗,Session ID应使用难以推测的字符串,且服务器也需要进行有效的管理,保证其安全。
3.客户端接收到从服务器端发来的Session ID后,会将其作为Cookie保存到本地。下次向服务器发送请求时,浏览器会自动发送Cookie,所以Session ID也会随之发送到服务器。服务器端可以通过验证接收到的Session ID识别用户和其认证状态。
五、https
在HTTP协议中有可能存在信息窃听或身份伪装等安全问题,使用HTTPS通信机制可以有效的房子这些问题。
HTTP缺点:
1.通信使用明文,内容可能被篡改 2.不验证通信方的身份,因此有可能遭遇伪装 3.无法证明报文的完整性,所以有可能已遭篡改。
与SSL(安全套接层)组合使用HTTP被称为HTTPS(超文本传输安全协议)
HTTP+加密+认证+完整性保护 = HTTPS
HTTP = IP -> TCP -> HTTP HTTPS = IP -> TCP -> SSL -> HTTP
在采用SSL后,HTTP就拥有了HTTPS的加密、证书、完整性保护这些功能。
SSL是独立于HTTP的协议,其他运行在应用层的SMTP和Telnet等协议可配合SSL协议使用。
为什么不一直使用HTTPS?
与纯文本通信相比,加密通信会消耗更多的CPU和内存资源。如果每次通信都加密,会消耗相当多的资源。
要进行HTTPS通信,证书是必不可少的。而使用证书必须向证书机构(CA)购买。那些购买证书并不合算的服务以及一些个人网站,可能只会采用HTTP的通信。例如用github pages提供的免费托管的静态站点。