为了账号安全,请及时绑定邮箱和手机立即绑定

HTTP 协议

HTTP 协议

HTTP 协议,即超文本传输协议,是客户端或其他应用程序与服务器之间的应用层通信协议。
HTTP 协议规定,请求必须从客户端发出,而服务器响应该请求并返回。

HTTP 协议的格式

*以下默认为 HTTP/1.1 协议格式

请求报文( Request )

第一行被称作请求行( Request Line ),它分为三个部分:请求方法( HTTP Method ),请求路径和 HTTP 版本。

在请求行之后,是请求头( Request Header ),其内容由若干行组成,每行是用冒号分隔的键值对。

在请求头之后,是请求体( Request Body ),其内容一般为空或提交的表单数据。

例子:

//请求行
GET /hello.html HTTP/1.1
//请求头
//这里列举了部分常用的请求头键值对

Accept: */* 
//客户端接受的内容格式,*/* 表示任意类型
Accept-Language: zh-CN 
//客户端接受的语言
Accept-Encoding: gzip, deflate 
//客户端接受的编码类型
Connection: keep-alive 
//管理网络连接,keep-alive 表示客户端希望保持持久连接状态
Cache-Control: no-cache 
//控制可缓存性,no-cache表示强制向源服务器再次验证
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) 
//客户端标识
Host: www.hello.com
//服务器域名
Cookie: ... 
//客户端储存的 Cookie 
//请求体
code=000t&name=Tom

响应报文( Response )

第一行被称作响应行( Response Line ),它分为三个部分:HTTP 版本,状态码和状态文本。

在响应行之后,是响应头( Response Header ),其内容由若干行组成,每行是用冒号分隔的键值对。

在响应头之后,是响应体( Response Body ),其内容可能是图片、视频、文件( HTML、CSS、JS等 )或数据等等。

例子:

//响应行
HTTP/1.1 200 OK
//响应头
//这里列举了部分常用的响应头键值对

Cache-Control: private 
//控制可缓存性,private表示响应内容作为私有缓存
Connection: Keep-Alive 
//管理网络连接,keep-alive 表示服务器端希望保持持久连接状态
Content-Encoding: gzip 
//响应内容的编码类型
Content-Type: text/html 
//响应内容的类型
Date: Fri, 14 Jun 2019 03:56:13 GMT 
//响应内容创建的时间
Expires: Fri, 14 Jun 2019 03:56:13 GMT 
//响应内容过期的时间
Keep-Alive: timeout=5, max=1000 
//保持持久连接需要的信息
//timeout表示保持打开状态的最小时长(单位为秒)
//max表示连接可以发送的请求的最大值
Last-Modified: Mon, 25 Jul 2016 04:32:39 GMT 
//页面上次修改的时间
Server: BWS/1.1  
//服务器软件类型
Set-Cookie: BDSVRTM=72 
//设置Cookie,可以存在多个
//响应体
<html>
......
</html>

请求方法

下面列举了比较常见的 5 种请求方法:

GET

GET 请求会显示请求指定的资源。一般来说 GET 方法应该只用于数据的读取,而不应当用于会产生副作用(1)的非幂等(2)的操作中。

(1)副作用是指当你执行了一次请求后,网站上的资源是没有被修改的,此时就可以称这次请求是没有副作用的,比如说 GET 请求,相对于 POST、DELETE、PUT 则是没有副作用的。
(2)幂等是指同一个请求不管发送多少次,服务器上资源的状态始终是一样的。根据 HTTP 规范,GET 请求是用来查看资源的,而 POST、DELETE、PUT 请求则是在服务器上进行新增、删除、修改资源的。所以,POST、DELETE、PUT 是非幂等的,而 GET 是幂等的。

HEAD

HEAD 方法与 GET 方法一样,都是向服务器发出指定资源的请求。但是,服务器在响应 HEAD 请求时不会返回响应主体。

POST

POST 请求会向指定资源提交数据,请求服务器进行处理,如:表单数据提交、文件上传等。请求数据会被包含在请求体中。

PUT

PUT 请求会在指定资源的位置上更新其最新内容。

DELETE

DELETE 请求用于请求服务器删除所标识的资源。

*HTTP 协议之所以设计出这么多请求方法,其初衷是可以使用不同的方法完成不同的使命,例如 POST、DELETE、PUT 和 GET 分别对应着增、删、改、查。但在实际工作中,除了 GET 和 POST,其他方法我们基本不会使用,或者说一个 POST 就完全可以实现增删改查。这其实反映出 HTTP 请求方法的一个本质问题,也就是说,这些请求方法除了名字不同,其实并没有任何区别。不管你选择使用什么方法,其底层原理都是基于 TCP 连接来实现的。而我们时常说的,GET 和 POST 的区别,大多都是因为浏览器的限制所致,而在底层实现原理上,二者完全一致,并且可以相互替代使用。

状态码

下面列举了比较常见的状态码:

1xx

