刚好前几天看完《《图解http》》乘着记忆犹新,那就总结一篇关于http的基础知识。
TCP/IP 协议族(各个协议集合的总称)
1. 应用层
应用层决定了向用户提供应用服务时通信的活动。(HTTP、DNS、FTP)等协议是属于这一层
2. 传输层
处于网络连接中的两台计算机之间的数据包。(TCP、UDP)等协议是属于这一层
3. 网络层
网络层用来处理在网络上流动的数据包,数据包是网络传输的最小数据单位。该层规定了通过怎样的路径(所谓的传输路线)到达对方计算机,并把数据包传送给对方。(IP协议)
4. 链路层
用来处理连接网络的硬件部分。包括控制操作系统、硬件的设备驱动、NIC(Network Interface Card,网络适配器,即网卡),及光纤等物理可见部分(还包括连接器等一切传输媒介)。
什么是HTTP?
HTTP 通常被译为“超文本传输协议” ,是客户端和服务端直接通讯时,遵循的一种规则约定。
HTTP版本变迁记录
1. HTTP0.9
HTTP0.9在1991年由W3C发布,是一个非常简单的版本,只有GET这一种请求方法,而且只有一行ASCII格式的文本。很显然在高速发展的互联网中这些是明显不够用的于是升级到HTTP1.0。
2. HTTP1.0
新增(相关信息后面会简述)
- 请求方法
- 状态码
- 首部信息
···
缺陷
- 短链接(部分支持keep-alive)
通讯完立即断开,造成每次都要重新发起TCP三次握手建立连接, 造成无谓的 TCP 连接建立和断开,增加通信量的开销。 - 队头阻塞
每次请求的时候都会等待前一个链接请求完成以后才开始请求,造成一个等待时间。
3. HTTP1.1
1997 年 1 月公布的 HTTP/1.1 是目前主流的 HTTP 协议版本。当初的标准是 RFC2068,之后发布的修订版 RFC2616 就是当前的最新版本。
新增
- 默认开启keep-alive
持久连接旨在建立 1 次 TCP 连接后进行多次请求和响应的交互。
减少了 TCP 连接的重复建立和断开所造成的额外开销,减轻了服务器端的负载。
- 增加缓存机制
客户端分为两种分别是强缓存、协商缓存。 更多细节
- 管道机制( 管线化 )
现在在HTTP/1.1中通过管道机制允许客户端同时发起多个请求,一定程度上缓解了对头阻塞问题,但并没有完全解决。为什么这么说呢,因为服务端是按照接收到请求包的顺序响应的,也就是说如果先后收到请求A和B,即使对A的响应需要一定的时间,而B的响应数据很快可以准备好,也要先响应A,这就造成了队头阻塞。
请求A -> 请求B (不需要等待响应即可发送) --> 响应A -> 响应B (按顺序等待A响应才能响应B)
- 请求范围引入range域
首部信息加入范围请求,数据较大的时,可以分段请求内容。
···
缺点
- 队头阻塞
- 首部信息冗余量大
- 请求只能从客户端开始。客户端不可以接收除响应以外的指令
- 数据未压缩,导致数据的传输量大
4. HTTP2.0
HTTP/2.0的目标是改善用户在使用Web时的速度体验。
新增
- 帧(frame)客户端与服务器通过交换帧来通信,帧是基于这个协议通信的最小单位。
- 流(stream)是连接中的一个虚拟信道,可以承载双向的消息;每个流都有一个唯一的整数标识符
- 二进制分帧层(二进制编码)/ 多路复用
HTTP/1.x的解析是基于文本的。二进制只识别0和1的组合。基于这种考虑HTTP/2.0增加了一层二进制分帧层处理这些数据,数据经过二进制分帧层处理之后,会被转换为一个个带有请求 ID 编号的帧,通过协议栈将这些帧发送给服务器处理。服务器以同样处理方式,这样就实现了 HTTP 的多路复用技术
- 首部压缩,实体压缩。
通过压缩 HTTP 请求和响应的首部,通信产生的数据包数量和发送的字节数就更少了。
- 请求的优先级
HTTP/2.0提供了请求优先级,可以在发送请求时,标上该请求的优先级。
- 服务器推送
缺点
- 传输层还是会存在tcp数据包级别的阻塞
HTTP首部
HTTP首部字段是构成 HTTP 报文的要素之一。在客户端与服务器之间以 HTTP 协议进行通信的过程中,无论是请求还是响应都会使用首部字段,它能起到传递额外重要信息的作用。 使用首部字段是为了给浏览器和服务器提供报文主体大小、所使用的语言、认证信息等内容。
| 请求报文 | 响应报文 |
|---|---|
上图可以看出,请求报文由请求行(请求方法 主机名 http版本)、首部信息、空行(区分首部和主体)、报文主体(数据)四部分组成。响应报文区别在于状态行(http版本 状态码 短语)、不同的首部信息。
首部字段
首部的信息内容太多,这里只罗列出分类直接引入《图解http》的图具体详情自行查资料总结。
- 请求首部
- 响应首部
- 通用首部
- 实体首部
请求方法
关于get和post的区别跳转
- GET
获取资源
- POST
传输实体主体
- PUT
传输文件
- DELETE
DELETE 方法用来删除文件,按请求 URI 删除指定的资源。
- HEAD
获得报文首部,不返回报文主体内容。
- OPTIONS
OPTIONS 方法用来查询针对请求 URI 指定的资源支持的方法,用来跨域请求(cors)。
HTTP状态码
一般http的响应状态码分为五类:
- 1XX Informational(信息性状态码) 接收的请求正在处理
- 2XX Success(成功状态码) 请求正常处理完毕
- 3XX Redirection(重定向状态码) 需要进行附加操作以完成请求
- 4XX Client Error(客户端错误状态码) 服务器无法处理请求
- 5XX Server Error(服务器错误状态码) 服务器处理请求出错
常见的状态码一般有以下几种:
| 200 | 请求成功 |
|---|---|
| 204 | 请求成功,无数据返回 |
| 206 | 客户端进行了范围请求,服务器成功响应的 GET 请求 |
| 301 | 永久重定向,会根据Location首部重定向 |
| 302 | 临时重定向,会根据Location首部重定向 |
| 304 | 与协商缓存相关,会根据协商标识去对比缓存 |
| 400 | 客户端语法出现错误,不被服务器解析识别 |
| 401 | 需要有通过 HTTP 认证(BASIC 认证、 DIGEST 认证)的认证信息 |
| 404 | 地址不存在,无法在服务器上找到请求的资源 |
| 500 | 服务器出现错误 |
总结
以上就是个人读完《《图解http》》以及网上到处查询资料的总结,有好多内容是没有写出来。