第一节 HTTP协议基础

亮子 2021-06-07 02:20:03 17348 0 0 0

1、HTTP历史

在1990年,HTTP就成为WWW的支撑协议。当时由其创始人WWW之父蒂姆·贝纳斯·李(TimBemers—Lee)提出,随后WWW联盟(WWW Consortium)成立,组织了IETF(Internet Engineering Task Force)小组进一步完善和发布HTTP协议。

HTTP 的全称是 HyperText Transfer Protocol (超文本传输协议)的缩写,是一种建立在 TCP 上的无状态连接。HTTP 是互联网的基础协议,用于客户端与服务器之间的通信,它规定了客户端和服务器之间的通信格式,包括请求与响应的格式。

基本的工作流程是客户端发送一个 HTTP 请求,服务端收到请求开始处理,处理结束返回给客户端结果,客户端对结果进行处理并展示。**现在最流行的 HTTP 版本还是 1997 年发布的 HTTP/1.1。**

2、HTTP版本

1)、0.9版本

0.9协议是适用于各种数据信息的简洁快速协议,但是远不能满足日益发展的各种应用的需要。0.9协议就是一个交换信息的无序协议,仅仅限于文字。由于无法进行内容的协商,在双发的握手和协议中,并有规定双发的内容是什么,也就是图片是无法显示和处理的。**只有一个GET命令,服务发送发送完就关闭连接。**

2)、1.0版本

到了1.0协议阶段,也就是在1982年,TimBerners-Lee提出了HTTP/1.0。在此后的不断丰富和发展中,HTTP/1.0成为最重要的面向事务的应用层协议。1996年5月,HTTP/1.0 版本发布。该协议对每一次请求/响应建立并拆除一次连接。其特点是简单、易于管理,所以它符合了大家的需要,得到了广泛的应用。**增加了status code 和header。增加了字符集支持、多部份发送、权限、缓存等等。**

3)、1.1版本

在1.0协议中,双方规定了连接方式和连接类型,这已经极大扩展了HTTP的领域,但对于互联网最重要的速度和效率,并没有太多的考虑。毕竟,作为协议的制定者,当时也没有想到HTTP协议会有那么快的普及速度。

HTTP/1.1于1999年诞生。相比较于HTTP/1.0来说,最主要的改进就是引入了持久连接。所谓的持久连接即TCP连接默认不关闭,可以被多个请求复用。**增加了持久连接keep-alive,增加host和其他一些命令。**

4)、2.0版本

HTTP/2 是 HTTP 协议自 1999 年 HTTP 1.1 发布后的首个更新,主要基于 SPDY 协议。

HTTP/2 为了解决HTTP/1.1中仍然存在的效率问题,HTTP/2 采用了**多路复用**。即在一个连接里,客户端和浏览器都可以同时发送多个请求或回应,而且不用按照顺序一一对应。能这样做有一个前提,就是HTTP/2进行了**二进制分帧**,即 HTTP/2 会将所有传输的信息分割为更小的消息和帧(frame),并对它们采用二进制格式的编码。

图片alt

5)、3.0版本

HTTP/3使用UDP代替了TCP,UDP是一个非连接的协议,传输数据之前源端和终端**不建立连接**。 UDP信息包的标题很**短**,对系统资源的要求比TCP要低。并且UDP是使用最大努力交付,即**不保证可靠交付**。

3、HTTP常识

1)、默认端口

HTTP 默认端口80

HTTPS默认端口443

2)、底层协议

HTTP是一个简单的请求-响应协议,它通常运行在TCP之上。HTTP 的全称是 HyperText Transfer Protocol (超文本传输协议)的缩写,是一种建立在 TCP 上的无状态连接。

图片alt

3)、URL的组成

图片alt

由协议、分隔符、域名、路径组成,这里面省略了端口号,如果不省略的话,应该是如下格式:

**http://www.host.com:80/getUser/1**

4)、HTTP报文结构

