HTTP协议相关知识点小结
HTTP协议相关知识点小结
前言
有些图片直接从网上拿来的,如有侵权,请联系我删除。
概述
HTTP协议,即HyperText Transfer Protocol,译作超文本传输协议,“超文本”,即包括文本、声音和图像等任何可以从互联网上得到的信息。它是基于TCP/IP协议的应用层
协议。
作用
定义了客户端(请求资源的一端)和服务器(提供资源响应的一端)之间的通信规则。
特点
-
无状态:不保存之前发送过的请求或响应和状态信息
-
无连接:浏览器每次请求都需要建立TCP连接
-
传输可靠性高
因为它采用TCP作为传输层协议,而TCP是一种面向连接的可靠传输协议。
HTTP报文
用于HTTP协议交互的信息称为HTTP报文,HTTP报文是由多行数据构成的字符串文本。
请求端(客户端)的HTTP报文称为请求报文;响应端(服务器端)的报文称为响应报文。
请求报文
请求报文由请求行
、请求头
和请求体
三部分组成。请求报文和响应报文的请求行和请求体类似
一个具体的请求报文:
请求行
上面请求报文的第一行就是请求行,它的作用是用来区分是请求报文还是响应报文。
请求行由请求方法、URL/请求路径和HTTP协议版本组成,中间有一个空格隔开,HTTP协议及版本之后是回车和换行符。
请求方法
请求方法就是怼所请求的对象进行的操作,常用的有GET、POST等
GET、PSOT方法的区别
主要有下面几个方面
-
作用
GET:从服务器请求数据
POST:向服务器提交数据
-
传递参数的长度和类型
GET:由于URL的长度有限,为2048个字符,而GET请求的参数负载URL后,所以它的长度受限;参数只允许是ASCII字符
POST:没有长度限制;参数可以是任何类型。
-
安全性
GET:安全性较差,因为它的参数直接附在URL之后,是公开可见的。
POST:安全性较高,请求参数封装在HTTP请求数据中,浏览器不可见、无缓存。
-
使用场景
GET:少量、数据不敏感
POST:大量、数据敏感,比如上传文件。
请求头
也叫首部字段。
-
作用:传递额外的重要信息。
-
请求头结构:
首部字段:字段值 两者之间用冒号隔开
浏览器中一个请求报文的请求头:
常见首部字段
-
请求和响应报文通用的Header:
Content-Type:请求体/响应体的类型
Accept:用户代理可处理的媒体类型
Content-Length:请求体/响应体的长度,以字节为单位
Content-Encoding:请求体/响应体的编码格式
-
请求Header
Range:实体的字节请求范围,是断点续传实现的基础。在HTTP1.1中出现。
Authorization:Web认证信息
User-Agent:用于标识客户端操作系统和浏览器的类型和版本信息
Host:请求资源所在的服务器地址
Referer:请求引用自哪个地址,例如从A页面跳转到B页面,Referer就是A页面的地址
Cookie:返回客户端已有的Cookie,Cookie用来记录用户信息
请求体
发送给服务器的数据信息,GET请求没有请求体。请求报文的请求体通常不会使用。
响应报文
HTTP的响应报文由状态行、响应头和响应体组成。
状态行
由协议版本
、状态码
和状态信息
组成,三者之间由空格隔开,最后是回车和换行符。
协议版本
指明了服务器HTTP协议的版本,如HTTP/1.0、HTTP/1.1、HTTP/2.0
HTTP协议各版本小结
HTTP协议从开始到现在共有四个版本:0.9–> 1.0–> 1.1–> 2.0
HTTP 0.9
HTTP最早期的版本
特点:
- 只支持GET这一种请求方式
- 没有请求头的概念
- 无连接:服务端在响应客户端的请求后会立即关闭TCP连接,每次请求都需要再建立TCP连接
- 无状态:数据传输过程中不会记录发送过的请求或响应和状态等信息
HTTP 1.0
新特性:
- 增加了多种请求方式,GET、POST、HEAD。
- 增加了请求头和响应头,对请求和响应的元信息进行了扩展(增加了状态码、缓存、内容编码等字段)
- 传输的内容格式进行了扩充,图片、音视频资源、二进制等都可以进行传输
HTTP 1.1
新特性:
- 引入持久连接(长连接):新增Connection字段,可将它的值设为keep-alive保持TCP连接不断开,HTTP 1.1默认开启长连接。
- 出现了管线化技术:可以同时并行发送多个请求,不需要一个一个地等待服务器响应,但响应的顺序还是按照请求的顺序返回。管线化机制基于长连接。
- 引入了更加多的请求方法:OPTIONS,PUT, DELETE, TRACE, CONNECT方法。
- 缓存处理:新增字段cache-control
- 请求头新增Host字段,用于指定主机名
- 断点传输:请求头新增Range字段,可以实现断点传输。
HTTP 2.0
新特性:
- 二进制分帧:HTTP 2之后将所有传输的信息分割为更小的消息和帧,并对它们采用二进制格式的编码,提高传输效率。其中HTTP 1.x的Headers信息会被封装到Headers帧,而请求体则封装到Data帧
- 多路复用:即在共享TCP连接的基础上同时发送请求和响应,这个TCP连接可以承载任意数量的双向数据流。每个数据流以消息的形式发送,而消息由一或多个帧组成,这些帧可以乱序发送,然后服务端再根据每个帧首部的流标识符重新组装。
- 头部压缩:由于 HTTP 是无状态的,每一个请求都需要请求头标识这次请求相关信息,所以会造成传输很多重复的信息,头部压缩就是为了减少头部信息传输占用的资源。
- 服务器推送:服务器可以额外的向客户端推送资源,而不需要客户端请求
状态码
HTTP的状态码用于表示客户端HTTP请求的返回结果,标记服务器端的处理是否正常,通知出现的错误等。
状态码由三个数字组成,第一位指明了相应类别。相应类别有下面5种:
类别 | 说明 | |
---|---|---|
1XX | 信息状态码 | 表示接收的请求正在处理 |
2XX | 成功状态码 | 表示请求正常处理完毕 |
3XX | 重定向状态码 | 需要进行附加操作以完成请求 |
4XX | 客户端错误状态码 | 服务器无法处理客户端的请求 |
5XX | 服务器错误状态码 | 服务器处理请求出错 |
常见状态码
状态码 | 状态信息 | 说明 |
---|---|---|
200 | OK | 客户端的请求在服务器端正常处理 |
204 | No Content | 服务器接收的请求成功处理,但返回的响应报文不含实体的主体部分 |
206 | Partial Content | 客户端进行了范围请求,而服务器成功执行了这部分GET请求 |
301 | Moved Permanently | 永久重定向。表示请求的资源已经被分配了新的URI,并且以后使用这个资源新的URI。 |
302 | Found | 临时性重定向。表示请求的资源已经被分配了新的URI,希望用户(本次)使用这个资源新的URI。 |
303 | See Other | 和302类似,但303指明了客户端应使用GET方法获取资源 |
304 | Not Modified | 客户端有缓存时发送的请求,服务端允许请求访问资源,但未满足条件的情况 |
400 | Bad Request | 表示请求报文中存在语法错误 |
401 | Unauthorized | 发送的请求需要有通过HTTP认证的认证信息。如果已经进行过一次请求,则表示用户认证失败。含有401的响应必须包含www-Authenticate报头域 |
403 | Forbidden | 请求资源的访问被服务器拒绝了 |
404 | Not Found | 服务器无法找到请求的资源 |
500 | Internal Server Error | 服务器端在执行请求时发生了错误 |
503 | Service Unavailable | 服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。 |
响应头
响应头(响应首部字段)是由服务器端向客户端返回响应报文中所使用的字段,用于补充响应的附加信息、服务器信息,以及对客户端的附加要求等信息。
浏览器中一个响应头:
常见相应头:
名称 | 说明 |
---|---|
Date | 服务器的日期 |
Accept-Ranges | 用来告知客户端:服务器是否能处理范围请求。 |
Server | 后台服务器 |
Location | 重新定向到另一个URL |
Last-Modified | 该资源最后的修改时间 |
以下是请求和响应报文通用的Headers: | |
Content-Type | 请求体/响应体的类型 |
Accept | 用户代理可处理的媒体类型 |
Content-Length | 请求体/响应体的长度,以字节为单位 |
Content-Encoding | 请求体/响应体的编码格式 |
Connection | 连接的状况,是长连接还是 |
缓存的控制 |
响应体
也称实体首部字段,是包含在请求报文和响应报文中的实体部分所使用的首部
常见实体首部字段:
名称 | 说明 |
---|---|
Allow | 包含了服务器支持的所以HTTP请求方法 |
Content-Encoding | 服务器对实体的主体部分的编码格式,如gzip等 |
Content-Language | 指明实体主体使用的语言 |
Content-Length | 实体主体部分的大小,以字节为单位 |
Content-Type | 实体主体的类型 |
实体主体的范围,一般用于请求部分资源 |
Cookie、Session和token
Cookie
由于HTTP协议是无状态的,而有时我们需要保存用户的状态,例如:保存用户登陆状态、保存用户当前购物车中的信息,于是引入了Cookie技术。
Cookie是服务器发送给客户端的一小段信息,客户端请求时可以读取该信息发送到服务器端,进而进行用户的识别。对于客户端的每次请求,服务器都会将 Cookie 发送到客户端,在客户端可以进行保存,以便下次使用。
客户端可以采用两种方式来保存这个Cookie对象:保存在客户端内存中,称为临时Cookie;保存在客户端磁盘中,称为永久Cookie。
Cookie可以被客户端禁用。
Session
Session是一种服务器端的机制,用来在服务端存储用户和服务器会话的一些信息(比如判断用户是否登陆和实现购物车相关的功能等)。
每一个用户都有一个不同的 session,各个用户之间是不能共享的,是每个用户所独享的,在 session 中可以存放信息。
在服务器端会创建一个 session 对象,产生一个 sessionID 来标识这个 session 对象,然后将这个 sessionID 放入到 Cookie 中发送到客户端,下一次访问时,sessionID 会发送到服务器,在服务器端进行识别不同的用户。
token
token译为“令牌”,是服务端生成的一串字符串,作为客户端进行请求的一个标识,它最大的特点就是随机性,不可预测。
作用:
-
防止CSRF(跨站点请求伪造)攻击
CSRF,顾名思义,是伪造请求,冒充用户在站内的正常操作。
当客户端请求页面时,服务器会生成一个随机数Token,并且将Token放置到session当中,然后将Token发给客户端。下次客户端提交请求时,Token会随着表单一起提交到服务器端。
后面请求时,服务器端会对Token值进行验证,判断是否和session中的Token值相等。若相等,则可以证明请求有效,不是伪造的。
-
防止表单重复提交
服务器端第一次验证相同过后,会将session中的Token值更新,若用户重复提交,第二次的验证判断将失败,因为用户提交的表单中的Token没变,但服务器端session中Token已经改变了。
参考资料
《图解HTTP》