HTTP 协议图解
2020-05-02 09:16
615 查看
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200430170442729.png?#pic_center)
HTTP 协议是一个非常重要的`网络协议`,我们平时能够使用浏览器浏览网页,其中一个非常重要的条件就是`HTTP 协议`。
### 0,什么是网络协议
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200430171741179.png?#pic_center)
互联网的目的是分享信息,网络协议是互联网的重要组成部分。
在互联网诞生之前,计算机中的信息是无法跨机器传输的。为了更方便的分享信息,诞生了互联网。
信息能够在不同的计算机之间快速传输,其基础技术就是`网络`。信息的`传输`,则涉及到信息的`发送`与`接收`,那我们就得知道`如何发送信息`与`如何接收信息`。
`协议`就是`约定`,`网络协议`就约定了信息在网络之间是`如何传输`的,即`如何发送`与`如何接收`。
#### 协议分层
网络协议不是一个协议,而是一堆协议。
网络是分层的,分层的好处是,层与层之间分工明确,互不干预。其可分为`四层网络协议`或`五层网络协议`或`七层网络协议`,粗略一点可以分为四层,详细一点则可以分为五层或七层。
每一层网络都有一组协议,被称为`协议簇`。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200430173551637.png?#pic_center)
### 1,什么是HTTP 协议
HTTP 全称为`HyperText Transfer Protocol`,即`超文本传输协议`。从字面上理解,其作用就是传输`超文本`。`超文本`即`超级文本`,它用`超级链接`的方式,将互联网中无数的文档链接在一起。
可以简单的将`超文本`理解为我们平时上网浏览的`网页`,所以可以认为HTTP 协议的作用就是`传输`网页。
### 2,HTTP 的发展历史
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200501180121435.jpg?#pic_center)
HTTP 协议由英国计算机科学家`蒂姆·伯纳斯`于1989年在欧洲发起,`蒂姆·伯纳斯` 作为HTTP 的发明者,对HTTP 的发展起到了至关重要的作用,他被称为`互联网之父`。2017年,他因`发明万维网、第一个浏览器和使万维网得以扩展的基本协议和算法`而获得2016年度的`图灵奖`。
HTTP 协议标准由`W3C` 和`IETF` 共同制定,最终发布一系列的`RFC`。
HTTP 协议重要的发展阶段如下:
- 1989年,由`蒂姆·伯纳斯` 发起
- 1991年,发布`HTTP/0.9`,这是HTTP 协议的第一个版本,也是最简单的版本,只支持一个`GET` 方法,并且只能传输简单的文本字符串。
- 1996年,发布`HTTP/1.0`,其内容大大增加,可传输`图像`,`视频`,`二进制格式`等丰富的网页。支持`GET`,`POST`,`HEAD` 三种方法,增加了`HTTP Header`头信息,`状态码`,`内容编码`等功能。
- 1997年,发布`HTTP1.1`,是较为完整的版本。在之前的基础上,其主要引入了`持久连接`,`分块传输`等功能。另外,增加了`OPTIONS`、`PUT`、`PATCH`、`DELETE`、`TRACE` 和 `CONNECT`方法。对于客户端,引入了重要的`Host` 头部字段,用来指定服务器的域名,使得一个`请求`可以发往同一台服务器上的不同网站,为虚拟主机的流行打下基础。
- 2009年,谷歌公开了其自主研发的`SPDY 协议`,主要解决`HTTP1.1` 效率不高的问题。`SPDY 协议`的主要特性被引入了`HTTP/2` 中。
- 2015年,发布`HTTP/2`,而不是`HTTP/2.0`,是因为标准委员会不打算再发布子版本,下一个新版本将直接是 `HTTP/3`。
| 年份 | 事件 |
|:--|:--|
| 1989年 | 由`蒂姆·伯纳斯` 发起 |
|1991年|发布`HTTP/0.9`|
|1996年|发布`HTTP/1.0`|
|1997年|发布`HTTP/1.1`|
|2009年|谷歌公布`SPDY`|
|2015年|发布`HTTP/2`|
### 3,HTTP 所在的网络层次
HTTP 协议建立在`Tcp/Ip` 协议之上,HTTP 属于应用层协议。其协议层结构如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200430181108651.png?#pic_center)
### 4,HTTP 请求与响应
HTTP 协议是一个`请求-响应`式协议,一般由`客户端`(比如浏览器)向`服务端`发起,服务端处理后,再向客户端返回信息。
客户端发出的消息称为`HTTP 请求`(`Request`),服务端返回的消息称为`HTTP 响应`(`Response`)。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200430183223514.png#pic_center)
每种协议都有它的消息结构,有了消息结构,发送方就知道以怎样的结构发送消息,接收方就知道以怎样的结构接收消息。下面介绍HTTP 消息结构。
### 5,HTTP 请求消息结构
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200430213324838.png?#pic_center)
由上图可看出,HTTP 请求由四部分组成:
- 请求行:分别是`请求方法`+`空格`+`URL`+`空格`+`协议版本`+`\r\n`
- 请求头部:由多个请求头部`键值对`组成,中间以冒号`:`隔开,每个`键值对`最后是`\r\n`
- 空行:即`\r\n`
- 请求包体:包体部分
例子:
```shell
GET / HTTP/1.0
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5)
Accept: */*
```
其中:
- 第1行是`请求行`,`GET` 为请求方法,`/` 为`URL`,`HTTP1.0` 为协议版本,中间以`空格`隔开。
- 第2行与第3行是`请求头`。
- 请求头下面的`空行`,这里没有显示。
- 一般`GET` 请求不包含`请求体`,所以本请求中没有请求体。
### 6,HTTP 请求响应结构
![在这里插入图片描述](https://img-blog.csdnimg.cn/2020043021335833.png?#pic_center)
由上图可看出,HTTP 响应由四部分组成:
- 状态行:分别是`协议版本`+`空格`+`状态码`+`空格`+`状态码描述`+`\r\n`
- 响应头部:由多个响应头部`键值对`组成,中间以冒号`:`隔开,每个`键值对`最后是`\r\n`
- 空行:即`\r\n`
- 响应包体:包体部分
例子:
```shell
HTTP/1.0 200 OK
Content-Type: text/plain
Content-Length: 82
Expires: Thu, 05 Dec 1997 16:00:00 GMT
Last-Modified: Wed, 5 August 1996 15:55:28 GMT
Server: Apache 0.84
Hello HTTP
```
其中:
- 第1行为响应`状态行`,`HTTP/1.0` 为协议版本,`200` 是响应`状态码`,`OK`是`状态码描述`,中间用`空格`隔开。
- 第2行到第6行为`响应头`。
- 第7行为`空行`。
- 第8行到第10行为`响应内容`。
### 7,HTTP 请求方法
HTTP 协议支持9 种`请求方法`,最常用的是`GET` 和`POST` 方法。
|HTTP 方法| 含义 |
|:--|:--|
| `GET` | 获取指定页面信息 |
| `HEAD` | 类似`GET` 请求,但响应中没有具体内容,只有响应`Header` |
| `POST` | 向指定URL 提交信息 |
| `PUT` | 向服务器传送数据 |
| `DELETE` | 请求服务器删除指定内容 |
| `OPTIONS` | 查看服务器信息 |
| `TRACE` | 回显服务器收到的请求,主要用于测试或诊断 |
| `PATCH` | 是对`PUT` 方法的补充,用来对已知资源进行局部更新 |
| `CONNECT` | `HTTP/1.1` 协议中预留给能够将连接改为管道方式的代理服务器 |
### 8,HTTP GET 与POST 方法
`GET 方法`与`POST 方法`是最常用的两个HTTP 方法,来看下其异同点:
- 请求内容存放位置不同:`GET 方法`一般没有请求体,其请求内容放在`URL 参数`中,`POST 方法`则将请求内容放在请求体中。
- `POST 方法` 安全性更高:`GET 请求`一般是明文传输,不利于传输敏感数据。`POST 请求`内容在请求体中,更方便加密,提高安全性。
- `POST 方法`传输的数据量更大:`GET 请求`内容在URL 中,因此有大小限制,而`POST 请求` 内容在请求体中,理论上没有大小限制。
### 9,HTTP 请求头字段
这里介绍一些常用的HTTP 请求头字段:
> `Host`:客户端端请求的域名。
>
> `Connection`:告诉服务端,处理完本请求后,是否关闭连接。
>
> `User-Agent`:客户端使用的浏览器或APP 类型/版本。
>
> `Accept`:客户端支持哪些类型的文档。
>
> `Accept-Encoding` :客户端支持的编码类型。
>
> `Accept-Language` :客户端支持的语言类型。
>
> `Referer` :客户端从哪个网页过来的。
>
> `Cache-Control`:指定缓存机制。
### 10,HTTP 响应头字段
这里介绍一些常用的HTTP 响应头字段:
> `Allow`:表明服务器支持哪些请求方法,如GET,POST 等。
>
> `Content-Encoding`:响应内容编码方法。
>
> `Content-Type`:响应内容属于什么MIME 类型。
>
> `Content-Length`:响应内容的长度。
>
> `Date`:当前GMT 时间。
>
> `Expiress`:响应内容过期时间,过期后将不再缓存内容。
>
> `Last-Modified`:文档的最后改动时间。
>
> `Location`:告诉客户端到哪里获取文档,一般用于重定向。
>
> `Refresh`:浏览器在多少秒后刷新文档。
>
> `Server`:服务器名字。
>
> `Set-Cookie`:设置和页面关联的Cookie。
>
> `Date`:表示消息发送时间。
### 11,HTTP 响应状态码
服务器在向客户端返回内容时,会带有一个`HTTP Status Code`(状态码),用于告诉客户端的返回状态。
HTTP 状态码分为5 种类型,由三个十进制数字组成。第一个数字(`1-5`)代表状态码的分类,后两位是其含义。
| 状态码类型 | 含义 |
|:--|:--|
| `1xx` | 表明服务器已经收到请求 |
| `2xx` | 表明服务器已经成功接收并处理请求 |
| `3xx` | 表明请求的资源已重定向到其它地方 |
| `4xx` | 表明客户端的请求有错误 |
| `5xx` | 表明服务端出现错误 |
常见状态码:
| 常见状态码 | 状态码描述 | 含义 |
|:--|:--|:--|
| `100` | `Continue` |客户端应继续其请求 |
| `200` | `OK` | 请求成功,一般用于GET与POST请求|
| `301` | `Moved Permanently` | 请求的资源已被`永久重定向`到新地址|
| `302` | `Found` |请求的资源已被`临时重定向`到新地址 |
| `304` | `Not Modified` | 客户端访问的内容未修改,应从缓存中获取内容|
| `400` | `Bad Request` | 客户端的请求有误|
| `401` | `Unauthorized` | 请求要求客户端进行身份认证|
| `403` | `Forbidden` | 服务器拒绝客户端访问|
| `404` | `Not Found` | 客户端请求的资源,服务端不存在|
| `405` | `Method Not Allowed` |客户端请求中的方法被禁止 |
| `500` | ` Internal Server Error` | 服务器内部错误|
| `501` | `Not Implemented` | 服务器不支持该请求|
| `503` | `Service Unavailable` | 服务器过载,暂时不可用|
|`505`|`HTTP Version not supported`|客户端使用的HTTP版本,服务端不支持|
### 12,用浏览器演示HTTP
下面通过一个例子实际感受以下HTTP 协议。
在浏览器(我这里用的是Chrome)中访问新浪网`https://www.sina.com.cn/`,通过`F12`键,调出浏览器`开发者工具 `。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200501153742518.png?#pic_center)
1. 点击`Network`,可查看网络请求
2. 点击`某个请求`,可查看该请求信息
3. 点击`Response Header`,可查看响应头内容
4. 点击`Request Header`,可查看请求头信息
5. 点击`点击Response`,可查看响应内容
### 13,用curl 命令演示HTTP
`curl` 命令可以发送`HTTP(S)` 协议,[这里](https://blog.csdn.net/LUAOHAN/article/details/105602195)有`curl` 命令的常用方法。
我们使用 `curl -v 参数` 来显示详细的HTTP 协议包信息:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200501175653628.png?#pic_center)
### 14,什么是HTTP/2
`HTTP/2 ` 可看作是`HTTP1.x` 的增强版,其主要解决`HTTP1.x` 的效率等问题,其消息结构也已经发生了改变。
我们来访问`https://http2.akamai.com/demo`,来感受下`HTTP2`的速度。`HTTP/1.1` 耗时15 秒多,`HTTP/2`耗时6 秒多。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200501160208730.gif#pic_center)
`HTTP2` 有如下特点:
- HTTP2 是一个彻底的`二进制协议`,所有信息以二进制格式传输。
- HTTP2 支持多工(`Multiplexing`),在一个TCP 链接中可同时处理多个HTTP 请求。
- HTTP2 中的`数据流`不是按照顺序发送的,是乱序的。
- HTTP2 支持`头信息压缩`。
- HTTP2 支持服务端主动向客户端发送信息。
### 15,什么是HTTPS
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200501163847419.png#pic_center)
`HTTPS` 中的`S` 是指`Security`,即是`安全`的意思,所以`HTTPS` 就是安全的`HTTP`。
`HTTPS` 在HTTP 协议的基础上加入了一层`SSL/TLS`,用于对HTTP 信息加密,其加密采用`非对称加密算法RSA 算法`。其协议层结构如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200501163937902.png?#pic_center)
(完。)
相关文章推荐
- 图解TCP/IP、HTTP协议
- 图解HTTP,状态码,TCP、UDP等网络协议相关总结(持续更新)
- 【图解HTTP笔记】第二章 简单的HTTP协议
- 图解传说中的HTTP协议
- TCP协议中的三次握手和四次挥手(图解)(转载http://blog.csdn.net/whuslei/article/details/6667471)
- 图解HTTP笔记(九)-基于HTTP的功能追加协议
- 图解HTTP之简单的HTTP协议
- HTTP协议的特点及访问流程(上网流程图解)
- 图解HTTP协议 第2章 简单的HTTP协议学习笔记
- JavaEE 要懂的小事:一、图解Http协议
- 图解HTTP笔记之第二章:简单的http协议
- http协议的一些知识点(图解http摘取)
- 【图解HTTP】第二章 简单的http协议
- 图解http学习笔记2.简单http协议
- 图解传说中的HTTP协议
- JavaEE 要懂的小事:一、图解Http协议
- HTTP 协议图解
- 图解HTTP学习(2):简单的HTTP协议
- 深入剖析/图解HTTP 协议
- 图解 HTTP 协议