(1)请求报文

图片alt

(2)响应报文

图片alt

5)、HTTP的请求方法

图片alt

(1)GET

GET 请求指定的页面信息,并返回实体主体。

(2)POST

POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。

(3)HEAD

HEAD 类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头

(4)PUT

PUT 从客户端向服务器传送的数据取代指定的文档的内容。

(5)DELETE

DELETE 请求服务器删除指定的页面。

(6)CONNECT

HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。

(7)OPTIONS

OPTIONS 允许客户端查看服务器的性能。

(8)TRACE

TRACE 回显服务器收到的请求,主要用于测试或诊断。

6)、常用状态码

(1)1xx,临时性消息。
- 100 继续发送
- 101 正在切换协议

(2)2XX,一般是请求成功
- 200 正常处理
- 204 成功处理,但服务器没有新数据返回,显示页面不更新
- 206 对服务器进行范围请求,只返回一部分数据

(3)3XX,一般表示重定向
- 301 请求的资源已分配了新的URI中,URL地址改变了。【永久重定向】
- 302 请求的资源临时分配了新的URI中,URL地址没变【转发】
- 303 与302相同的功能,但明确客户端应该采用GET方式来获取资源
- 304 发送了附带请求,但不符合条件【返回未过期的缓存数据】
- 307 与302相同,但不会把POST请求变成GET

(4)4XX,表示客户端出错了。
- 400 请求报文语法错误了
- 401 需要认证身份
- 403 没有权限访问
- 404 服务器没有这个资源

(5)5XX,服务器出错了
- 500 内部资源出错了
- 503 服务器正忙

4、HTTP头部字段

1)、请求报文头部字段

