HTTP 协议图解
微信公众号:码农充电站pro
个人主页:https://codeshellme.github.io
HTTP 协议是一个非常重要的网络协议
,我们平时能够使用浏览器浏览网页,其中一个非常重要的条件就是HTTP 协议
。
0,什么是网络协议
互联网的目的是分享信息,网络协议是互联网的重要组成部分。
在互联网诞生之前,计算机中的信息是无法跨机器传输的。为了更方便的分享信息,诞生了互联网。
信息能够在不同的计算机之间快速传输,其基础技术就是网络
。信息的传输
,则涉及到信息的发送
与接收
,那我们就得知道如何发送信息
与如何接收信息
。
协议
就是约定
,网络协议
就约定了信息在网络之间是如何传输
的,即如何发送
与如何接收
。
协议分层
网络协议不是一个协议,而是一堆协议。
网络是分层的,分层的好处是,层与层之间分工明确,互不干预。其可分为四层网络协议
或五层网络协议
或七层网络协议
,粗略一点可以分为四层,详细一点则可以分为五层或七层。
每一层网络都有一组协议,被称为协议簇
。
1,什么是HTTP 协议
HTTP 全称为HyperText Transfer Protocol
,即超文本传输协议
。从字面上理解,其作用就是传输超文本
。超文本
即超级文本
,它用超级链接
的方式,将互联网中无数的文档链接在一起。
可以简单的将超文本
理解为我们平时上网浏览的网页
,所以可以认为HTTP 协议的作用就是传输
网页。
2,HTTP 的发展历史
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 属于应用层协议。其协议层结构如下:
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
为请求方法,/
为URL
,HTTP1.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
<html>
<body>Hello HTTP</body>
</html>
其中:
- 第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
键,调出浏览器开发者工具
。
- 点击
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
有如下特点:
- HTTP2 是一个彻底的
二进制协议
,所有信息以二进制格式传输。 - HTTP2 支持多工(
Multiplexing
),在一个TCP 链接中可同时处理多个HTTP 请求。 - HTTP2 中的
数据流
不是按照顺序发送的,是乱序的。 - HTTP2 支持
头信息压缩
。 - HTTP2 支持服务端主动向客户端发送信息。
15,什么是HTTPS
HTTPS
中的S
是指Security
,即是安全
的意思,所以HTTPS
就是安全的HTTP
。
HTTPS
在HTTP 协议的基础上加入了一层SSL/TLS
,用于对HTTP 信息加密,其加密采用非对称加密算法RSA 算法
。其协议层结构如下:
(完。)
欢迎关注作者公众号,获取更过技术干货。
HTTP 协议图解的更多相关文章
- 第8章 应用协议 图解TCP/IP 详解
第8章 应用协议 图解TCP/IP 详解 8.1 应用层协议概要 应用层协议的定义 TCP和IP等下层协议是不依赖上层应用类型.实用性非常广的协议.而应用协议则是为了实现某种应用而设计和创造的协议. ...
- [I2C]I2C总线协议图解
转自:http://blog.csdn.net/w89436838/article/details/38660631 1 I2C总线物理拓扑结构 I2C 总线在物理连接上非常简单,分别由S ...
- HTTP协议 --- 图解三次握手过程
TCP(Transmission Control Protocol) 传输控制协议 TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接: 位码即tcp标志位,有6种标 ...
- HTTP协议图解
1.HTTP简介 http是用于客户端与服务端之间的通信 实际情况中客户端与服务端角色有可能互换,但从一条通信线路来说服务器端和客户端角色是确定的,http协议知道那个是服务端那个是客户端呢. htt ...
- I2C总线协议图解(转载)
转自:http://blog.csdn.net/w89436838/article/details/38660631 另外,https://blog.csdn.net/qq_38410730/arti ...
- TCP/IP协议图解
联网的各个终端之间能否进行交互的软件基础是网络协议栈,目前主流的网络协议栈是TCP/IP协议栈. 1.主机到网络层协议:以太网协议 主机到网络层主要为IP协议和ARP协议提供服务.发送和接收网络数据报 ...
- I2C总线协议图解
原帖地址:https://www.cnblogs.com/aaronLinux/p/6218660.html
- 《图解 HTTP》读书笔记
<图解 HTTP>一书是日本学者上野宣所著,2014 年由于均良先生翻译并在国内出版.因为作者使用十分生动的语言和浅显易懂的案例将 HTTP 协议讲解得深入浅出,所以深受开发者喜爱.现在在 ...
- Dubbo(五):Dubbo中的URL统一资源模型与Dubbo协议
一.URL简介 URL也就是Uniform Resource Locator,中文叫统一资源定位符.Dubbo中无论是服务消费方,或者服务提供方,或者注册中心.都是通过URL进行定位资源的.所以今天来 ...
随机推荐
- 树形DP——动态规划与数据结构的结合,在树上做DP
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是算法与数据结构的第15篇,也是动态规划系列的第4篇. 之前的几篇文章当中一直在聊背包问题,不知道大家有没有觉得有些腻味了.虽然经典的文 ...
- 【公告】请访问我Blog新站——superman2014 www.superman2014.com
http://www.superman2014.com 欢迎光顾 本博客不在更新!!!!
- win10无法使用VMwareWorkstation的解决办法
最近(2019-10)国庆期间,微软更新了一次win10. 此次更新导致很多同学的Workstation pro不能用了. 主要的解决办法有一下几种: 卸载最新的系统更新包 在控制面板>> ...
- Vue 实战项目: 硅谷外卖(1)
第 1 章: 准备 1.1. 项目描述 1) 此项目为外卖 WebApp(SPA) 2) 包括商家, 商品, 购物车, 用户等多个子模块 3) 使用 Vue 全家桶+ES6+Webpack 等前端最新 ...
- Linux基础篇,正则表达式
一.正则表达式特殊符号: 二.grep的用法 grep [-A|B|a|c|i|n|v] [--color=auto] '搜索字串' filename -A ===> after缩写,后面接数字 ...
- Linux 任务管理篇(一)
查看网络的联机状态 netstat -a 查看后台执行的程序 ps -aux 将内存中的数据快速写入到硬盘中 sync
- Django -->admin后台(后台管理可以直接往数据库添加数据)
一.使用pymysql时,必须加这两行(#如果使用mysql的数据库,请进行伪装 pymysql伪装为MySQLdb) import pymysqlpymysql.install_as_MySQLdb ...
- Redis cluster集群配置教程
这里建议大家安装4.0.9版本的 1.打开Centos虚拟机,登陆. 2.通过WinSCP把Redis集群tar包上传到虚拟机里的目录里,我的目录是 /usr/local 这里我已经上传过了并解压了, ...
- c++缓冲区 vBufferChar.hpp
//vbuffer_char.hpp //vov #ifndef V_BUFFER_CHAR_HPP #define V_BUFFER_CHAR_HPP #include <iostream&g ...
- java 代码执行cmd 返回值异常 (关于JAVA Project.waitfor()返回值是1)
关于JAVA Project.waitfor()返回值是1 0条评论 Project.waitfor()返回值是1,找了很久从网上没有发现关于1的说明. 这时对源代码调试了一下,发现Project ...