超文本传输协议(HTTP)
HTTP客户端发起请求,创建一个到服务器指定端口(默认是80端口)的TCP连接
HTTP服务器在这个端口监听客户端的请求,一旦收到请求,服务器会向客户端返回一个状态及返回的内容(请求的文件、错误消息…)
特点
-
无状态保存
不保留之前的请求或响应报文
-
可靠传输
版本
HTTP1.0
-
短连接
每个连接只发送一个请求,发送数据完毕,连接关闭,要请求其他资源需要建立新连接
HTTP1.1
-
长连接
连接默认不关闭,一次TCP连接可以建立多请求
Connection: keep-alive
-
管道机制
在同一个TCP连接里,可以发送多个请求
-
新方法
PUT、DELETE、PATCH、OPTIONS
问题:
-
头部数据过大(http无状态导致)
-
数据明文传输不安全
-
队头阻塞
前一个请求处理完毕才能处理下一个请求
-
服务器不能发起请求
HTTP2.0
-
压缩头部数据
客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号,只发送索引号
-
服务端推送
服务端可以发起请求
-
多路复用
一个连接里,客户端和服务端可以发起多次请求和回应
-
二进制传输
头部信息和数据体以帧形式传输(头信息帧、数据帧)
问题:
-
TCP以及TCP+TLS建立连接的延迟
-
队头阻塞
TCP中,丢包重传,仍导致队头阻塞
HTTP3.0
-
解决队头阻塞
基于UDP解决队头阻塞,基于QUIC保证数据可靠性
-
快速握手
-
多路复用
工作流程
- 客户与服务器建立连接
- 客户向服务器提出请求
- 服务器接收请求并响应
- 释放TCP链接
- 客户端解析HTML内容
报文结构
起始行(start line)(请求行/状态行)(request line/status line)
请求方法
HTTP设计的本意是令不同的请求方法表达不同的语义,但实际使用中不同方法的具体作用看的是后端接口的实现
即:GET请求也可以在body中传递信息,也可以用作删除数据
方法名 | 作用 | 特点 |
---|---|---|
GET | 获取数据 | 1.通常利用url传参,body为空 2.主动缓存(从内存中获取响应数据) 3.通过点击url链接、设置html标签中的url触发 4.回退无害、可添加书签 |
POST | 传输数据 | 1.参数通常写在body中 2.回退刷新 3.请求时,先发送header,响应100,再发送body,响应200 两次请求的时间差很小,有助于验证数据的完整性 |
PUT | 传输文件 | |
DELETE | 删除数据 | |
HEAD | 只返回响应报头 | |
CONNECT | 预留给能够将连接改为管道方式的代理服务器 | |
OPTIONS | 查看服务器的性能 | |
TRACE | 回显服务器收到的请求 | |
PATCH | 更新资源 |