HTTP
HTTP
引用:小林coding
1. HTTP基本知识
1.1 HTTP是什么
HTTP 是超文本传输协议,也就是HyperText Transfer Protocol。
1.2 HTTP常见的状态码有哪些
1xx
1xx
类状态码属于提示信息,是协议处理中的一种中间状态,实际用到的比较少。2xx
2xx
类状态码表示服务器成功处理了客户端的请求,也是我们最愿意看到的状态。- 「200 OK」是最常见的成功状态码,表示一切正常。如果是非
HEAD
请求,服务器返回的响应头都会有 body 数据。 - 「204 No Content」也是常见的成功状态码,与 200 OK 基本相同,但响应头没有 body 数据。
- 「206 Partial Content」是应用于 HTTP 分块下载或断电续传,表示响应返回的 body 数据并不是资源的全部,而是其中的一部分,也是服务器处理成功的状态。
- 「200 OK」是最常见的成功状态码,表示一切正常。如果是非
3xx
3xx
类状态码表示客户端请求的资源发送了变动,需要客户端用新的 URL 重新发送请求获取资源,也就是重定向。「301 Moved Permanently」表示永久重定向,说明请求的资源已经不存在了,需改用新的 URL 再次访问。
「302 Moved Permanently」表示临时重定向,说明请求的资源还在,但暂时需要用另一个 URL 来访问。
301 和 302 都会在响应头里使用字段
Location
,指明后续要跳转的 URL,浏览器会自动重定向新的 URL「304 Not Modified」不具有跳转的含义,表示资源未修改,重定向已存在的缓冲文件,也称缓存重定向,用于缓存控制。
4xx
4xx
类状态码表示客户端发送的报文有误,服务器无法处理,也就是错误码的含义。- 「400 Bad Request」表示客户端请求的报文有错误,但只是个笼统的错误。
- 「403 Forbidden」表示服务器禁止访问资源,并不是客户端的请求出错。
- 「404 Not Found」表示请求的资源在服务器上不存在或未找到,所以无法提供给客户端。
5xx
5xx
类状态码表示客户端请求报文正确,但是服务器处理时内部发生了错误,属于服务器端的错误码。- 「500 Internal Server Error」与 400 类型,是个笼统通用的错误码,服务器发生了什么错误,我们并不知道。
- 「501 Not Implemented」表示客户端请求的功能还不支持,类似“即将开业,敬请期待”的意思。
- 「502 Bad Gateway」通常是服务器作为网关或代理时返回的错误码,表示服务器自身工作正常,访问后端服务器发生了错误。
- 「503 Service Unavailable」表示服务器当前很忙,暂时无法响应服务器,类似“网络服务正忙,请稍后重试”的意思。
1.3 HTTP常见字段
Host
:客户端发送请求时,用来指定服务器的域名。Content-Length
:服务器在返回数据时,会有Content-Length
字段,表明本次回应的数据长度。Connection
:字段最常用于客户端要求服务器使用 TCP 持久连接,以便其他请求复用。(Connection:Keep-alive)Content-Type
:用于服务器回应时,告诉客户端,本次数据是什么格式。Content-Encoding
:说明数据的压缩方法。表示服务器返回的数据使用了什么压缩格式
2. HTTPS
2.1 HTTP和HTTPS有什么区别
- HTTP明文传输,存在风险;HTTPS加入了SSL/TLS协议,报文能够密文传输
- HTTP建立连接只需要TCP三次握手;HTTPS在TCP三次握手后还需要进行SSL/TLS握手
- HTTP默认80端口;HTTPS默认443端口
2.2 TLS握手过程(RSA算法)
SSL/TLS 在加密过程中涉及到了两种类型的加密方法:
- 非对称加密:服务器向客户端发送公钥,然后客户端用公钥加密自己的随机密钥,也就是会话密钥,发送给服务器,服务器用私钥解密,得到会话密钥。
- 对称加密:双方用会话密钥加密通信内容。
TLS第一次握手
客户端首先会发一个Client Hello
消息,这个消息里包含:客户端使用的TLS版本号、支持的密码套件列表(如RSA)、以及生成的随机数Client Random
TLS第二次握手
当服务端收到客户端的Client Hello
,会确认是否支持客户端的TLS版本号,然后从密码套件列表中选一个密码套件,以及生成一个随机数Server Random
,然后返回Server Hello
消息
然后,服务端为了证明自己的身份(没有被别人冒充),会发送Server Certificate
给客户端,这个消息里含有数字证书
最后,服务端发送Server Hello Done
数字证书
一个证书通常包含了:
- 公钥
- 持有者消息
- 证书认证机构(CA)的消息
- CA对这份文件的数字签名及使用的算法
- 证书有效期
下图为证书签发和验证流程:
TLS第三次握手
客户端验证完证书后,认为可信则继续往下走。
客户端生成一个新的随机数pre-master
,用服务器的RSA公钥加密pre-master
,通过消息Client Key Exchange
传给服务端,服务端收到后用RSA私钥解密
至此,客户端和服务端都得到了三个随机数:Client Random
、Server Random
、pre-master
,基于这三个随机数生成一个会话密钥,用于后续信息传递的加解密
生成会话密钥后,客户端发一个Change Cipher Spec
消息,告诉服务端开始使用加密方式发送消息
然后客户端再发一个Encrypted Handshake Message(Finished)
消息,把之前所有握手数据做一个摘要
TLS第四次握手
服务端也发回Change Cipher Spec
和Encrypted Handshake Message
,握手正式完成
然后就能用会话密钥进行加密报文传输了
3. HTTP1.0、1.1、2.0的区别
HTTP1.0
- 无状态协议:HTTP 1.0 是无状态的,每个请求之间相互独立,服务器不保存任何请求的状态信息。
- 非持久连接:默认情况下,每个 HTTP 请求/响应对之后,连接会被关闭,属于短连接。这意味着对于同一个网站的每个资源请求,如 HTML 页面上的图片和脚本,都需要建立一个新的 TCP 连接。可以设置
Connection: keep-alive
强制开启长连接。
HTTP1.1
- 持久连接:HTTP 1.1 引入了持久连接(也称为 HTTP keep-alive),默认情况下不会立即关闭连接,可以在一个连接上发送多个请求和响应。极大减轻了 TCP 连接的开销。
- 流水线处理:HTTP 1.1 支持客户端在前一个请求的响应到达之前发送下一个请求,以提高传输效率。
HTTP2.0
二进制协议:HTTP 2.0 使用二进制而不是文本格式来传输数据,解析更加高效。
多路复用:一个 TCP 连接上可以同时进行多个 HTTP 请求/响应,解决了 HTTP 1.x 的队头阻塞问题。
持久化连接允许多个请求通过同一个TCP连接发送,而管线化则允许客户端在不等待前一个请求响应的情况下发送多个请求。然而,响应必须按照请求的顺序接收,这就导致了队头阻塞的问题
头部压缩:HTTP 协议不带状态,所以每次请求都必须附上所有信息。HTTP 2.0 引入了头部压缩机制,可以使用 gzip 或 compress 压缩后再发送,减少了冗余头部信息的带宽消耗。
服务端推送:服务器可以主动向客户端推送资源,而不需要客户端明确请求。