目录
20.HTTP/1.1 相比 HTTP/1.0 提高了什么性能?
1.键入网址到网页显示,期间发生了什么?
1)浏览器收到请求,先检查缓存里是否有该资源,如果有则直接返回;如果没有就进行网络请求。
2)网络请求前,进行DNS解析获取域名对应的IP地址,DNS解析时会按本地浏览器缓存->本地Host文件->路由器缓存->DNS服务器->根DNS服务器的顺序查询IP,直到找到为止。
3)浏览器和服务器建立TCP连接。如果请求是HTTPS,还需要建立TLS连接。连接建立后,浏览器会构建请求信息,发送给服务器。
4)服务器根据请求信息返回响应报文给客户端。
5)浏览器解析响应头,若响应头的状态码为301,302,会重定向到新地址;若响应数据类型是字节流类型,一般会将请求提交给下载管理器;若是HTML类型,会进行下一步渲染流程。
6)浏览器解析HTML文件,创建DOM树,解析CSS进行样式计算,然后将CSS和DOM合并,构建渲染树;最后布局和绘制渲染树,完成页面展示。
2.HTTP 是什么?
HTTP (超文本传输协议)是一个在计算机世界里专门在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范。
3.HTTP 常见的状态码有哪些?
1) 1xx
类状态码属于提示信息,是协议处理中的一种中间状态,实际用到的比较少
2) 2xx
类状态码表示服务器成功处理了客户端的请求,也是我们最愿意看到的状态
200 OK:请求数据正常;
204 No Content:与 200 OK 基本相同,但响应头没有 body 数据
206 Partial Content:是应用于 HTTP 分块下载或断点续传,表示响应返回的 body 数据并不是资源的全部,而是其中的一部分,也是服务器处理成功的状态
3) 3xx
类状态码表示客户端请求的资源发生了变动,需要客户端用新的 URL 重新发送请求获取资源,也就是重定向
301 Moved Permanently:表示永久重定向,说明请求的资源已经不存在了,需改用新的 URL 再次访问
302 Found :表示临时重定向,说明请求的资源还在,但暂时需要用另一个 URL 来访问
301 和 302 都会在响应头里使用字段 Location
,指明后续要跳转的 URL,浏览器会自动重定向新的 URL
304 Not Modified:重定向存在缓存中,告诉客户端可以继续使用缓存资源。
4) 4xx
类状态码表示客户端发送的报文有误,服务器无法处理,也就是错误码的含义
400 Bad Request:表示客户端请求的报文有错误,但只是个笼统的错误;
403 Forbidden:表示服务器禁止访问资源,并不是客户端的请求出错;
404 Not Found:表示请求的资源在服务器上不存在或未找到,所以无法提供给客户端;
5)5xx
类状态码表示客户端请求报文正确,但是服务器处理时内部发生了错误,属于服务器端的错误码
500 Internal Server Error:与 400 类型,是个笼统通用的错误码,服务器发生了什么错误,我们并不知道;
501 Not Implemented:表示客户端请求的功能还不支持;
502 Bad Gateway:通常是服务器作为网关或代理时返回的错误码,表示服务器自身工作正常,访问后端服务器发生了错误;
503 Service Unavailable:表示服务器当前很忙,暂时无法响应客户端。
4.HTTP 常见字段有哪些?
Host :客户端发送请求时,指定服务器的域名
Content-Length :服务器返回数据的长度
Connection :表明本次链接的状态(长链接、短链接),HTTP/1.1默认长链接
Content-Type :服务器返回数据的类型
Accept:客户端能接收的数据类型
Content-Encoding :说明数据的压缩方法。表示服务器返回的数据使用了什么压缩格式(gzip、deflate)
Accept-Encoding:客户端能接受的压缩方法
5.GET 和 POST 有什么区别?
1)GET :请求获取指定的资源。
POST :根据请求负荷(报文主体)对指定的资源做出处理,具体的处理方式视资源类型而不同
2)GET 方法是安全、幂等、可被缓存的。POST 不安全,不幂等,(大部分实现)不可缓存
6.GET 请求可以带 body 吗?
理论上,任何请求都可以带 body。只是因为 RFC 规范定义的 GET 请求是获取资源,所以根据这个语义不需要用到 body。
另外,URL 中的查询参数也不是 GET 所独有的,POST 请求的 URL 中也可以有参数。
7.HTTP 缓存有哪些实现方式?
强制缓存、协商缓存
8.什么是强制缓存?
强制缓存指的是只要浏览器判断缓存没有过期,则直接使用浏览器的本地缓存,决定是否使用缓存的主动性在于浏览器这边。
9.强制缓存的实现流程
强制缓存利用HTTP响应头部中的两个字段Cache-Control(相对时间)和Expires(绝对时间)实现,Cache-Control 的优先级高于 Expires。
- 当浏览器第一次请求访问服务器资源时,服务器会在 Response 头部加上 Cache-Control,Cache-Control 中设置了过期时间大小;
- 浏览器再次请求访问服务器中的该资源时,会先通过请求资源的时间与 Cache-Control 中设置的过期时间大小,来计算出该资源是否过期,如果没有,则使用该缓存,否则重新请求服务器;
- 服务器再次收到请求后,会再次更新 Response 头部的 Cache-Control
10.什么是协商缓存?
当我们在浏览器使用开发者工具的时候,某些请求的响应码是 304
,这个是告诉浏览器可以使用本地缓存的资源,通常这种通过服务端告知客户端是否可以使用缓存的方式被称为协商缓存。
11.HTTP/1.1 的优点有哪些?
简单、易于拓展、应用广泛和跨平台
12.HTTP/1.1 的缺点有哪些?
无状态、明文传输、不安全
13.HTTP/1.1 的性能如何?
1)长连接:减少了 TCP 连接的重复建立和断开所造成的额外开销,减轻了服务器端的负载
2)管道网络传输:可在同一个 TCP 连接里面,客户端可以发起多个请求,只要第一个请求发出去了,不必等其回来,就可以发第二个请求出去,可以减少整体的响应时间。但是服务器必须按照接收请求的顺序发送对这些管道化请求的响应,容易产生响应报文的队头阻塞
14.HTTP 与 HTTPS 有哪些区别?
1)HTTP明文传输,HTTPS在TCP和HTTP之间加入了SSL/TLS协议加密报文。
2)HTTP在TCP三次握手之后就可以传输报文,HTTPS在三次握手之后还要进行SSL握手后,才可以传输报文。
3)HTTP默认端口80,HTTPS默认端口443.
4)HTTPS需要向CA(证书权威机构)申请数字证书,保证服务器身份可信。
15.HTTPS 解决了 HTTP 的哪些问题?
1) 混合加密对数据进行加密,解决信息被窃取的风险;
- 在通信建立前采用非对称加密的方式交换会话秘钥。
- 在通信过程中全部使用对称加密的会话秘钥的方式加密明文数据。
2)摘要算法实现内容完整性,解决内容被篡改的风险;
发送方会用摘要算法(哈希函数)来计算出内容的哈希值,将内容和哈希值一同发送给接收方,接收方接收到后,对内容也计算出哈希值,如果和发送方的哈希值相同,则表示内容没有被修改,反之则被修改。
但是并不能保证「内容 + 哈希值」不会被中间人替换,计算机里会使用非对称加密算法来证明客户端收到的消息是否来源于服务端:提供公钥、密钥可以对内容进行双向加解密。
公钥加密,私钥解密。这个目的是为了保证内容传输的安全;
私钥加密,公钥解密。这个目的是为了保证消息不会被冒充,确认对端身份。
3)服务器公钥放入数字证书中,解决服务器被冒充的风险;
16.HTTPS 是如何建立连接的?其间交互了什么?
1)TCP三次握手
2)TLS四次握手
TLS 握手流程也会不一样的,现在常用的密钥交换算法有两种:RSA和ECDHE。
下面介绍基于RSA算法的TLS握手过程:
i)客户端向服务器端发送加密请求:客户端支持的TLS版本、客户端随机产生的随机数(client random)、客户端所支持的密码套件列表(如RSA加密算法);
ii)服务端回应给客户端的内容:确定TLS版本1.2、服务端产生的随机数(server random)、确定密码套件(如RSA算法)、服务器的数字证书
iii)客户端收到服务端的内容后,首先通过浏览器或者操作系统的CA的公钥,验证服务器的数字证书的真实性,如果证书没问题,客户端取出数字证书中的公钥,用该公钥对下面的内容加密后发送给服务器:一个随机数(pre-master key)、通知加密算法改变(随后的数据传输使用“会话密钥”进行加密)、客户端握手阶段结束通知,将之前所有发送的数据进行摘要算法发送给服务端进行验证。
此时客户端和服务端都有三个随机数(client random、server random、pre-master key),使用双方确定的加密算法,各自生成“会话密钥”。
iiii)服务端回应给客户端的内容:加密算法改变的通知(随后的数据传输使用“会话密钥”进行加密)、握手结束通知,并将之前发送的数据进行摘要算法发送给客户端进行验证。
至此,TLS四次握手全部结束,接下来的数据传输使用“会话密钥”加密输出。
RSA密钥协商算法的最大缺陷是不支持前向保密。由于客户端发送给服务端的随机数使用公钥加密的,服务端用私钥解密,如果服务端私钥泄漏,则之前TLS传输的密文都会被泄漏。为了解决这个问题,后面出现了ECDHE算法,现在大多数网站都是使用这个算法进行密钥协商。
17.HTTPS 的应用数据是如何保证完整性的?
TLS 在实现上分为握手协议和记录协议两层:
握手协议就是上面提到的四次握手,负责协商加密算法和生成对称密钥,后续用此密钥来保护应用程序数据(即 HTTP 数据);
记录协议负责保护应用程序数据并验证其完整性和来源。
18.HTTPS一定安全可靠吗?
HTTPS 协议本身到目前为止还是没有任何漏洞的,即使你被成功进行中间人攻击(解释:被假基站转发到“中间人服务器”,于是客户端是和“中间人服务器”完成了 TLS 握手,然后这个“中间人服务器”再与真正的服务端完成 TLS 握手),本质上是利用了客户端的漏洞(用户点击继续访问或者被恶意导入伪造的根证书),并不是 HTTPS 不够安全。
19.如何避免被中间人抓取数据?
HTTPS双向认证。
一般HTTPS是单向验证,客户端只会验证服务端身份,使用双向验证,服务端也会验证客户端的身份,一旦身份错误就会停止通信。
20.HTTP/1.1 相比 HTTP/1.0 提高了什么性能?
- 使用长连接的方式改善了 HTTP/1.0 短连接造成的性能开销。
- 支持管道(pipeline)网络传输,只要第一个请求发出去了,不必等其回来,就可以发第二个请求出去,可以减少整体的响应时间