日志

HTTP 协议图解

 来源    2020-05-02    727  

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 算法。其协议层结构如下:

(完。)

相关文章
Python Web学习笔记之图解TCP/IP协议和浅析算法
日志 本文通过两个图来梳理TCP-IP协议相关知识.TCP通信过程包括三个步骤:建立TCP连接通道,传输数据,断开TCP连接通道.如图1所示,给出了TCP通信过程的示意图.   图1主要包括三部分:建立连 ...
1
图解 HTTP 笔记(二)——简单的 HTTP 协议
日志本章主要以 HTTP 1.0 为例,讲解 HTTP 协议的基本结构. 在两台计算机之间使用 HTTP 协议进行通讯时,在一条通讯线路上必定有一端是客户端,另一端则是服务器端. 请求访问文本或图像等资源 ...
1
转 TCP协议中的三次握手和四次挥手(图解)
日志TCP协议中的三次握手和四次挥手(图解) http://blog.csdn.net/whuslei/article/details/6667471 建立TCP需要三次握手才能建立,而断开连接则需要四次 ...
1
编译器错误 – Google协议缓冲交叉编译
问答我使用Google协议缓冲区的问题有两个部分,一个是关于编译器选项,另一个是交叉编译.构建机器是Power6,64bit;主机是PowerPC450,32bit. Gcc 4.1.2. 第一个问题是关 ...
2
Python(Twisted) – 从fifo读取并将读取数据发送到多个协议
问答我试图编写某种多协议机器人(jabber / irc),它将从fifo文件(主要是一个衬里)读取消息,然后将它们发送到irc频道和jabber联系人.到目前为止,我设法创建了两个工厂连接到jabber ...
1
php – 发送多个应用程序协议请求(类似于mailto:)
问答我使用的应用程序已经创建了自己的协议,就像MS为其MSN客户端msnim所做的那样:chat?contact = test@test.com 但是,我需要创建一个PHP或javascript(或组合) ...
1
iphone – 用于保护移动设备和Web服务之间连接的协议?
问答我正在寻找一种协议来保护移动设备和Web服务之间的连接.我想确保只有移动设备才能对Web服务执行操作,反之亦然.数据不需要加密. 我知道Oauth,但是当你有3个不同的实体(Server,Consum ...
2
docker – Alpine软件包安装协议错误
问答我正在尝试在alpine 3.6上安装git.它在第一个实例中失败了,但是在第二个实例上工作.具体来说,pcre和libcurl没有安装在第一个实例中.这是我想要做的日志. $docker run - ...
1
xmpp – 适用于即时消息的协议
问答我们必须使用SUITABLE协议为Instant Messaging开发本机移动应用程序. 我们还要为该应用程序开发一个网站,以便那些无法登录移动设备的人可以通过网站继续他们的即时消息. 稍后,我们将 ...
jms – Open MQ使用哪种传输协议?
问答我听说IBM的一个人谈了MQTT,他说MQTT是目前最轻量级的消息传递协议.他的论点是,单个消息产生的最小开销是2个字节.但是,我听说HTML5 WebSockets也一样(2字节开销)?无论如何,因 ...
1
协议 – 用于Windows IOT Core的MQTT代理?
问答我有一个运行Windows IOT Core的Raspberry Pi,它正在运行我的家庭自动化应用程序.现在我需要在RB饼和ESP8266之间建立通信. 我一直在考虑MQTT协议,但我不想让外部服务 ...
1
网络协议 – SCTP的稳定性和性能?
问答谁在那里使用SCTP?特别是在Solaris和Linux上?您有什么经验 – 是否可以投入生产?::SCTP很好,只要你只在一个网络上使用它.它已经在许多主要的电信网络上广泛使用. 然而,许多防火墙, ...
1
PostgreSQL协议数据表示格式规范?
问答我正在阅读PostgreSQL protocol document.该文档指定了消息流和包含格式,但未提及实际数据字段如何以文本/二进制编码. 对于文本格式,根本没有提及.这是什么意思?我应该只使用S ...
1
linux – 如何查询特定邻居的IPv6 NDP(邻居发现协议)表
问答我正在使用Linux并试图弄清楚如何查询(通过API)特定条目的NDP表.到目前为止,我发现的唯一示例(在iproute2的源代码中)使用Netlink并获取整个表.有没有办法在特定接口上查询Netl ...
1
c – 在GOOGLE_PROTOBUF_MIN_PROTOC_VERSION检查期间编译时出现协议缓冲区错误
问答我目前收到一个错误,指出我在protoc生成的头文件中的这些行: #if 2006001 < GOOGLE_PROTOBUF_MIN_PROTOC_VERSION #error This fil ...
1
Scala协议缓冲区编译器
问答我正在考虑编写代码生成器,以从Google protobuf定义文件生成scala.我认为它有价值的原因是java绑定也是Java-ish,在scala中可以做得更好. 例如对于以下定义 messag ...
1
协议缓冲区 – Google协议缓冲区:ZigZag编码
问答从Encoding – Protocol Buffers – Google Code的"签名类型" ZigZag encoding maps signed integers to ...
Visual Studio 2010 C / w Google协议缓冲区.找不到60个外部.无法编译
问答我尽我所能遵循指示.下载的GPBuffers 5.0rc1将src / google文件夹放入我的项目目录中.添加了设置>的路径C/C++> "其他包含目录". 但我认 ...
1
java – 协议缓冲编译器maven插件
问答我在我的POM中配置了协议缓冲区编译器插件,无论何时构建项目都会执行该插件.这个编译器插件在windows中工作正常,但现在我将我的项目移动到ubuntu PC&需要使用合适的替代品. < ...
1
Swift 2.0:协议扩展:具有相同功能签名编译错误的两个协议
问答鉴于两个协议及其扩展: protocol FirstDelegate { func someFunc() } protocol SecondDelegate { func someFunc() } e ...
1