前言
开始复习计算机网络这一块,web端常用的协议就是应用层的http协议了,因此对http协议的掌握也是非常重要的。
概述
- 超文本传输协议,基于tcp/ip通信协议传输数据
- 为web浏览器与服务器之间的通信而设计的
特点
- 无连接
- 每次连接只处理一个请求
- 服务器处理完客户请求,收到客户应答后便断开连接
- 节省传输时间
- 媒体独立
- 任何类型的数据都可以通过HTTP发送,使用Content-Type表示资源媒体类型
- 无状态
- 对事务处理没有记忆能力
请求方法
- HTTP1.0:
GET
,POST
,HEAD
- HTTP1.1:
OPTIONS
,PUT
,PATCH
,DELETE
,TRACE
,CONNECT
- *GET:
- 请求获取Request-URI所标识的资源。
- 浏览器对URL的长度有限制,一般不超过4k。
- HTTP规范规定用于获取信息,是安全和幂等的
- *POST:
- 提交表单或上传文件
- 一般会导致资源的修改,幂不等
- HEAD:用于获取报头
- PUT:从客户端向服务器传送的数据取代指定的文档的内容
- DELETE: 请求服务器删除指定的资源
- CONNECT: 可以开启一个客户端与所请求资源之间的双向沟通的通道,它可以用来创建隧道tunnel
- OPTIONS: 用于获取目的资源所支持的通信选项
- TRACE: 实现沿通向目标资源的路径的消息环回loop-back测试 ,提供了一种实用的debug 机制
- PATCH: 是对PUT方法的补充,用来对已知资源进行局部更新
请求头
(请求头种类实在是太多了,而且header是可以自定义的,所以我只在此列举一些常见的)
- Accept:指定客户端能够接收的内容类型
- Accept-Charset:浏览器可以接受的字符编码集
- Accept-Encoding: 指定浏览器可以支持的web服务器返回内容压缩编码类型
- Accept-Language: 浏览器可接受的语言
- Connection: 表示是否需要持久连接
- Host: 指定请求的服务器的域名和端口号
响应头
- Access-Control-Allow-Origin: 跨域设置
- Content-Type: 返回内容的MIME类型
- Date:原始服务器消息发出的时间
- Keep-Alive: 表明希望 WEB 服务器保持连接多长时间(秒)
- Transfer-Encoding: WEB 服务器表明自己对本响应消息体(不是消息体里面的对象)作了怎样的编码,比如是否分块(chunked)。例如:Transfer-Encoding: chunked
- Vary: 告诉下游代理是使用缓存响应还是从原始服务器请求
状态码
- 1xx: 信息,服务器收到请求,需要请求者继续执行操作。
- 100: 继续,客户端应继续其请求
- 101: 切换协议
- 2xx:成功,操作被成功接收处理
- 3xx:重定向,需要进一步的操作以完成请求
- 4xx:客户端错误,请求包含语法错误或无法完成请求
- 5xx:服务器错误,服务器在处理请求的过程中发生了错误。
HTTP发展版本
HTTP0.9
- 只有一个请求行,没有HTTP请求头和请求体
- 服务器没有返回头,只返回数据信息
- 使用ASCLL字符流传输
HTTP1.0
- 加入了请求头,响应头,状态码,缓存机制,content-type头等
- 在HTTP发送请求时,会带上请求头信息,服务器返回数据时,则会先返回响应头信息。
- 协议版本信息会随着每个请求发送
- 请求头:在发起请求的时候会通过HTTP请求头告诉服务器它期待服务器返回什么类型的文件,采取什么形式的压缩,提供什么语言的文件以及文件的具体编码。
- 响应头:服务器以请求头中信息准备数据,并以响应头的信息告诉客户端数据采用何种格式返回,若遇到不支持的格式,返回服务器支持的格式,并在响应头中体现,也就是说最终浏览器是以响应头的信息解析数据。
- 状态码:在响应开始时发送,使浏览器能了解请求执行成功或失败,并响应调整行为。
- 缓存机制:通过状态码与
If-Modified-Since
,Expires
等控制更新或使用本地缓存。 - Content-Type:使HTTP能够传输除纯文本HTML文件以外其它类型文档的能力。
HTTP1.1
- 目前主流使用的http协议版本
- 标准化并消除了大量歧义内容引入了多项改进
- 缓存机制:引入更多缓存控制策略,如
Entity tag
、If-Unmodified-Since
、If-Match
、If-None-Match
等更多可供选择的缓存头来控制缓存策略。 - 带宽优化: 请求头中引入了
range
,它允许只请求资源的某一个部分,返回206状态码,方便开发者自由选择以便充分利用带宽和链接,使用Range
和'Content-Range'制作断点续传功能。 - 增加了24个错误状态吗。
- 增加Host请求头,使不同域名配置在同一个IP地址的服务器上。
- 长连接:在一个TCP连接上可以传输多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟,使用'Connection'头控制是否开启,关闭则将其值设为'close',默认开启
- 管线化技术:允许在第一个应答被完全发送之前就发送第二个请求,改善队头阻塞问题,但响应的顺序还是会按照请求的顺序返回。
- 响应分块:头设置为
Transfer-Encoding: chunked
表示进行分块响应,允许响应的数据分为多个部分,配合服务端尽早释放缓冲获得更快的响应速度。
HTTP2.0
- 二进制分帧:将所有传输的信息分割为更小的消息和帧,并对它们采用二进制格式的编码。
- 多路复用:并行的请求能在同一个链接中处理,在同一域名下所有访问都是从同一个TCP连接中走,HTTP消息被分解为独立的帧,服务端根据标识符和首部将消息重新组装起来,移除了HTTP1.1中顺序和阻塞的约束。
- 压缩header,移除了重复和传输重复数据的成本。
- 服务端推送:服务器可以主动向客户端推送资源,无需客户端明确请求。
HTTP3.0
- 尚在制定和测试阶段
- 将会是一个全新的协议,而不是2.0的拓展
- 运行在QUIC协议之上
- QUIC: 谷歌制定的UDP的低延迟的互联网传输层协议,很好的解决了当今运输层和应用层面临的各种需求,包括处理更多的连接,安全性和低延迟,也融合了包括TCP,TLS,HTTP/2等协议的特性。