HTTP 特性整理
五层模型
应用层:HTTP, FTP, DNS(具体应用)
传输层:TCP, UDP(消息的可靠传递)
网络层:IP, 路由器(在互联网中找到对方)
数据链路层:MAC, 交换机(在子网中找到对方)
物理层:电缆(如何用信号表示)
在网络通信中,数据依次经过每一层的处理,发出的时候封装,接收的时候解封装
URL 的定义
URL 即统一资源定位符
标准 http 的 URL 构成:{schema}://{domain}:{port}:{query}#{hash}
HTTP 请求的构成
请求行 Line:包含请求方法、请求路径、版本号
请求头 Header:请求头部信息,例如 Content-Type
请求体 Body:传输的数据(类型需要跟服务端约定)
响应状态码
1xx:收到请求,需要继续执行
100 临时响应,可以继续请求
101 根据客户端请求切换协议,例如 websocket 或 http2
2xx:请求成功
200 成功
201 已创建
202 已接收请求,尚未处理
203 返回的信息来自另一个来源
204 无返回内容
205 重置内容
206 成功处理了部分请求
3xx:重定向或缓存
300 多种选择
301 永久重定向
302 临时重定向
303 查看其它位置
304 资源未发生变更,通知客户端可以使用缓存
305 使用代理
4xx:请求错误
400 错误的请求,服务器不理解
401 要求进行身份验证
403 拒绝请求
404 未找到请求的资源
405 禁止使用此方法
406 不接受响应的资源
407 需要代理授权
408 请求超时
5xx:服务器错误
500 服务器内部错误
501 不具备完成请求的功能
502 错误的网关
503 服务不可用(超载或停机维护)
504 网关超时
505 不支持的 http 版本
版本
到目前为止,HTTP 常⻅到版本有 HTTP/1.0,HTTP/1.1,HTTP/2.0,HTTP/3.0,不同版本的 HTTP 特性 是不一样的。
HTTP 0.9
支持 GET
没有请求头
只能返回 HTML 字符串
服务端响应后立即关闭 TCP
HTTP 1.0
新增 POST, HEADER 方法
加入请求头和响应头
请求行加入版本号标识
支持传输数据格式:图片、音视频、二进制
HTTP 1.1(主流)
- 支持长连接
请求头中包含此属性Connection: keep-alive
表示开启长连接,通常浏览器默认自动带上。
- 管道化传输
请求可以连续发出,不需要等待上一条响应。(解决队头阻塞问题)
但是响应数据仍然按接收的顺序依次发出。(队尾阻塞)
- 支持缓存处理
响应头的 Cache-Control 和 Expired 字段,表示过期的相对时间或绝对时间,具体实现则是在浏览器完成。
增加 PUT 和 DELETE 方法
支持断点传输
解决上传和下载的中断问题
HTTP 2.x
- 二进制分帧
1.x 是基于文本传输的,效率较低,而 2.x 通过二进制将信息分割成小块,提高传输效率。
- 多路复用
请求数据基于二进制分帧,按小块乱序发送,服务端自行拼凑成完整的数据去处理。
- 头部压缩
由客户端和服务端共同维护一份头部信息字典,减少头部的重复信息,达到压缩的目的
- 服务器推送
服务器可以主动向客户端推送资源
TCP 三次握手和四次挥手
三次握手
TCP 建立连接时需要经过三次握手
客户端 ------> SYN ------> 服务端(我需要请求信息)
客户端 <------ SYN+ACK ------- 服务端(已收到信息,你能不能接收信息)
客户端 ------> ACK ------> 服务端(我可以接收信息)
客户端 ------> SYN ------> 服务端(我需要请求信息)
客户端 <------ SYN+ACK ------- 服务端(已收到信息,你能不能接收信息)
客户端 ------> ACK ------> 服务端(我可以接收信息)
三次握手的目的,是为了双方互相确认对方的发送能力和接收能力是正常的,避免浪费资源,为后序的可靠性传输做准备。
四次挥手
TCP 断开连接时需要经过三次握手
客户端 ------> FIN ------> 服务端(我准备断开连接了)
客户端 <------ ACK ------- 服务端(已收到,但是响应数据没发完,等我信号)
客户端 <---- ACK+FIN ----- 服务端(可以断开连接了)
客户端 ------> ACK ------> 服务端(已断开连接)
客户端 ------> FIN ------> 服务端(我准备断开连接了)
客户端 <------ ACK ------- 服务端(已收到,但是响应数据没发完,等我信号)
客户端 <---- ACK+FIN ----- 服务端(可以断开连接了)
客户端 ------> ACK ------> 服务端(已断开连接)
四次挥手的原因是因为服务器需要等报文发送完毕后才能断开。
HTTPS
概念
HTTPS 就是在 TCP 和 HTTP 网络层之间加上一层 SSL/TLS 协议层。
HTTP 连接建立相对简单, TCP 三次握手之后便可进行 HTTP 的报文传输。而 HTTPS 在 TCP 三次握手之后,还需进行 SSL/TLS 的握手过程,才可进入加密报文传输。
HTTP 默认端口为 80,而 HTTPS 默认端口为 443。
HTTPS 协议需要向 CA(证书权威机构)申请数字证书,来保证服务器的身份是可信的。
HTTPS 解决了 HTTP3 大风险:
窃听风险
篡改风险
冒充风险
HTTPS 的特点:
HTTPS 采用了对称加密和非对称加密结合的混合加密方式。
摘要算法+数字签名
为了保证传输的内容不被篡改,我们需要对内容计算出一个「指纹」,然后同内容一起传输 给对方。
对方收到后,先是对内容也计算出一个「指纹」,然后跟发送方发送的「指纹」做一个比 较,如果「指纹」相同,说明内容没有被篡改,否则就可以判断出内容被篡改了。
- 数字证书
在计算机里,权威的机构就是 CA (数字证书认证机构),将服务器公钥放在数字证书 (由数字证书认证机构颁发)中,只要证书是可信的,公钥就是可信的。
HTTPS 建立连接的过程
前置重要知识点:
非对称加密,是指有两把密钥,公钥加密后只能用公钥解,私钥加密后只能用公钥解
对称加密是指双方都使用同一个密钥来加密和解密,而第三方没有密钥则不能解
SSL/TLS 协议基本流程:
客户端向服务器索要公钥
客户端向 CA 获取证书,验证服务器的公钥是否可信(避免中间人劫持)
双方协商生产「会话秘钥」,客户端通过公钥生成对称密钥,发给服务端解密(非对称加密)
双方采用「会话秘钥」进行加密通信(对称加密)