HTTP协议发展介绍
HTTP协议工作于C/S架构上,是万维网服务器传输超文本到本地客户端的一种应用层协议,全称是:Hyper Text Transfer Protocol(超文本传输协议),HTTP是基于TCP/IP通信协议来传递数据的。HTTP于1990年被提出,由于其简洁性、快速性等特点,被广泛应用,并且经过不断的完善和发展,功能也越来越强大,目前已经发展到HTTP/2版本。

一. HTTP/0.9
最早版本发布于1991年,功能极其简单,不涉及数据包的传输,默认使用80端口,只有一个GET请求方法,且服务器只能响应HTML格式的字符串,服务器响应后即关闭连接。
请求:
GET /index.html
响应
<html>
<body>
hello world
</bocy>
</html>
二. HTTP/1.0
1996年5月,HTTP/1.0发布,引入了POST和HEAD命令,大大增强了交互功能,任何格式的内容都可以发送,为互联网的大发展奠定了基础;同时,除了数据部分,每次通信还要求包含头信息(HTTP header),来描述一些meta数据。
新增功能还包括:状态吗(status code)、多字符集支持、多部分发送(multi-part type)、权限(authorization)、缓存(cache)、内容编码(content encoding)等。
请求格式:
GET / HTTP/1.0
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5)
Accept: */*
可以看到,请求行末尾添加了协议版本号,后面是协议头的信息,描述客户端的情况。
其中,Accept: */*表明客户端接收任何类型的数据
响应格式:
HTTP/1.0 304 Not Modified
Cache-Control max-age=0, must-revalidate
Date Fri, 10 Feb 2017 06:24:38 GMT
Server apache
Connection Keep-alive
<html>
<body>
hello world
</body>
</html>
可以看到回应的数据的:头信息 + 一个空行 + 数据。其中,第一行是状态行,格式为:协议版本 + 状态码 + 状态描述。
常用字段介绍:
1. Content-Type
1.0版规定,头信息必须是ASCII码,后面的数据可以是任何格式,因此,服务器在响应的时候,也要告诉客户端,数据是什么格式。下面是Content-Type字段的常用值:
text/plain
text/html
text/css
image/jpeg
image/png
image/svg+xml
audio/mp4
video/mp4
application/javascript
application/pdf
application/zip
application/atom+xml
另外,这些数值统称为MIME type,每个值包括一级类型和二级类型,之间用斜杠分隔,用户也可以自定义该类型,还可以在尾部使用分号,添加参数。
Content-Type: text/html; charset=utf-8
上面的代码表示,发送的是网页,并且编码是的UTF-8格式。
Accept: */*
上面的代码表示客户端可以接受任何格式的数据。
2. Content-Encoding
发送的数据还可以被压缩后再发送,该字段说明了数据压缩的方法。
Content-Encoding: gzip
Content-Encoding: compress
Content-Encoding: deflate
客户端还可以在请求时,用Accept-Encoding字段说明自己可以接受哪些压缩方法。
Accept-Encoding: gzip, deflate
缺点
HTTP/1.0版的主要缺点是,由于TCP的每次连接都需要客户端和服务端进行3次握手,但是连接成功后只能发送一次请求,然后连接就断开了,如果需要多次请求,这样效率就很低。但是,为了解决多次请求效率低下的问题,有一个非标准的connection字段暂时解决了该问题。
Connection: keep-alive
这样就可以复用TCP连接,直到客户端或者服务端主动关闭连接。但是这不是标志字段,不同的实现可能行为不一致,所以是一种暂时的解决方案。
三. HTTP/1.1
1997年1月,HTTP/1.1版本发布,它进一步完善了HTTP协议,一直到今天还在使用,是最流行的版本;HTTP/1.1新增了许多特性:
新增功能介绍:
1.持久连接
HTTP/1.1默认TCP连接不关闭,可以被多个请求复用,不用声明Connection: keep-alive。客户端可以在最后一个请求时,主动发送Connection: close,明确要求服务器关闭TCP连接,或者不发送,那么客户端和服务器发现对方一段时间没有活动,就会主动关闭连接。目前,对于同一个域名,大多数浏览器允许同时建立6个持久连接。
Connection: close
2.管道机制
HTTP/1.1引入了管道机制(pipelining),即在同一个TCP连接里面,客户端可以同时发送多个请求,这样只是改进了客户端HTTP协议请求的效率,服务器还是按照请求的先后顺序来响应。
3.Content-Length
Content-Length字段显示本次响应的数据长度,如果数据被压缩,则是压缩后的长度。在Connection: keep-alive条件下,Content-Length是必须的;反之,和HTTP/1.0一样,Content-Length不是必须的。
4.分块传输编码
使用Content-Lenght字段的前提条件是,服务器发送响应之前,必须知道响应的数据长度。但是,对于一些耗时的动态操作来说,服务器要等到所有操作完成后,才能发送数据,效率不高。因此,HTTP采用了“流模式(stream)”,即“分块传输编码”(chunked transfer encoding)方式,表明响应的数据长度未定,这样就可以产生一块数据,就发送一块数据,提高服务器的响应效率。
Transfer-Encoding: chunked
这样,只要请求或响应的头信息里有Transfer-Encoding字段,就表明响应将由数量未定的数据组成。
每个非空的数据块之前,都会有一个16禁止的数值,表示这个块的长度;最后一个是大小为0的块,表示本次响应数据发送完了。
HTTP/1.1 200 OK
Content-Type: text/plain
Transfer-Encoding: chunked
25
This is the data in the first chunk
1C
and this is the second one
3
con
8
sequence
0
5.其它特性
新增了许多的请求方式:PUT、PATCH、OPTIONS、DELETE、TRACE,还增加了Host字段,用来指定服务器的域名,就可以把同一请求发送给不同的网站,为虚拟主机的发展奠定了基础。
缺点
虽然HTTP/1.1版允许复用TCP连接,但是同一个TCP连接里面,所有的数据通信是按次序进行的。服务器只有处理完一个回应,才会进行下一个回应。要是前面的回应特别慢,后面就会有许多请求排队等着,这称为"队头堵塞"(Head-of-line blocking)。
为了避免这个问题,只有两种方法:一是减少请求数,二是同时多开持久连接。这导致了很多的网页优化技巧,比如合并脚本和样式表、将图片嵌入CSS代码、域名分片(domain sharding)等等。如果HTTP协议设计得更好一些,这些额外的工作是可以避免的。
四. HTTP/2
2015年,HTTP/2发布,主要解决了HTTP1.1的效率不高的问题,新增了二进制协议、多工、数据流、头信息压缩等等功能,具体介绍如下:
1.二进制协议
HTTP/2是一个彻底的二进制协议,头信息和数据都是二进制,统称为帧(frame):头信息帧和数据帧。二进制的优势是:可以定义额外的帧,以适应未来更高级的应用。
2.多工
HTTP/2复用TCP连接,客户端和服务器都可以同时发送多个请求或响应,不用按照顺序一一对应,避免了对头堵塞,实现了双向的、实时的通信。
3.数据流
HTTP/2定义每个请求或响应的所有数据为一个数据流(stream),每个数据流都有一个唯一的编号,数据包发送的时候,都必须标记数据流ID,用来区分它属于哪个数据流。协议规定:客户端发出的数据流的ID位奇数,服务器发出的数据流ID为偶数。
另外,数据流发送过程中,客户端和服务器都可以随时发送信号而不用关闭TCP连接,以便其它请求使用。但是HTTP1.1就不行,它取消请求的方式必须的关闭连接。HTTP/2还指定了数据流的优先级,优先级越高,服务器就优先处理。
4.头信息压缩
HTTP 协议不带有状态,每次请求都必须附上所有信息。所以,请求的很多字段都是重复的,比如Cookie和User Agent,一模一样的内容,每次请求都必须附带,这会浪费很多带宽,也影响速度。
HTTP/2 对这一点做了优化,引入了头信息压缩机制(header compression)。一方面,头信息使用gzip或compress压缩后再发送;另一方面,客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号,以后就不发送同样字段了,只发送索引号,这样就提高速度了。
5.服务器推送
HTTP/2允许服务器主动向客户端发送资源,主要是服务器经过预测,把一些客户端可能请求的资源主动发送给客户端,提高用户体验。
本文主要参考阮一峰的
HTTP协议入门,版权归阮一峰所有。
参考资料
HTTP协议发展介绍的更多相关文章
- 转: 视频相关的协议族介绍(rtsp, hls, rtmp)
转自: http://www.zhihu.com/question/20621558 作者:杨华链接:http://www.zhihu.com/question/20621558/answer/1 ...
- HTTP协议简介详解 HTTP协议发展 原理 请求方法 响应状态码 请求头 请求首部 java模拟浏览器客户端服务端
协议简介 协议,自然语言里面就是契约,也是双方或者多方经过协商达成的一致意见; 契约也即类似于合同,自然有甲方123...,乙方123...,哪些能做,哪些不能做; 通信协议,也即是双方通过网络通信必 ...
- zigbee学习之路(十二):zigbee协议原理介绍
一.前言 从今天开始,我们要正式开始进行zigbee相关的通信实验了,我所使用的协议栈是ZStack 是TI ZStack-CC2530-2.3.0-1.4.0版本,大家也可以从TI的官网上直接下载T ...
- HTTP协议发展脉络
1 发展脉络 1.1 1991 HTTP/0.9 建立TCP连接.客户端发送请求(只有GET命令).服务端返回请求(只能返回html格式字符串)后就关闭TCP连接 1.2 1996.5 HTTP/1. ...
- iOS:核心动画具体的类和协议的介绍
核心动画类:CAAnimation.CAPropertyAnimation.CABasicAnimation.CAKeyframeAnimation.CATransition.CAAnimationG ...
- 基于HTTP 协议认证介绍与实现
导言 一直对http 的头认证有兴趣,就是路由器的那种弹出对话框输入账号密码怎么实现一直不明白,最近,翻了一下http 协议,发现这是一个RFC 2617的实现,所以写篇文章介绍一下吧. Http基本 ...
- HTTP从入门到入土(2)——HTTP协议发展历史
HTTP协议的发展历史 HTTP/0.9 0.9版本是第一个定稿的HTTP版本,相对较为简陋.它有以下特点: 只有一个命令GET 没有header等描述数据的信息 服务器发送完毕,就关闭TCP连接 注 ...
- HTTP协议简要介绍
1. 网络基础 TCP/IP 通常使用的网络是在TCP/IP协议簇基础上运作的. HTTP属于它内部的一个子集. TCP/IP分为4个层次, 应用层, 传输层, 网络层, 链路层. (Applicat ...
- WebSocket协议入门介绍
目录 目录 WebSocket协议是什么 WebSocket是应用层协议 WebSocket与Http的区别 为什么要使用WebSocket 如何使用WebSocket 客户端API 在客户端使用We ...
随机推荐
- iOS多线程开发之GCD(中篇)
前文回顾: 上篇博客讲到GCD的实现是由队列和任务两部分组成,其中获取队列的方式有两种,第一种是通过GCD的API的dispatch_queue_create函数生成Dispatch Queue:第二 ...
- Java开发从初级到中级
本人正统软件工程专业毕业,虽然实力垫底,但是大学的时候,整个学校非常热衷于OJ,ACM之类,耳濡目染,自以为基础的知识是有的.但是 一直觉得学的东西都是一团浆糊,按照老师的话说,我是那种看书只看目录, ...
- 了解Java基础原理
Java 是1995年SUN公司推出的一门高级编程语言,是面向互联网的语言,WEB应用程序首选的语言(安卓底层,大数据hadoop框架用java编写,Spark用Scala编写,Scala用java写 ...
- Java 基本语法----关键字、标识符
关键字 关键字的定义和特点 定义:被Java语言赋予了特殊含义,用做专门用途的字符串(单词)特点:关键字中所有字母都为小写 用于定义数据类型的关键字 class interface enum byte ...
- bash脚本基础
1.bash特性之命令补全与路径补全 命令补全:敲击Tab按键 shell程序在接收到用户执行命令的请求且分析完成后,最左侧字符串将被当作命令去分析$PATH标量所指定的各路径下去查找 查找机制: 1 ...
- 在 Linux 命令行脚本中执行 sudo 时自动输入密码
使用 expect 实现自动登录的脚本的原理. 脚本代码如下: ############################################## #!/usr/bin/expect set ...
- FPGA计算3行同列数据之和
实验:FPGA计算3行同列数据之和 实验要求:PC机通过串口发送3行数据(一行有56个数据,3行共有56*3=168个数据)给FPGA,FPGA计算3行同一列数据的和,并将结果通过串口返回给上位机. ...
- JAVA异常处理之finally中最好不要使用return
finally 语句块中, 最好不要使用return, 否则会造成已下后果; 1, 如果catch块中捕获了异常, 并且在catch块中将该异常throw给上级调用者进行处理, 但finally中re ...
- JVM学习笔记三:垃圾收集器及内存管理策略
垃圾收集器 上文说到了垃圾收集算法,这次我们聊一下HotSpot的具体垃圾收集器的实现,以JDK1.7为例,其包含的可选垃圾收集器如下图: 不同收集器之间的连线,代表它们可以搭配使用,收集器所属的区域 ...
- 定时任务FluentScheduler 学习笔记 .net
第一步添加引用 GitHub源码地址 与详细用法 https://github.com/fluentscheduler/FluentScheduler 下面开始简单的实现 /// <summar ...