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 算法。其协议层结构如下:
(完。)
Python Web学习笔记之图解TCP/IP协议和浅析算法
日志 本文通过两个图来梳理TCP-IP协议相关知识.TCP通信过程包括三个步骤:建立TCP连接通道,传输数据,断开TCP连接通道.如图1所示,给出了TCP通信过程的示意图. 图1主要包括三部分:建立连 ... |
2 |
图解 HTTP 笔记(二)——简单的 HTTP 协议
日志本章主要以 HTTP 1.0 为例,讲解 HTTP 协议的基本结构. 在两台计算机之间使用 HTTP 协议进行通讯时,在一条通讯线路上必定有一端是客户端,另一端则是服务器端. 请求访问文本或图像等资源 ... |
2 |
转 TCP协议中的三次握手和四次挥手(图解)
日志TCP协议中的三次握手和四次挥手(图解) http://blog.csdn.net/whuslei/article/details/6667471 建立TCP需要三次握手才能建立,而断开连接则需要四次 ... |
2 |
编译器错误 – Google协议缓冲交叉编译
问答我使用Google协议缓冲区的问题有两个部分,一个是关于编译器选项,另一个是交叉编译.构建机器是Power6,64bit;主机是PowerPC450,32bit. Gcc 4.1.2. 第一个问题是关 ... |
3 |
Python(Twisted) – 从fifo读取并将读取数据发送到多个协议
问答我试图编写某种多协议机器人(jabber / irc),它将从fifo文件(主要是一个衬里)读取消息,然后将它们发送到irc频道和jabber联系人.到目前为止,我设法创建了两个工厂连接到jabber ... |
1 |
php – 发送多个应用程序协议请求(类似于mailto:)
问答我使用的应用程序已经创建了自己的协议,就像MS为其MSN客户端msnim所做的那样:chat?contact = test@test.com 但是,我需要创建一个PHP或javascript(或组合) ... |
2 |
iphone – 用于保护移动设备和Web服务之间连接的协议?
问答我正在寻找一种协议来保护移动设备和Web服务之间的连接.我想确保只有移动设备才能对Web服务执行操作,反之亦然.数据不需要加密. 我知道Oauth,但是当你有3个不同的实体(Server,Consum ... |
5 |
docker – Alpine软件包安装协议错误
问答我正在尝试在alpine 3.6上安装git.它在第一个实例中失败了,但是在第二个实例上工作.具体来说,pcre和libcurl没有安装在第一个实例中.这是我想要做的日志. $docker run - ... |
1 |
xmpp – 适用于即时消息的协议
问答我们必须使用SUITABLE协议为Instant Messaging开发本机移动应用程序. 我们还要为该应用程序开发一个网站,以便那些无法登录移动设备的人可以通过网站继续他们的即时消息. 稍后,我们将 ... |
2 |
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 ... |
2 |
Scala协议缓冲区编译器
问答我正在考虑编写代码生成器,以从Google protobuf定义文件生成scala.我认为它有价值的原因是java绑定也是Java-ish,在scala中可以做得更好. 例如对于以下定义 messag ... |
1 |
协议缓冲区 – Google协议缓冲区:ZigZag编码
问答从Encoding – Protocol Buffers – Google Code的"签名类型" ZigZag encoding maps signed integers to ... |
2 |
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 ... |
2 |