HTTP是什么?
HTTP(超文本传输协议),是一种简单可扩展的协议,是无状态的。依赖于面向连接的TCP协议进行消息传递,但连接不是必须的。
1、HTTP/2.0将HTTP协议消息封装到了帧,但仍然是简单易读的。
2、HTTP/1.0出现的headers让HTTP扩展变得很容易,只需要客户端和服务端约定好新的header规则。
3、HTTP是无状态的,可以通过cookie携带信息达成相同的状态。
HTTP流
当客户端请求服务端时,分为以下几步:
- 打开一个TCP连接。
- 发送HTTP报文。
- 读取服务端返回报文。
- 关闭连接或等待连接被后续请求重用。
HTTP报文
HTTP/2.0将报文封装到帧(一个二进制结构),但是仍然可以按照以下结构理解。
- 请求报文。
- 响应报文
HTTP的发展
1. HTTP/0.9 - 单行协议
最初的HTTP协议没有版本号,为了区分其他版本,最后被定位为0.9版本。极其简单,请求由单行命令构成,只能使用GET,其后跟目标资源路径。响应也很简单,只包含相应文档本身。
// 请求
GET /mypage.html、
// 响应
<HTML>
这是一个非常简单的 HTML 页面
</HTML>
2. HTTP/1.0
在0.9的基础上进行扩展。
- 协议版本信息会跟随每个请求发送。
- 状态码会在响应开始时发送。
- 引入了请求头的概念。使HTTP协议变得更灵活,更具扩展性。
- 在请求头的帮助下,获得了传输其他类型文档的能力。(content-type)
3. HTTP/1.1
在1.0的基础上进行优化和改进。
- 支持长连接和请求流水线处理,在一个TCP连接上可以传输多个HTTP消息。减少了每次HTTP请求都需要重新建立TCP连接的性能消耗。
队头阻塞:同一个TCP连接可以在请求还未返回时并发多个请求,但仍然期望按发送顺序返回响应。如果先发送的请求未能及时响应,会阻塞后面的请求。
- 引入了更多的缓存处理机制。在HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略。
- Host头处理,在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)。
- 引入内容协商机制,包括语言,编码,类型等,并允许客户端和服务器之间约定以最合适的内容进行交换。
4. HTTP/2.0
- 将报文封装成二进制帧,不再可读。
- 多路复用。多路复用允许同时通过单一的http/2连接发起多重的请求-响应消息。通过分帧,将消息拆分成互不依赖的数据帧,乱序发送,再在另一端重新组合。避免了队头阻塞问题。
- 头部压缩。因为分帧的原因,请求头可以单独发送。客户端和服务端都缓存一份头部信息,重复的头部就不再多次发送。
- 请求优先级。分帧后,可以设置每个帧的传输优先级,优化请求。
优先级最高:主要的html
优先级高:CSS文件
优先级中:js文件
优先级低:图片
- 服务端推送。服务端可以主动向客户端发送资源。
HTTPS
HTTPS是基于HTTP协议和SSL构建的,可进行身份认证和加密传输的传输协议。
HTTP的不足
- 通信使用明文
- 不验证通信双方的身份
- 无法验证报文完整性,可能被篡改。