您的位置:首页 > 理论基础 > 计算机网络

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) (完。)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: