这是我参与「第四届青训营 」笔记创作活动的的第2天
什么是HTTP
超文本传输协议(Hyper Text Transfer Protocol,HTTP),是目前应用最广泛的网络传输协议,具有以下特点:
- 应用层协议,基于TCP协议
- 语义简单
- 请求响应
- 简单可扩展
- 无状态
下图是Web技术的关系图
无状态
HTTP协议最主要的性质就是无状态,即在同一个连接中,两个执行成功的请求之间是没有关系的。也就是说,HTTP协议不能记住自己之前都做了些什么。
举个简单的例子:假设现在用户要登录一个电商网站,用户输入自己的账号密码,服务器返回登录成功的结果,并跳转到首页。这看似很对,但是用户只是现在能够访问首页而已,服务器现在并不记得是谁在访问首页,甚至不记得刚才是谁在登录。用户先把衣服加入购物车,再把裤子加入购物车,但是服务器不记得要加入谁的购物车,也不记得购物车之前还有什么商品。这就是无状态协议。
为了解决这一问题,Cookie和Session技术便应运而生。
协议发展
| 版本 | 特点 | 新增内容 |
|---|---|---|
| HTTP/0.9 | 单行协议 | 请求GET /mypage.html 响应只有HTML文档 |
| HTTP/1.0 | 构建可扩展性 | 增加了Header 有了状态码 支持多种文档类型 |
| HTTP/1.1 | 标准化协议 | 链接复用 缓存 内容协商 |
| HTTP/2 | 更优异的表现 | 二进制协议 压缩header 服务器推送 |
| HTTP/3 | 草案 | …… |
协议分析
HTTP报文大致分为报文首部和报文主体两块,中间用空行来划分。通常,不一定有报文主体。
- 报文首部:包含服务器或客户端需处理的请求或响应的内容及属性。
- 报文主体:是应该被发送的数据。
不论是请求报文,还是响应报文,结构都是类似的。
请求报文首部的结构:
- 请求行:包含用于请求的方法,请求URI和HTTP版本。
- 请求首部字段
- 通用首部字段
- 实体首部字段
- 其它
响应报文首部结构:
- 状态行
- 响应首部字段
- 通用首部字段
- 实体首部字段
- 其他
常见HTTP请求方法
GET:请求一个指定资源的表示形式.使用GET的请求应该只被用于获取数据
POST:用于将实体提交到指定的资源,通常导致在服务器上的状态变化或副作用
PUT:用请求有效载荷替换目标资源的所有当前表示
DELETE:删除指定的资源
请求特点
- Safe(安全的)
不会修改服务器数据的方法,如GET、HEAD、OPTIONS
- Idempotent(幂等)
同样的请求被执行一次与连续执行多次的效果是一样的,服务器的状态也是一样的
所有safe的方法都是ldempotent的,如GET、HEAD、OPTIONS、PUT、DELETE
状态码
| 分类 | 分类描述 |
|---|---|
| 1** | 信息,服务器收到请求,需要请求者继续执行操作 |
| 2** | 成功,操作被成功接收并处理 |
| 3** | 重定向,需要进一步的操作以完成请求 |
| 4** | 客户端错误,请求包含语法错误或无法完成请求 |
| 5** | 服务器错误,服务器在处理请求的过程中发生了错误 |
常用状态码:
200 OK-客户端请求成功
301-资源(网页等)被永久转移到其它URL302-临时跳转
401 Unauthorized -请求未经授权
404-请求资源不存在,可能是输入了错误的URL500 -服务器内部发生了不可预期的错误
504 Gateway Timeout-网关或者代理的服务器无法在规定的时间内获得想要的响应。
总结
HTTP是一个十分古老的网络传输协议,因此具有很多的局限性,比如:
它是无状态的,这个简化了协议的设计,使其拥有更好的性能,适应了早期互联网时代“网页只是展示板”的特点。但是随着Web 2.0时代的到来,用户与网站的交互日趋增多,无状态性质会使得服务器无法识别不同的用户,并记忆用户之前的操作,这严重影响了用户体验。因此Cookie和Session技术便应运而生,提高了用户体验。
HTTP协议的发展是迅速的。为了解决历史遗留问题,HTTP协议在不断地推陈出新,HTTP/1.1是目前最常用的版本,它支持持续连接。通过这种连接,就有可能在建立一个TCP连接后,发送请求并得到回应,然后发送更多的请求并得到更多的回应。现在互联网公司强推的HTTP/2在保持兼容性的前提下,又实现了异步连接多路复用、头部压缩、请求/响应管线化等功能,使得HTTP协议的功能更加强大。而HTTP/3目前仍处于草案阶段,但我相信它会给HTTP协议带来更多的功能,并提升性能。期待HTTP/3的到来。