HTTP协议相关知识点小结

HTTP协议相关知识点小结

前言

有些图片直接从网上拿来的,如有侵权,请联系我删除。

概述

HTTP协议,即HyperText Transfer Protocol,译作超文本传输协议,“超文本”,即包括文本、声音和图像等任何可以从互联网上得到的信息。它是基于TCP/IP协议的应用层协议。

作用

定义了客户端(请求资源的一端)和服务器(提供资源响应的一端)之间的通信规则。

特点

  • 无状态:不保存之前发送过的请求或响应和状态信息

  • 无连接:浏览器每次请求都需要建立TCP连接

  • 传输可靠性高

    因为它采用TCP作为传输层协议,而TCP是一种面向连接的可靠传输协议。

HTTP报文

用于HTTP协议交互的信息称为HTTP报文,HTTP报文是由多行数据构成的字符串文本。

请求端(客户端)的HTTP报文称为请求报文;响应端(服务器端)的报文称为响应报文。

请求报文

请求报文由请求行请求头请求体三部分组成。请求报文和响应报文的请求行和请求体类似

HTTP协议相关知识点小结

一个具体的请求报文

HTTP协议相关知识点小结

请求行

上面请求报文的第一行就是请求行,它的作用是用来区分是请求报文还是响应报文。

请求行由请求方法URL/请求路径HTTP协议版本组成,中间有一个空格隔开,HTTP协议及版本之后是回车和换行符。

请求方法

请求方法就是怼所请求的对象进行的操作,常用的有GETPOST

HTTP协议相关知识点小结

GET、PSOT方法的区别

主要有下面几个方面

  • 作用

    GET:从服务器请求数据

    POST:向服务器提交数据

  • 传递参数的长度和类型

    GET:由于URL的长度有限,为2048个字符,而GET请求的参数负载URL后,所以它的长度受限;参数只允许是ASCII字符

    POST:没有长度限制;参数可以是任何类型。

  • 安全性

    GET:安全性较差,因为它的参数直接附在URL之后,是公开可见的。

    POST:安全性较高,请求参数封装在HTTP请求数据中,浏览器不可见、无缓存。

  • 使用场景

    GET:少量、数据不敏感

    POST:大量、数据敏感,比如上传文件。

请求头

也叫首部字段。

  • 作用:传递额外的重要信息。

  • 请求头结构:

    首部字段:字段值 两者之间用冒号隔开

浏览器中一个请求报文的请求头:

HTTP协议相关知识点小结

常见首部字段

  • 请求和响应报文通用的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协议的版本,如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 服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。

响应头

响应头(响应首部字段)是由服务器端向客户端返回响应报文中所使用的字段,用于补充响应的附加信息、服务器信息,以及对客户端的附加要求等信息。

浏览器中一个响应头:

HTTP协议相关知识点小结

常见相应头:

名称 说明
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各版本特性及区别

HTTP协议——学习总结

计算机网络基础:这是一份详细 HTTP 学习指南

《图解HTTP》