GET 与 POST
GET与HEAD被RFC认为是一种安全方法,即不会再服务器上产生结果
- GET将参数包含在URL中,POST通过
request body
传递参数 - 参数长度限制(http没有定义),浏览器会对其进行限制
- GET提交数据没有POST安全,因为GET在地址栏上,其数据可以出现在URL上,因为GET数据可以缓存,有人查看浏览器历史记录就可能拿到
- GET请求是幂等的,而POST请求是不幂等的
- GET请求能缓存,POST不能
- POST支持更多的编码类型且不对数据类型限制
幂等性是指一次或者多次请求某一个资源都应该具有同一个副作用。对同一个URL应该返回同样的结果
(下面的不一定正确,浏览器不同而不同)
GET产生一个TCP数据包;POST产生两个TCP数据包
- 对于GET请求,浏览器会把http header 和 data 一起发送出去,服务器相应200
- 对于POST,浏览器先发送header,服务器相应100 continue,浏览器再发送data,服务器相应200ok
HTTP/2
多路复用技术,只通过一个TCP连接就可以传输所有的请求数据,很好地解决了浏览器限制同一域名下的请求数量问题,同时更容易实现全速传输(新开TCP连接需要慢慢提升传输速度的)
二进制传输
在之前的HTTP版本都是通过文本的方式传输数据的,在HTTP/2中引入了新的编码机制,所有传输的数据都会被分隔,并采用二进制格式编码
多路复用
在HTTP/2中,有两个非常重要的概念,分别是帧(frame)和流(stream)
帧代表着最小的数据单位,流就是多个帧组成的数据流,帧中包含着流的标识
多路复用就是一个TCP连接中可以存在多条流。换句话说,就是可以发送多个请求,对端可以通过识别帧中流的标识就可以知道是哪个请求了。通过这个技术可以结局HTTP中的队头阻塞问题。
Header压缩
使用HPACK压缩格式对传输的header进行编码,同时在两端维护索引表,用于记录出现过的header。后面在传输过程中就可以传输已经记录过的键名了。(通过键名找到对应的值)
服务端PUSH
服务端可以在客户端某个请求之后,主动推送其他资源。
HTTP/3
因为HTTP/2使用了多路复用,但是如果底层的TCP出现了丢包的情况,就会导致HTTP/2的表现情况反而不如HTTP/1了。
因为在丢包的情况下,整个TCP都要开始等待重传,导致了后面的数据被阻塞了。在HTTP/1中,开启了多个TCP连接,出现这种情况法尔只会影响到一个连接,剩余的TCP连接还是可以正常传输的。
基于这个原因,Google就基于UDP协议推出了一个QUIC协议,使用在了HTTP/3上。
QUIC
多路复用
QUIC原生实现了多路复用功能,并且传输的单个数据流可以有序交付且不会影响其他的数据流。
QUIC在移动端表现优于TCP,因为TCP是基于IP和端口去识别连接的。这种方式在多变的移动端网络是脆弱的。但是QUIC通过ID的方式识别一个连接,不管网络环境如何变化,只要ID不变就可以迅速重连上。
0-RTT
通过使用类似TCP的快速打开技术,缓存当前会话上下文,在下次恢复会话的时候,只需要将之前的缓存传递给服务端验证就可以进行传输了。
纠错机制
如果要发出三个包,那么协议会算出这三个包的异或值并且单独发出一个校验包,总共发出4个包
当出现非校验包丢包的情况下,可以通过另外三个包计算出丢失的数据包内容。(只能用于丢失一个包的情况下)
HTTP报文结构
请求行或状态行CRLF
首部行CRLF
空行(CRLF)
实体
状态码和相应的短语
- 1XX 信息性状态码,接收的请求正在处理
- 100 Continue 等待状态码
- 2XX 成功状态码,请求正常处理完毕
- 200 OK
- 204 No Content
- 206 Partial Content
- 3XX 重定向状态码,需要附加操作以完成请求
- 301 Move Permanently 禁止从POST变成GET,但浏览器,原URL已经移除
- 302 Found 禁止从POST变成GET,但浏览器
- 303 See Other 从POST变成GET
- 304 Not Modified
- 307 Temporary Redirect 不会从POST变成GET
- 4XX 客户端错误状态码,服务器无法处理请求
- 400 Bad Request 存在语法错误
- 401 Unauthorized 需要认证,如果之前已经进行一次请求,表示认证失败
- 403 Forbidden
- 404 Not Found
- 412 Precondition Fail
- 417 Expectation Fail
- 5XX 服务器错误状态码,服务器处理请求错误
- 500 Inernal Server Error 执行请求出现错误
- 503 Service Unavailable 超负荷,停机维护
- 504 Gateway Timeout 网关等待服务器相应超时