(1)Accept: text/html,image/*

浏览器告诉服务器,它支持的数据类型
(2)Accept-Charset: ISO-8859-1

浏览器告诉服务器,它支持哪种字符集
(3)Accept-Encoding: gzip,compress

浏览器告诉服务器,它支持的压缩格式
(4)Accept-Language: en-us,zh-cn

浏览器告诉服务器,它的语言环境
(5)Host: www.91souyun.com:80

浏览器告诉服务器,它的想访问哪台主机
(6)If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT

浏览器告诉服务器,缓存数据的时间
(7)Referer: http://www.91souyun.com/index.html

浏览器告诉服务器,客户机是从那个页面来的—反盗链
(8)User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)

浏览器告诉服务器,浏览器的内核是什么
(9)Cookie

浏览器告诉服务器,带来的Cookie是什么
(10)Connection: close/Keep-Alive

浏览器告诉服务器,请求完后是断开链接还是保持链接
(11)Date: Tue, 11 Jul 2000 18:23:51 GMT

浏览器告诉服务器,请求的时间

2)、响应报文头部字段

(1)Location: http://www.91souyun.com 【服务器告诉浏览器要跳转到哪个页面】
(2)Server:apache tomcat【服务器告诉浏览器,服务器的型号是什么】
(3)Content-Encoding: gzip 【服务器告诉浏览器数据压缩的格式】
(4)Content-Length: 80 【服务器告诉浏览器回送数据的长度】
(5)Content-Language: zh-cn 【服务器告诉浏览器,服务器的语言环境】
(6)Content-Type: text/html; charset=GB2312 【服务器告诉浏览器,回送数据的类型】
(7)Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT【服务器告诉浏览器该资源上次更新时间】
(9)Refresh: 1;url=http://www.91souyun.com【服务器告诉浏览器要定时刷新】
(10)Content-Disposition: attachment; filename=aaa.zip【服务器告诉浏览器以下载方式打开数据】
(11)Transfer-Encoding: chunked 【服务器告诉浏览器数据以分块方式回送】
(12)Set-Cookie:SS=Q0=5Lb_nQ; path=/search【服务器告诉浏览器要保存Cookie】
(13)Expires: -1【服务器告诉浏览器不要设置缓存】
(14)Cache-Control: no-cache 【服务器告诉浏览器不要设置缓存】
(15)Pragma: no-cache 【服务器告诉浏览器不要设置缓存】
(16)Connection: close/Keep-Alive 【服务器告诉浏览器连接方式】
(17)Date: Tue, 11 Jul 2000 18:23:51 GMT【服务器告诉浏览器回送数据的时间】

3)、重要通用头部字段

(1)Date

提供日期和时间标志,说明报文是在什么时间创建的。

Date: Tue, 12 Feb 2019 07:32:07 GMT

(2)Connection

允许客户端和服务器指定与请求/响应连接有关的选项。

Connection: keep-alive

(3)Transfer-Encoding

告知接收端为了保证报文的可靠传输,对报文采用了什么编码方式。

Transfer-Encoding: chunked

(4)Cache-Control

指定缓存的控制方式。

cache-control: no-store, no-cache, must-revalidate, proxy-revalidate

(5)Via

显示报文经过的中间节点(代理、网关)。

via: cache25.l2ot7-1[0,304-0,H], cache25.l2ot7-1[1,0], cache5.us14[342,200-0,H]

4)、重要请求字段

(1)Host

给出了接收请求的服务器的主机名和端口。(注意:不是在网络上用于寻址的,⽽是在目标服务器上定位子服务器。)

Host: api.github.com

(2)Accept

用来告诉服务端客户端会接受的媒体类型,包括客户端需要什么,可以使用什么,以及不想要什么。

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8'*' 

用来表示通配符。;q= (q-factor weighting)值代表优先顺序,用相对质量价值表示,又称为权重。

(3)Accept-Charset

用来告知服务器,客户端可以处理的字符集类型。

Accept-Charset: utf-8, iso-8859-1;q=0.5

(4)Accept-Encoding

用来将客户端能够理解的内容编码方式告知服务器,服务端会选择一个客户端提议的方式。

Accept-Encoding: gzip, deflate, br

gzip:表示采用 Lempel-Ziv coding (LZ77) 压缩算法,以及32位CRC校验的编码方式。
compress:采用 Lempel-Ziv-Welch (LZW) 压缩算法。
deflate:采用 zlib 结构和 deflate 压缩算法。
br:表示采用 Brotli 算法的编码方式。
identity:用于指代自身(例如:未经过压缩和修改)。除非特别指明,这个标记始终可以被接受。

(5)Accept-Language

用来告诉服务器,客户端能够理解哪些语言

Accept-Language: zh-CN,zh;q=0.9,en;q=0.8

(6)Range

告诉服务器,客户端要获取哪段数据。 主要用于:断点续传、多线程下载。

Range: bytes=200-1000, 2000-6576, 19000-

语法:
Range: =-, -, -
:范围所采用的单位,通常是字节(bytes)。
:一个整数,表示在特定单位下,范围的起始值。
:一个整数,表示在特定单位下,范围的结束值。这个值是可选的,如果不存在,表示此范围一直延伸到文档结束。

5)、重要响应字段

(1)Server

包含了处理请求的源头服务器所用到的软件相关信息

Server: Apache-Coyote/1.1

(2)Set-Cookie

用来由服务器端向客户端发送 cookie。

Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT; Secure; HttpOnly

会话期 cookies 将会在客户端关闭时被移除。
会话期 cookie 不设置 Expires 或 Max-Age 指令
Set-Cookie: sessionid=38afes7a8; HttpOnly; Path=/

持久化 Cookie 不会在客户端关闭时失效,而是在特定的日期(Expires)或者经过一段特定的时间之后(Max-Age)才会失效。

(3)Accept-Ranges

响应中出现,表示服务器支持按字节来取范围数据

Accept-Ranges: bytes

语法:
Accept-Ranges: bytes
Accept-Ranges: none
none:不支持任何范围请求单位,由于其等同于没有返回此头部,因此很少使用。
bytes:范围请求的单位是 bytes (字节)。