HTTP基本概念

#HTTP发展历史

HTTP 0.9

  • 只有一个GET方法
  • 没有header等描述数据信息
  • 服务器发送完毕, 就关闭TCP连接

HTTP 1.0

  • 增加了很多方法, 例如POST, PUT, DELETE等
  • 增加了status code和header
  • 增加了多字符集的支持, 多部分发送, 权限, 缓存等

HTTP 1.1

  • 持久连接/长连接
  • Pipeline 客户端可以在同一个连接中发送多个请求, 服务端按顺序返回(串行)
  • 增加host头, 有了host之后可以实现一台web服务可以接收/处理多个域名的请求
  • 增加了其他更多的方法

HTTP 2.0

  • 2.0所有的数据以二进制进行传输(帧), 在1.1大部分是以字符串的形式传输
  • 得益于基于帧的传输, 可以实现在同一个连接里面发送多个请求不再需要按顺序来返回(并行)
  • 头信息压缩, 1.1的header头以字符串的形式进行传输, 占用了大量带宽
  • 推送, 1.1之前只支持客户端主动向服务端发起请求, 服务端被动向客户端响应请求; 2.0之后服务可以主动向客户端发送数据(例子🌰: 客户端在发起请求访问服务端页面时, 先请求html页面, 当客户端收到服务端发来的html数据之后, 客户端浏览器进行解析并渲染, 在其中, 发现了引用到了其他文件, 如css, js文件, 均以url链接形式引用, 此时浏览器会按顺序再次对新的资源发起请求; 2.0中, 此场景下, 客户端在请求了html页面后, 服务端可以实现主动将css, js数据推送到客户端, 从而解决了1.1串行请求资源的性能低下问题. 并且服务端主动推送资源到客户端, 也可以解决客户端因各种原因, 请求不到指定资源的情况)

2.0 以提高效率为主要目标对1.1进行了大量改进

经典五层模型

1
2
3
4
5
6
7
8
9
应用层  —> HTTP/FTP
🔽
传输层 —> TCP/UDP
🔽
网络层: 数据在节点之间传输创建逻辑链路
🔽
数据链路层: 在通信的实体间建立数据链路连接(0101)
🔽
物理层: 定义物理设备如何传输数据

传输层

向用户提供可靠的端到端的服务, 传输层向高层屏蔽了下层数据通信的细节

应用层

为应用软件提供服务, 构建在传输层协议之上, 屏蔽网络通信细节

HTTP(TCP)的三次握手

三次握手是TCP连接中的概念, HTTP不存在连接的概念, HTTP只有请求和响应的概念

每个HTTP的请求与响应都是需要基于一个TCP的连接的

User http requests ———— TCP connection ———— Server http response

在HTTP 1.0 版本中, 客户端发起一个HTTP请求, 此时, 会创建一条TCP连接通道, 在服务端处理完毕, 响应给客户端之后, 这条TCP连接就会被断掉

在HTTP 1.1版本中, 通过声明特殊的属性, 可以实现一个TCP连接上, 可以发送多个HTTP请求(长连接/Keepalive)

在HTTP 2.0 版本中, 可以实现, 同一个客户端请求同一个服务端, 只需要一个TCP连接即可, 因为2.0版本支持并行发送请求, 和并行接收请求, 不需要再额外创建更多的TCP连接

三次握手

1
2
3
4
client                                                 server
———————SYN=1, Seq=x—————— >
<——SYN=1, ACK=x+1, Seq=Y——
———————ACK=Y+1, Seq=Z————>