走进HTTP 协议发展史
Posted 邋遢之道
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了走进HTTP 协议发展史相关的知识,希望对你有一定的参考价值。
不论是七层的OSI模型还是四层的TCP/IP模型,都是为网络数据传输服务的。在互联网蓬勃发展的今天,HTTP 应用已占据了互联网的半壁江山,如果不了解HTTP协议,都不要意思说自己是搞应用服务的。
HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网服务器传输超文本到本地浏览器的传送协议。HTTP是基于TCP/IP通信协议来传递数据的。它是属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。HTTP协议于1990年提出,经过多年的使用与发展,得到不断地完善和扩展。目前在WWW中使用的最广泛的是HTTP/1.0的第六版,及HTTP/1.1。而最新版本 HTTP/2 更是让其成为新的技术热点。
我们可能会注意到一个人的思维,都是在螺旋中不断上升,那么对于HTTP协议的发展也同样如此。接下来我们简单介绍 HTTP 协议的历史演变和设计思路。
一、HTTP/0.9
上面页面请求命令表示,通过建立TCP 连接,从客户端向服务器发送网页(index.html)请求,并在服务器发送完毕后,就关闭TCP连接。当时的协议还规定,服务器只能回应HTML格式的字符串,不能回应别的格式。这些规定在现在看来是多么的低效和不可思议呀!
二、HTTP/1.0
2.1 请求格式
响应部分也增加了很多字段,如协议版本,状态码,状态描述,响应长度,失效时间,服务器类型等。接下来简单介绍几个我们平时需要注意的数据字段。
2.3 状态码
状态代码有三位数字组成,第一个数字定义了响应的类别,共分五种类别:
1xx:指示信息--表示请求已接收,继续处理
2xx:成功--表示请求已被成功接收、理解、接受
3xx:重定向--要完成请求必须进行更进一步的操作
4xx:客户端错误--请求有语法错误或请求无法实现
5xx:服务器端错误--服务器未能实现合法的请求
200 OK //客户端请求成功
400 Bad Request //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经授权
403 Forbidden //服务器收到请求,但是拒绝提供服务
404 Not Found //请求资源不存在
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常
text/plain
text/html
text/css
image/jpeg
image/png
audio/mp4
video/mp4
application/javascript
application/pdf
application/zip
服务器端在进行数据响应的时候,说明了自身响应的数据格式,如果客户端的浏览器解决不了,那应该怎么办。于是在客户端发送请求的时候,就需要使用Accept字段声明自己可以接受哪些数据格式。
2.5 Accept字段
Accept-Encoding请求报头:用于指定可接受的内容编码。eg:Accept-Encoding:gzip.deflate.如果请求消息中没有设置这个域,缺省是各种内容编码都可以接受。
Accept-Language请求报头:用于指定一种自然语言。eg:Accept-Language:zh-cn.如果请求消息中没有设置这个域,缺省是各种语言都可以接受。
2.6 缺点
三、HTTP/1.1
1997年1月,HTTP/1.1 版本发布,只比 1.0 版本晚了半年。它进一步完善了 HTTP 协议,一直用到了20年后的今天,直到现在还是最流行的版本。
首先,1.1 版的最大变化,就是引入了持久连接,即TCP连接默认不关闭,可以被多个请求复用,不用再显示的声明Connection: keep-alive。客户端和服务器发现对方一段时间没有活动,就可以主动关闭连接。不过规范的做法是,客户端在最后一个请求时,发送Connection: close,明确要求服务器关闭TCP连接。目前,对于同一个域名,大多数浏览器允许同时建立6个持久连接。
再次,客户端请求的头信息新增了Host字段,用来指定服务器的域名。有了Host字段,就可以将请求发往同一台服务器上的不同网站,为后续虚拟主机的兴起打下了基础。
3.1 管道机制
客户端需要请求两个资源。以前的做法是,在同一个TCP连接里面,先发送A请求,然后等待服务器做出回应,收到后再发出B请求。管道机制则是允许浏览器同时发出A请求和B请求,但是服务器还是按照顺序,先回应A请求,完成后再回应B请求。
3.2 Content-Length 字段
3.3 Transfer-Encoding 字段
书接上文,我们能使用Content-Length字段的前提条件是,服务器发送回应之前,必须知道回应的数据长度。但对于一些很耗时的操作来说,这就意味着,服务器需要等到所有操作完成,才能发送响应数据,有时可能黄花菜都凉了。那我们能怎么办,只能生产一块数据就发送一块,采用"流模式"(stream)取代"缓存模式"。因此,1.1版规定可以不使用Content-Length字段,而使用"分块传输编码"。只要请求或响应的头信息有Transfer-Encoding字段,就表明响应数据将由数量未定的数据块组成。
四、HTTP/2
2015年,HTTP/2 发布。它不叫 HTTP/2.0,是因为标准委员会不打算再发布子版本了。我们接下来看下HTTP/2又给我们提供了什么新功能。
4.1 二进制协议
我们知道HTTP/1.1 版的头信息肯定是文本,数据体可以是文本,也可以是二进制。HTTP/2 则是一个彻底的二进制协议,头信息和数据体都是二进制,并且统称为"帧"(frame):头信息帧和数据帧。二进制协议的一个好处是,可以定义额外的帧,为将来的高级应用打好了基础。如果使用文本实现这种功能,解析数据将会变得非常麻烦。
4.2 多工
4.3 数据流
4.4 头信息压缩
4.5 服务器推送
协议在改进,技术在进步,我们所面对的世界唯一不变的就是变化。但万变不离其宗,HTTP的基础是建立在TCP协议上的,只是在端到端发送数据的时候,加了很多标识字段,做了相应的数据优化等。
以上是关于走进HTTP 协议发展史的主要内容,如果未能解决你的问题,请参考以下文章