微信公众号:码农充电站pro

个人主页:https://codeshellme.github.io

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 <html>
<body>Hello HTTP</body>
</html>

其中:

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

  1. 点击Network,可查看网络请求
  2. 点击某个请求,可查看该请求信息
  3. 点击Response Header,可查看响应头内容
  4. 点击Request Header,可查看请求头信息
  5. 点击点击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 协议图解的更多相关文章

  1. 第8章 应用协议 图解TCP/IP 详解

    第8章 应用协议 图解TCP/IP 详解 8.1 应用层协议概要 应用层协议的定义 TCP和IP等下层协议是不依赖上层应用类型.实用性非常广的协议.而应用协议则是为了实现某种应用而设计和创造的协议. ...

  2. [I2C]I2C总线协议图解

    转自:http://blog.csdn.net/w89436838/article/details/38660631 1  I2C总线物理拓扑结构      I2C 总线在物理连接上非常简单,分别由S ...

  3. HTTP协议 --- 图解三次握手过程

    TCP(Transmission Control Protocol) 传输控制协议 TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接: 位码即tcp标志位,有6种标 ...

  4. HTTP协议图解

    1.HTTP简介 http是用于客户端与服务端之间的通信 实际情况中客户端与服务端角色有可能互换,但从一条通信线路来说服务器端和客户端角色是确定的,http协议知道那个是服务端那个是客户端呢. htt ...

  5. I2C总线协议图解(转载)

    转自:http://blog.csdn.net/w89436838/article/details/38660631 另外,https://blog.csdn.net/qq_38410730/arti ...

  6. TCP/IP协议图解

    联网的各个终端之间能否进行交互的软件基础是网络协议栈,目前主流的网络协议栈是TCP/IP协议栈. 1.主机到网络层协议:以太网协议 主机到网络层主要为IP协议和ARP协议提供服务.发送和接收网络数据报 ...

  7. I2C总线协议图解

    原帖地址:https://www.cnblogs.com/aaronLinux/p/6218660.html

  8. 《图解 HTTP》读书笔记

    <图解 HTTP>一书是日本学者上野宣所著,2014 年由于均良先生翻译并在国内出版.因为作者使用十分生动的语言和浅显易懂的案例将 HTTP 协议讲解得深入浅出,所以深受开发者喜爱.现在在 ...

  9. Dubbo(五):Dubbo中的URL统一资源模型与Dubbo协议

    一.URL简介 URL也就是Uniform Resource Locator,中文叫统一资源定位符.Dubbo中无论是服务消费方,或者服务提供方,或者注册中心.都是通过URL进行定位资源的.所以今天来 ...

随机推荐

  1. 树形DP——动态规划与数据结构的结合,在树上做DP

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是算法与数据结构的第15篇,也是动态规划系列的第4篇. 之前的几篇文章当中一直在聊背包问题,不知道大家有没有觉得有些腻味了.虽然经典的文 ...

  2. 【公告】请访问我Blog新站——superman2014 www.superman2014.com

    http://www.superman2014.com 欢迎光顾 本博客不在更新!!!!

  3. win10无法使用VMwareWorkstation的解决办法

    最近(2019-10)国庆期间,微软更新了一次win10. 此次更新导致很多同学的Workstation pro不能用了. 主要的解决办法有一下几种: 卸载最新的系统更新包 在控制面板>> ...

  4. Vue 实战项目: 硅谷外卖(1)

    第 1 章: 准备 1.1. 项目描述 1) 此项目为外卖 WebApp(SPA) 2) 包括商家, 商品, 购物车, 用户等多个子模块 3) 使用 Vue 全家桶+ES6+Webpack 等前端最新 ...

  5. Linux基础篇,正则表达式

    一.正则表达式特殊符号: 二.grep的用法 grep [-A|B|a|c|i|n|v] [--color=auto] '搜索字串' filename -A ===> after缩写,后面接数字 ...

  6. Linux 任务管理篇(一)

    查看网络的联机状态    netstat -a 查看后台执行的程序    ps -aux 将内存中的数据快速写入到硬盘中        sync

  7. Django -->admin后台(后台管理可以直接往数据库添加数据)

    一.使用pymysql时,必须加这两行(#如果使用mysql的数据库,请进行伪装 pymysql伪装为MySQLdb) import pymysqlpymysql.install_as_MySQLdb ...

  8. Redis cluster集群配置教程

    这里建议大家安装4.0.9版本的 1.打开Centos虚拟机,登陆. 2.通过WinSCP把Redis集群tar包上传到虚拟机里的目录里,我的目录是 /usr/local 这里我已经上传过了并解压了, ...

  9. c++缓冲区 vBufferChar.hpp

    //vbuffer_char.hpp //vov #ifndef V_BUFFER_CHAR_HPP #define V_BUFFER_CHAR_HPP #include <iostream&g ...

  10. java 代码执行cmd 返回值异常 (关于JAVA Project.waitfor()返回值是1)

    关于JAVA Project.waitfor()返回值是1   0条评论 Project.waitfor()返回值是1,找了很久从网上没有发现关于1的说明. 这时对源代码调试了一下,发现Project ...