HTTP 协议图解

HTTP 协议是一个非常重要的 网络协议 ,我们平时能够使用浏览器浏览网页,其中一个非常重要的条件就是 HTTP 协议

0,什么是网络协议

互联网的目的是分享信息,网络协议是互联网的重要组成部分。

在互联网诞生之前,计算机中的信息是无法跨机器传输的。为了更方便的分享信息,诞生了互联网。

信息能够在不同的计算机之间快速传输,其基础技术就是 网络 。信息的 传输 ,则涉及到信息的 发送接收 ,那我们就得知道 如何发送信息如何接收信息

协议 就是 约定网络协议 就约定了信息在网络之间是 如何传输 的,即 如何发送如何接收

协议分层

网络协议不是一个协议,而是一堆协议。

网络是分层的,分层的好处是,层与层之间分工明确,互不干预。其可分为 四层网络协议五层网络协议七层网络协议 ,粗略一点可以分为四层,详细一点则可以分为五层或七层。

每一层网络都有一组协议,被称为 协议簇

1,什么是HTTP 协议

HTTP 全称为 HyperText Transfer Protocol ,即 超文本传输协议 。从字面上理解,其作用就是传输 超文本超文本超级文本 ,它用 超级链接 的方式,将互联网中无数的文档链接在一起。

可以简单的将 超文本 理解为我们平时上网浏览的 网页 ,所以可以认为HTTP 协议的作用就是 传输 网页。

2,HTTP 的发展历史

HTTP 协议由英国计算机科学家 蒂姆·伯纳斯 于1989年在欧洲发起, 蒂姆·伯纳斯 作为HTTP 的发明者,对HTTP 的发展起到了至关重要的作用,他被称为 互联网之父 。2017年,他因 发明万维网、第一个浏览器和使万维网得以扩展的基本协议和算法 而获得2016年度的 图灵奖

HTTP 协议标准由 W3CIETF 共同制定,最终发布一系列的 RFC

HTTP 协议重要的发展阶段如下:

  • 1989年,由 蒂姆·伯纳斯 发起
  • 1991年,发布 HTTP/0.9 ,这是HTTP 协议的第一个版本,也是最简单的版本,只支持一个 GET 方法,并且只能传输简单的文本字符串。
  • 1996年,发布 HTTP/1.0 ,其内容大大增加,可传输 图像视频二进制格式 等丰富的网页。支持 GETPOSTHEAD 三种方法,增加了 HTTP Header 头信息, 状态码内容编码 等功能。
  • 1997年,发布 HTTP1.1 ,是较为完整的版本。在之前的基础上,其主要引入了 持久连接分块传输 等功能。另外,增加了 OPTIONSPUTPATCHDELETETRACECONNECT 方法。对于客户端,引入了重要的 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 属于应用层协议。其协议层结构如下:

4,HTTP 请求与响应

HTTP 协议是一个 请求-响应 式协议,一般由 客户端 (比如浏览器)向 服务端 发起,服务端处理后,再向客户端返回信息。

客户端发出的消息称为 HTTP 请求Request ),服务端返回的消息称为 HTTP 响应Response )。

每种协议都有它的消息结构,有了消息结构,发送方就知道以怎样的结构发送消息,接收方就知道以怎样的结构接收消息。下面介绍HTTP 消息结构。

5,HTTP 请求消息结构

由上图可看出,HTTP 请求由四部分组成:

  • 请求行:分别是 请求方法 + 空格 + URL + 空格 + 协议版本 + \r\n
  • 请求头部:由多个请求头部 键值对 组成,中间以冒号 : 隔开,每个 键值对 最后是 \r\n
  • 空行:即 \r\n
  • 请求包体:包体部分

例子:

GET / HTTP/1.0
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5)
Accept: */*

其中:

  • 第1行是 请求行GET 为请求方法, /URLHTTP1.0 为协议版本,中间以 空格 隔开。
  • 第2行与第3行是 请求头
  • 请求头下面的 空行 ,这里没有显示。
  • 一般 GET 请求不包含 请求体 ,所以本请求中没有请求体。

6,HTTP 请求响应结构

由上图可看出,HTTP 响应由四部分组成:

  • 状态行:分别是 协议版本 + 空格 + 状态码 + 空格 + 状态码描述 + \r\n
  • 响应头部:由多个响应头部 键值对 组成,中间以冒号 : 隔开,每个 键值对 最后是 \r\n
  • 空行:即 \r\n
  • 响应包体:包体部分

例子:

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 种 请求方法 ,最常用的是 GETPOST 方法。

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 键,调出浏览器 开发者工具

Network
某个请求
Response Header
Request Header
点击Response

13,用curl 命令演示HTTP

curl 命令可以发送 HTTP(S) 协议, 这里curl 命令的常用方法。

我们使用 curl -v 参数 来显示详细的HTTP 协议包信息:

14,什么是HTTP/2

HTTP/2 可看作是 HTTP1.x 的增强版,其主要解决 HTTP1.x 的效率等问题,其消息结构也已经发生了改变。

我们来访问 https://http2.akamai.com/demo ,来感受下 HTTP2 的速度。 HTTP/1.1 耗时15 秒多, HTTP/2 耗时6 秒多。

HTTP2 有如下特点:

二进制协议
Multiplexing
数据流
头信息压缩

15,什么是HTTPS

HTTPS 中的 S 是指 Security ,即是 安全 的意思,所以 HTTPS 就是安全的 HTTP

HTTPS 在HTTP 协议的基础上加入了一层 SSL/TLS ,用于对HTTP 信息加密,其加密采用 非对称加密算法RSA 算法 。其协议层结构如下:

(完。)