HTTP/1.x 协议
Hypertext Transfer Protocol (HTTP) 协议
一种无状态的、应用层的、以请求/应答方式运行的协议,它使用可扩展的语义和自描述消息格式,与基于网络的超文本消息系统灵活的互动。
基于 ABNF 语义定义的 HTTP 消息格式
笔记截图:
网络为什么要分层
需要每一层各司其职,每一层只和外面的层进行交互,而外层不需要知道底层怎么运作的。 OSI (Open System Interconnection Refrence Model)
TCP/IP 模型
Network 面板
HTTP/1.1 问题
高延迟问题:页面加载速度降低。
- 随着带宽的增加,延迟没有显著下降
- 并发连接有限
- 同一连接同时只能在完成一个 HTTP 事务(请求或响应)才能处理下一个事务
高延迟的解决方案:增加带宽
无状态特性带来的巨大 HTTP 头部:
HTTP/1.1 解决性能问题的小技巧:
HTTP/1.1 不支持服务器推送消息
笔记版:
五层模型及其作用
应用层:为应用软件提供了很多服务,构建于 TCP 协议之上;屏蔽网络传输相关细节; 传输层:主要有2个协议(TCP和UDP),向用户提供端到端的服务,传输层向高层屏蔽了下层数据通信的细节; 网络层:为数据在节点之间传输创建逻辑链路; 数据链路层:在通信的实体间建立数据链路连接; 物理层:作用是定义物理设备如何传输数据。
HTTP 协议发展史
HTTP 0.9 :只有一个命令 GET ;没有 HEADER 等描述数据的信息;服务器发送完毕,就关闭 TCP 连接; HTTP 1.0 :增加了很多命令(POST/PUT/DELETE...); 增加 status code 和 header ;多字符集支持、多部分发送、权限、缓存等等 HTTP 1.1 :建立持久连接;增加 pipeline(同一个连接发送多个请求,缺点是对请求需要按照顺序处理返回数据,如果前一个请求等待时间很长,后面的请求需要等前面的处理完才能发送--串行,在 HTTP2 会进行优化);增加 host (用于区分同一台物理服务器上的具体软件服务) 和其他一些命令。 HTTP 2 :所有数据以二进制传输;同一个连接里面发送多个请求不再需要按照顺序来--并行;头信息压缩以及推送等提高效率的功能(解决性能问题,在 HTTP 1 中每一次发送请求和接收请求都需要完整的头信息,这些比较占用带宽;以前请求 HTML 文件并解析,需要 css 和 JS 才会再次发出请求,HTTP2 中请求 HTML 的同时,将 css 和 JS 主动推送给客户端,大大提升了加载速度);
HTTP 三次握手
三次握手是指 TCP 建立连接,HTTP 请求是建立在 TCP 连接上,而且在 TCP 连接上可以发送多个请求。但是在 HTTP1.0 中,HTTP 发起请求时创建 TCP 连接,服务器响应后,TCP 就关闭了;在 HTTP1.1 中,TCP 连接可以通过某种方式去声明这个连接可以一直保持着,提升效率,因为 TCP 连接有三次握手成功才能发送 HTTP 请求,需要消耗时间;在 HTTP2 中,HTTP 请求是可以并发的,意味着可能只需要一个 TCP 连接。
客户端发起创建 TCP 连接的请求,会有一个标志位 SYN=1 和 Seq=X ;服务端接收到信息后开启 TCP socket 的端口,响应客户端,会有一个 SYN=1 、标志位 ACK=X+1 和 Seq=Y ;客户端得到响应后,再次发送 ACK=Y+1,Seq=Z 。为什么要三次呢?这是为了防止服务端开启无用的连接,因为网络传输是有延时的,服务端响应客户端时的请求可能丢失,客户端会因为超时关闭了连接,服务端是不知道客户端是否接收到响应,造成服务器开销极大浪费,所以需要第三次握手,让服务端确保客户端收到响应。
HTTP 四次挥手
URI、URL 和 URN
URI(Uniform Resource Identifier) 是包含 URL 和 URN 统一的定义,统一资源标志符,用来唯一标识互联网上的信息资源。 URL(Uniform Resource Locator) 统一资源定位器,所有部分包含: http://user:pass@host.com:80/path?query=string#hash
。http://
也可以是 ftp://
,属于 schema 协议;user:pass
很少见到,主要是不安全;host.com
用来定位服务器主机;80
用来指定服务器主机具体的服务软件;path
用来定位具体的内容;query=string
是搜索参数或操作查找数据;hash
是指大数据量资源某一个片段,前端里面用来锚点定位。 URN:永久统一资源定位符。某一个资源迁移了位置或者移除,URL 请求不到会返回404,但是 URN 解决了这个问题,可以访问到这个已经迁移的资源,但是业界没有成熟的使用方案,使用的不多。
HTTP 报文格式
HTTP Methods:用于定义对资源的操作(GET/POST/PUT/DELETE...); HTTP Code:用于定义服务器对请求的处理结果,各个区间的code 有各自的语义。比如 100-199 这个操作会持续进行, 200-299 这个操作是成功的,300-399 这个操作需要重定向,用别的方式去获取数据,400-499 这个操作有问题(比如 401 表示没有权限访问),500-599 代表服务器出现错误