表示请求正在处理。
1xx 系列的状态码由浏览器直接处理,所以作为前端开发者,基本见不到。

2xx

表示请求成功。
2xx 系列的状态码最常见应该是 200,这表示请求成功。

3xx

表示希望客户端进行附加操作以完成请求。
3xx 系列中,301 表示当前资源已经被永久性转移,提示客户端下次别再访问了;302 表示当前资源被临时性转移;304 表示客户端本地已经有缓存的版本。

4xx

表示请求错误。
4xx 系列中,403 表示没有权限访问该页面;404 表示请求的页面不存在。

5xx

表示服务器错误。
5xx 系列中,500 表示服务器错误;503 表示服务器暂时性错误。

HTTP/2.0 协议

在讲解 HTTP/2.0 之前,我们简单了解一下 HTTP 协议历经的版本。

HTTP/0.9

1990年,最早版本的 HTTP 协议建立。这个版本的 HTTP 非常简单,只支持一种方法,即 GET,请求报文也只有一行。

例子:

//请求 
GET /hello.html

响应报文也非常简单,只有 HTML 格式的字符串。

例子:

//响应
<HTML>
Hello world
</HTML>

HTTP/1.X

1996年5月,HTTP/1.0 标准建立;仅仅过了8个月,在1997年1月,HTTP/1.1 标准建立。时至今日,HTTP/1.1已经成为应用最为广泛的协议版本。HTTP/1.1 在 HTTP/1.0 基础上最主要的改进就是在头部增加了一个 Connection 字段,通过设置 Keep-Alive 可以保持 TCP 连接不断开。

HTTPS

HTTPS 是 HTTP 的安全版,即在 HTTP 协议下加入 SSL 加密传输协议。 HTTPS 协议的主要作用有两个:第一,建立一个信息安全通道,来保证数据传输的安全;第二,确认网站的真实性。

HTTP/2.0

2015 年,HTTP/2.0 标准建立,目前很多主流浏览器已经支持该协议,但要达到较高的使用覆盖率,仍需要时间。HTTP/2.0 没有改动 HTTP/1.X 的方法、状态码、URL 和头部信息等核心概念,不过,HTTP/2.0 改进了数据格式(二进制分帧)以及在客户端与服务器间传输的方式( 多路复用和服务器推送 )。

1、二进制分帧

HTTP/1.X 的数据交换方式是基于文本。由于文本的表现形式具有多样性,会严重影响解析的速度。因此,HTTP/2.0 在应用层和传输层之间增加了一个二进制分帧层,将所有传输的信息分割为更小的消息和帧,并对它们采用二进制格式的编码( 使用0和1表示数据 ),其中 HTTP/1.X 的头部信息(1)会被封装到 Headers 帧里,而正文信息(2)则封装到 Data 帧里。Headers 帧中只会发送有变化的数据,对于相同的头部信息,不会再发送。

(1)头部信息:请求/响应头
(2)正文信息:请求/响应体

2、多路复用

使用 HTTP/1.0 协议,每个 TCP 连接(1)只能完成一次 “请求-响应”,完成之后连接就关闭。如果客户端想要发起多个请求,则必须使用多个 TCP 连接。HTTP/1.1 协议运用管道技术( HTTP Pipelining )来解决这个问题,它把多个 HTTP 请求放到一个 TCP 连接中一个一个发送( 长连接,串行发送,注意和 HTTP/2.0 的相同点与不同点 ),而且在发送过程中不需要等待服务器对前一个请求的响应。但是,管道技术并不能彻底解决 HTTP/1.0 存在的问题,比如只有GET,HEAD 方法才能使用,POST不能使用( 因为请求之间可能会存在先后依赖关系 ),并且在服务器端的响应依然要遵守请求顺序依次返回。HTTP/2.0 协议对这些缺陷进一步改进,真正做到了使用一个长连接并行交错发送多个请求和响应。HTTP/2.0 根据请求优先级控制响应的顺序,以保证数据之间存在的依赖关系。

(1)TCP 是一个非常复杂耗时的协议,建立连接时,客户端与服务器需要三次握手;断开连接时,客户端与服务器需要四次挥手。现在很多浏览器在使用 HTTP/1.1 协议的时候,为了可以实现并行发送多个请求,会同时建立多个 TCP 连接。

我们可以通过下面的示意图,进一步理解 HTTP/1.0、HTTP/1.1、HTTP/2.0 数据流的不同:

图片描述

图片描述

图片描述

3、服务器推送

HTTP/2.0 新增的另一个强大的新功能是,服务器可以对一个客户端请求发送多个响应。 换句话说,除了对最初请求的响应外,服务器还可以向客户端推送额外资源,而无需客户端明确地请求。事实上,如果你在网页中内联过 CSS、JavaScript,或者通过 URL 内联过其他资源,那实际上就是服务器在将资源推送给客户端,而不是等待客户端去请求。


如有错误,欢迎指正,本人不胜感激。

点击查看更多内容
3人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消