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 ...
随机推荐
- h5可预览 图片ajax上传 (补更),后台数据获取方法---php
原理是 先获取,然后手动转移文件路径,不然会被服务器自动删除 demo如下: <?php header('content-Type:text/html;charset=utf-8'); $fil ...
- zookeeper初试
实验环境: os-platform: windows7 x64 jdk: 1.7 参考文档: http://www.ibm.com/developerworks/cn/opensource/os-cn ...
- VB6之GDI+加载PNG图片
原生的VB6不支持PNG个图片,因为刚有VB的时候还没有PNG的概念呢.不过,利用GDI+加载解析个PNG简直是砍瓜切菜般简单. GDI+的模块是我在网上下载的,地址应该是:http://vistas ...
- (转)基于 Token 的身份验证
原文:https://ninghao.net/blog/2834 最近了解下基于 Token 的身份验证,跟大伙分享下.很多大型网站也都在用,比如 Facebook,Twitter,Google+,G ...
- html之结构化标记
1.什么是结构化标记 对布局使用的div 进行升级 , 根据页面的不同区域而提供的不同标签.作用与div几乎一致 专门用于搭建网站结构而用 2.结构标记详解 1.<header>元素 作用 ...
- 随记之 -- diy相册
最近一段时间楼下在整修房子,一到早晨6点多的时候,电钻声.敲打声齐鸣,实在是不能好好的睡个安稳觉 (┳_┳)... 这周六像往常一样,以为又要被惊醒了,所以早早的就醒了,谁知竟然出奇的安静,难道施工队 ...
- “盛大游戏杯”第15届上海大学程序设计联赛夏季赛暨上海高校金马五校赛题解&&源码【A,水,B,水,C,水,D,快速幂,E,优先队列,F,暴力,G,贪心+排序,H,STL乱搞,I,尼姆博弈,J,差分dp,K,二分+排序,L,矩阵快速幂,M,线段树区间更新+Lazy思想,N,超级快速幂+扩展欧里几德,O,BFS】
黑白图像直方图 发布时间: 2017年7月9日 18:30 最后更新: 2017年7月10日 21:08 时间限制: 1000ms 内存限制: 128M 描述 在一个矩形的灰度图像上,每个 ...
- 关于Docker中的Images与Containers
Docker engine提供了启动Images和containers核心的技术的支持.当你运行docker run hello-world 命令时,实际上可分为三个部分: 告诉你操作系统你正在使用的 ...
- git - 远程分支
对于用户来说,git给人提交到本地的机会.我们可以在自己的机器上创建不同的branch,来测试和存放不同的代码. 对于代码管理员而言,git有许多优良的特性.管理着不同的分支,同一套源代码可以出不一样 ...
- org.apache.hadoop.security.AccessControlException: Permission denied: user=?, access=WRITE, inode="/":hadoop:supergroup:drwxr-xr-x 异常解决
进行如下更改:vim /usr/local/hadoop/etc/hadoop/hdfs-site.xml[我的hadoop目录在/usr/local下,具体的是修改你的hadoop目录中的/etc/ ...