HTTP
2022年8月1日大约 5 分钟
超文本传输协议(HTTP,HyperText Transfer Protocol)是一个用于传输超媒体文档(例如 HTML)的应用层协议。
HTTP 是无状态的协议,无法记录客户端用户的状态。
响应状态码
响应状态码分为五大类:
分类 | 描述 |
---|---|
1xx | 信息 |
2xx | 成功 |
3xx | 重定向 |
4xx | 客户端错误 |
5xx | 服务器错误 |
常见状态码:
- 100(继续):客户端应继续其请求
- 200(成功) 服务器已成功处理了请求。 通常,这表示服务器提供了请求的网页
- 201(已创建) 请求成功并且服务器创建了新的资源
- 202(已接受) 服务器已接受请求,但尚未处理
- 301(永久重定向) 请求的网页已永久移动到新位置。 服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置
- 302(临时重定向) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求
- 304(资源未修改)客户端请求的数据还是最新的,服务器不再返回数据
- 403(禁止) 请求的资源被禁止,服务器拒绝请求
- 404(未找到) 请求的资源不存在,服务器找不到请求的网页
- 500(服务器内部错误):服务器遇到错误,无法完成请求
- 502(错误网关):服务器作为网关或代理,但是从上游服务器得到错误响应。常见于:客户端访问服务器某个防火墙没有开放的接口
- 503 (服务不可用):服务器因维护或过载而停机,通常只是暂时的,应返回解释当前问题的页面
- 504 (网关超时):服务器作为网关或代理,但是没有及时从上游服务器收到请求
HTTP header
请求头 Request Headers:
- Accept:浏览器可接收的数据格式
- Accept-Encoding:浏览器可接收的压缩算法,如 gzip
- Accept-Languange:浏览器可接收的语言,如 zh-CN
- Connection:keep-alive 一次 TCP 连接重复使用
- cookie
- Host:域名
- User-Agent:浏览器信息
- Content-type:发送数据的格式,如 application/json
响应头 Response Headers:
- Ccontent-type:返回数据的格式,如 application/json
- Content-length:返回数据的大小(字节)
- Content-Encoding:返回数据的压缩算法,如 gzip
HTTP1 与 HTTP2
HTTP1 与 HTTP2 的区别:
- HTTP/2 使用二进制传输,将 header 和 body 分成帧来传输。HTTP/1.1 是字符串传输。
- HTTP/2 支持多路复用,速度快,延迟低。HTTP/1.1 不支持。
- HTTP/2 支持头部压缩,HTTP/1.1 不支持。
- HTTP/2 支持服务器推送, HTTP/1.1 不支持。
HTTPS
HTTPS = HTTP + SSL/TLS(安全层)
TLS(Transport Layer Security,安全传输层协议),前身是 SSL(Secure Socket Layer,安全套接字协议)
- 对称加密:客户端和服务端使用相同的秘钥进行加密解密。优点:速度快;缺点:服务端需要保存很多个客户端的密钥,并保证不被泄露。空间消耗大、安全性差。
- 非对称加密:也称为公钥加密。服务端拥有一对可以互相加密解密的公钥和私钥,服务端在网络上任意分发公钥,客户端用公钥加密数据后,再发给服务端,最后由服务端通过私钥解密数据。优点:安全性高;缺点:速度慢
- 混合加密:同时使用对称加密和非对称加密,平衡两者的优缺点。
TLS 使用了对称加密、非对称加密、身份认证等技术。
TLS1.2 握手过程
握手过程:
- 客户端向服务端发送第1随机数,服务端收到后再发送第2随机数、公钥和证书,客户端比对服务端发放的公钥是否通过证书颁发机构(CA)的认证;
- 客户端再生成第3随机数(预主密钥)通过公钥加密发送,服务端收到后通过自己的私钥进行解密,得到预主密钥;
- 客户端和服务端都通过第1随机数、第2随机数和预主密钥计算出会话秘钥,后续就使用会话秘钥进行加密通信。
TLS1.2 使用了对称加密、非对称加密、身份认证等技术:
- 身份认证:客户端比对服务端发放的证书是否通过证书颁发机构(CA)的认证
- 非对称加密:客户端发送公钥给客户端加密第3随机数(预主密钥),再通过私钥解密得到第3随机数。
- 对称加密:客户端和服务端都持有相同的会话秘钥(第1随机数 + 第2随机数 + 第3随机数)
HTTP 与 HTTPS 的区别
HTTP
是明文传输的,不安全;HTTPS
是加密传输的,非常安全。HTTP
使用 80 端口,HTTPS
使用 443 端口。HTTP
较快,HTTPS
较慢。HTTPS
的 CA 证书需要购买(但也有免费的),HTTP
不需要证书。
GET 与 POST 的区别
协议规定的根本区别:HTTP 协议规定的语义上获取数据与提交数据的区别
工程实践中的区别:
GET
用于获取数据,无副作用,幂等,请求参数一般放在 URL 里,可缓存,产生一个 TCP 数据包。POST
用于提交数据,有副作用,非幂等,请求参数一般放在请求体中,不可缓存,产生两个或以上 TCP 数据包。
(幂等表示执行相同的操作,结果也是相同的)
详细区别:
- 从缓存的角度,
GET
请求会被浏览器主动缓存下来,留下历史记录,而POST
默认不会。 - 从编码的角度,
GET
只能进行URL
编码,只能接收ASCII
字符,而POST
没有限制。 - 从参数的角度,
GET
一般放在URL
中,因此不安全,POST
放在请求体中,更适合传输敏感信息。 - 从幂等性的角度,
GET
是幂等的,而POST
不是。 - 从 TCP 的角度,
GET
请求会把请求报文一次性发出去。而POST
会分为两个TCP
数据包:首先发header
部分,如果服务器响应100(continue)
, 再发body
部分。