一. HTTP概念
1. HTTP是什么
-
HTTP
即超文本传输协议(HyperText Transfer Protocol),是网络中使用最广泛的一种网络协议。 -
HTTP
是一种“客户端—服务端”的协议,可以理解成端到端的协议。 -
最初的
http
协议是为了提供一种发布和接收HTML页面的方法。发展历史:版本 HTTP/0.9 1991年制定,有严重缺陷,只支持GET方法,不支持MIME类型 HTTP/1.0 1996年制定,支持多种请求方法,支持多媒体对象,广泛应用 HTTP/1.0+ 支持持久连接、虚拟主机、代理链接等,成为非官方的实际标准 HTTP/1.1 1999年制定,修正HTTP中的设计缺陷,优化性能,去除糟粕 HTTP/2.0 (或HTTP-NG) 大幅度的提升了 web 性能,进一步减少网络延迟。HTTP 2.0只用于https://网址 -
HTTP请求与响应消息:
- 游览器(也就是客户端)发出的消息叫做请求(requests)
- 服务器回应的消息叫响应(responses)
-
HTTP基本原理:
HTTP是一种可扩展的协议,是应用层的协议,通过TCP或TLS加密的TCP连接来发送,理论来说任何可靠传输都能使用。HTTP可以根据网页需求,获取部分WEB文档内容更新网页。
2. 基于HTTP的组件系统
-
请求会通过一个实体(用户代理)发送。大多数情况用户代理是浏览器。
- 每一个发到服务器的请求都会被服务器处理并返回一个消息,也就是响应。在请求和响应之间有很多称为Proxy的实体,它们的作用和表现都不一样。
- 客户端发送消息和服务端接收消息都是通过各自的代理接收的。
-
客户端:
user-agent: 是任何能够为用户发起行为的工具。通常是游览器,也有特殊情况如web调试应用程序
- 游览器经常作为一个发送请求的实体,但有些机制可以模拟由服务器发起的请求信息。如NodeJS
游览器是如何加载页面:
- 游览器首先向指定的服务器发送请求获取页面的HTML文档。
- 然后解析HTML文档中的资源信息发送其他请求,来获取可执行脚本或CSS样式进行页面渲染。包括(图片和视频)
- 最后游览器将这些资源整合到一起,就是完整的网页
-
服务端:
Web服务器响应客户端的请求,如提供所请求的文档。
- 一个服务器上可以装载多个服务
服务器只是虚拟意义上代表的一个机器:
- 它可以是共享负载(负载均衡)的一组服务器组成的计算机集群
- 也可以是一种复杂的软件,通过向其他计算机(如缓存,数据库服务器等)发送请求来获取部分或全部资源。
-
代理(Proxies)
代理可以是很多概念,对于前段来说客户端的代理就是游览器
- 代理既可以表现的透明,又可以不透明(‘改变请求’会通过它们)。
- 代理的作用:
- 缓存(可以是公开的也可以私有,像游览器的缓存)
- 过虑(像反病毒扫描,家长控制)
- 负载均衡(让多个服务器服务不同的请求)
- 认证(对不同的资源进行权限管理)
- 日志记录(允许储存历史信息)
3. HTTP的相关概念
-
HTTP的基本特性
HTTP是简单的:http大体上被设计的简单易读,http报文能够被人读懂,还允许简单测试,降低了门槛
HTTP是可扩展的:http/1.0中的HTTP headers让协议扩展变得非常容易
HTTP是无状态,有会话的:在同一个连接中,两个执行成功的请求之间没有关系。这样有个问题,用户不能在同一个网站中进行连续交互
HTTP和链接:连接是由传输层来控制,这从根本上不属于HTTP的范围
-
HTTP能控制什么
- 缓存
- 开发同源限制(跨域问题)
- 认证:基本认证功能可以直接通过HTTP提供,或用HTTP Cookies来设置指定会话
- 代理和隧道:通常服务器或客户端是内网的,对外网隐藏真实IP地址。因此HTTP请求要通过代理越过这个网络屏障
- 会话
-
HTTP流
- 打开一个TCP连接:TCP连接被用来发送一条或多条请求,以接受回应消息
- 发送一个HTTP报文: HTTP报文(在HTTP/2.0之前)是可读的
- 读取服务器端返回的报文消息
- 关闭连接或为后续请求重新连接
二. HTTP消息
1. HTTP消息是什么
-
HTTP报文(HTTP消息):是服务器和客户端直接交换数据的方式。
有两种类型的消息
- 请求:客户端发送来触发服务器上的一个动作
- 响应:来自服务器的应答
-
HTTP消息由采用ASCII编码的多行文本构成。
- HTTP/1.1和之前版本中,消息通过连接公开发送
- HTTP/2.0中为了优化和性能改进,消息被分到多个HTTP帧中
-
HTTP请求报文和响应报文
-
请求报文的组成
请求方式(method)—资源路径(Path)—协议版本号(Version of the protocol)—请求头部信息(header)
-
响应报文的组成
协议版本号(Version of the protocol)—状态码(Status code)—状态信息(Status message)—响应头部信息(header)
-
2. HTTP消息的基本结构
-
HTTP请求和响应消息有相似的结构,如下:
- 起始行(start line): 描述要执行的请求,或状态。起始行总是单行的
- HTTP头(头部信息)(HTTP headers): 指明请求或描述消息正文
- 空行(empty line): 表示所有关于请求的数据发送完毕
- 正文(body): 可选的包含请求相关数据的正文,或相应相关的文档。正文大小由起始行的HTTP头决定
- 起始行和HTTP头统称为"请求头"
- 空行和正文统称为“消息正文”
3. 起始行
-
起始行(start line)包含三个元素
- 请求方法:描述要执行的动作
- 请求地址:通常是URL,或是协议、端口和域名的绝对路径
- HTTP版本:定义了剩余报文的结构,作为对期望的响应版本的指示符
-
HTTP协议中的请求方法
请求方法 描述 GET 请求一个指定资源的表示形式。应只用于获取数据 HEAD 请求一个与GET请求的响应相同的响应,但没有响应体。 POST 用于将尸体提交到指定的资源,通常导致状态或服务器上的副作用的更改。 PUT 用于请求有效载荷替换目标资源的所有当前表示 DELETE 用于删除指定的资源 CONNECT 建立一个到目标资源标识的服务器的隧道 OPTION 用于描述目标资源的通信选项 TRACE 沿着到目标资源的路径执行一个信息环回测试 PATCH 用于对资源应用部分修改 - 最常用的请求是GET和POST
- 常见的请求方法至少有七种,请求方法不止七种
4. 请求头与请求主体
-
请求头:可以让客户端向服务器端传递附加信息
组成:
- 请求头名(不区分大小写)----冒号(:)----具体的值(不带换行符)
- 值如果有多个,之间用逗号(,)分隔
根据不同上下文,请求头可分为:
- 通用头: 同时适用于请求和响应消息,但与最终消息主体中传输的数据无关的信息头
- 请求头: 包含更多关于获取的资源和客户端本身的信息
- 实体头: 包含有关实体主体的更多信息,如主体长(Content-Length)度或其MIME类型。
消息头 描述 Accept 显示服务器端接收数据类型 Accept-Encoding 接收编码格式 Accept-Language 接收的语言 Connection 链接方式 Cookie 缓存 Host 当前客户端所在地址 Referer 发送当前的地址 User-Agent 发送当前客户端信息 - 请求头名(不区分大小写)----冒号(:)----具体的值(不带换行符)
-
请求主体: 请求消息的最后一部分是请求主体,也就是发送给服务器端的内容
- 不是所有的请求都要请求主体,获取资源的请求如GET、HEAD、DELETE、OPTIONS通常不要请求主体
- 有的请求将数据发送到服务器以便更新数据,如POST请求
- 请求主体大致分两类
- 单一资源主体: 由一个单文件组成。该类型请求主体由两个header定义: Content-Type和Content-Length
- 多资源主体: 由多部分请求主体组成,每一部分包含不同的信息位。通常和HTML表单联系在一起
5. 状态行与状态码
HTTP响应消息的起始行叫做状态行(status line),包含信息:
- 协议版本:通常为HTTP/1.1
- 状态码:表明请求是成功或失败。常见状态码200,404或302
- 状态文本:一个简短的,纯粹的信息。通过状态码的文本描述,帮人们理解该HTTP消息
-
状态码:
-
信息响应
状态码 描述 100 Continue 该状态码表明到此为止所有内容都是可行的,客户端应继续请求,如果已完成则忽略 101 Switching Protocol 该代码是响应客户端的Upgrade标头发送的,并指示服务器也正切换的协议 102 Processing 该代码表示服务器已收到并正在处理该请求,但没有响应可用 -
成功响应
状态码 描述 200 OK 请求成功 201 Created 该请求已成功,并创建了一个新资源.通常是PUT请求之后发送的响应 202 Accepted 请求已收到,但还未响应,没有结束 203 服务器已成功处理了请求,但返回的实体头部元信息不是在初始服务器上有效的确定集合,而是自本地或第三方的拷贝 204 No Content 服务器成功处理了请求,但不需要返回任何实体内容,并且希望返回更新了的源信息 205 Reset Content 服务器成功处理了请求,且没有返回任何内容。该响应主要是被用于接收用户输入后,立即重置表单 206 Partial Content 服务器已经成功处理了部分GET请求 -
重定向
状态码 描述 300 Multiple Choice 被请求的资源有一系列可供选择的回馈消息 301 Moved Permanently 被请求的资源已永久移动到新位置 302 Found 请求的资源现在临时从不同的URL响应请求 303 See Other 对应当前请求的响应可以在另一个URL上被找到,而且客户端应当采用GET的方式访问那个资源 304 Not Modified 如果客户端发送了一个带条件的GET请求且该请求已被允许,而文档的内容(自上次访问以来或根据请求的条件) 并没有改变 -
客户端响应
状态码 描述 400 Bad Request 语义有误,当前请求无法被服务器理解 401Unauthorized 当前请求需要用户验证 403 Forbidden 服务器已经理解请求,但是拒绝执行 404 Not Found 请求失败,请求所希望得到的资源未被在服务器上发现 405 Method Not Allowed 请求行中指定的请求方法不能被用于请求相应的资源 -
服务器端响应
状态码 描述 500 Internal Server Error 服务器遇到了内部错误 501 Not Implement 此请求方法不被服务器支持且无法被处理 502 Bad Gateway 此错误响应表明服务器作为网关需要得到一个处理这个请求的响应 503 Service Unavailable 服务器没有准备好处理请求 504 Gateway Timeout 当服务器作为网关,不能及时得到响应时返回此错误代码 505 HTTP Version Not Supported 服务器不支持请求中所使用的HTTP协议版本
-
6. 响应头与响应主体
-
响应头:允许服务器向客户端传递附加信息
组成和请求头一致:
- 请求头名(不区分大小写)----冒号(:)----具体的值(不带换行符)
- 值如果有多个,之间用逗号(,)分隔
根据不同上下文,请求头可分为:
- 通用头: 同时适用于请求和响应消息,但与最终消息主体中传输的数据无关的信息头
- 响应头: 包含有关响应的补充信息,如其位置或服务器本身的消息头
- 实体头: 包含有关实体主体的更多信息,如主体长(Content-Length)度或其MIME类型。
消息头 描述 cache-control 控制缓存 content-length 响应主体的大小 content-type 响应主体的MIME类型 date 当前日期 last-modified 最后的修改日期 server 服务器信息 x-开头的 自定义响应头 - 请求头名(不区分大小写)----冒号(:)----具体的值(不带换行符)
-
响应主体:响应的最后一部分是响应主体。有的响应不需要主体(如201或204)
分为两类:
- 单一资源主体:
- 由已知长度的单个文件组成。通过两个header定义:Content-type和Content-Length
- 由未知长度的单个文件组成。通过将Transfer-Encoding设置为chunked来使用chunks编码
- 多资源主体:由多部分响应主体组成,每部分包含不同的信息段。但这是比较少见的
- 单一资源主体:
7. MIME类型
MIME类型全称为Multipurpose Internet Mail Extensions,被译为多用途Internet邮件扩展类型,是一种标准化的方式来表示文档的性质和格式
- 游览器通常使用MIME类型来确定如何处理文档
- 服务器把正确的MIME类型附加到响应对象的头部是非常重要的
类型 | 描述 | 示例 |
---|---|---|
text | 表明文件是普通文本 | text/plain,text/html,text/css |
image | 表明是某种图像 | image/gif,image/png,image/jpeg |
audio | 表明是某种音频文件 | audio/midi,audio/mpeg,audio/wav |
video | 表明是某种视频文件 | video/webm,video/ogg |
application | 表明是某种二进制数据 | application/json,application/xml,application/pdf |
8. HTTP1.x缺点
- HTTP/1.x报文有一些性能上的缺点:
- 消息头不像消息主体一样会被压缩
- 两个报文之间的header通常非常相似,但他们仍然在连接中重复传输。
- 无法复用。