Http协议

Http协议是基于TCP/IP协议的应用层协议,不涉及数据包的传输,主要规范服务端和客户端的通信格式,默认端口80,下面来初步了解一下http的历史发展过程

一、HTTP/0.9

http协议最早是1991年发布的0.9版本,当时http协议极其简单,只有一个get请求方法

GET/index.html

上面是当tcp连接成功后,客户端向服务端请求index.html文件

<html>
  <body>Hello World</body>
</html>

而服务器返回的内容也只能是html格式的文件

二、HTTP/1.0

1996年5月发布了第二个版本也就是1.0,该版本丰富了不少内容。
1、可以发送各种格式的文件,不仅限于html文件;
2、增加post、head命令,丰富了服务器与客户端的交互方式;
3、请求和回应都要包含http头信息,用来描述一下元数据;
4、还新增了一些功能,包括状态码(status code)、多字符集支持、多部分发送(multi-part type)、权限(authorization)、缓存(cache)、内容编码(content encoding)等。

1.0版本的请求格式:

GET / HTTP/1.0User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5)Accept: */*

请求必须添加协议版本,后面还有多行头信息,表示对客户端的描述。因为可以发送多种格式文件,所以客户端可以在请求时说明请求文件的格式,上面Accept后面表示接收所以类型格式的文件

回应格式:

HTTP/1.0 200 OK 
Content-Type: text/plain
Content-Length: 137582
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 World</body>
</html>

格式相对清晰,协议版本+响应状态码+响应结果描述,后面就是多行头信息+一行空白+响应内容

针对可以发送各种文件,产生了Content-Type字段,作用是为了告诉客户端响应的内容是哪种格式文件,
常见的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-Encoding字段来表示使用哪种压缩方式

Content-Encoding: gzip
Content-Encoding: compress
Content-Encoding: deflate

客户端也可以说能接收哪种压缩方法的文件

Accept-Encoding: gzip, deflate

当然1.0有个严重的缺点就是一次只能发送一个请求,只要请求-响应完毕就好关闭TCP连接,这样每一次请求都要重新创建一次TCP连接,请求成本高,而且开始的发送速率慢,因此出现一个非标准的字段Connection

Connection: keep-alive

如上请求就可以告诉服务器不要关闭TCP连接,但其不是标准的字段,在不同机器可能有不同的实现方式,所以还是会出现问题

三、HTTP/1.1

1997年1月,不到半年的时间HTTP有更新了一个版本1.1,这个版本可以说很耐用,因为现在都在用着

1、其他的不说,1.1版本首先就支持持久连接功能,也就是说无需声明Connection: keep-alive字段,客户端和服务器就一直连接着,直到服务器去主动关闭连接。所以可以在同一个TCP连接中发送多个请求;
2、引入管道机制,使得客户端可以同时发送多个请求,而不必等到服务端响应了第一个请求才能发送第二个请求;
3、针对耗时操作,又引入了分块传输编码,如果要等整个操作完成才发送数据,明显是不合理的,所以可以分成多个块,每完成一块就发送一块;
4、请求信息新增了一个Host字段,用来生命客户端主机名,这样就可以访问同一主机下的不同站点。

当然1.1虽然是现在的流行版本,但其也有缺点。
虽然可以同时发送多个请求,但响应还是要一个个按顺序来响应,如果第一个响应是相当慢,那么其他响应就只能在那干等着,也就说所谓的队头阻塞。
为了避免这个问题,只有两种方法:
1、是减少请求数;
2、是同时多开持久连接。这导致了很多的网页优化技巧,比如合并脚本和样式表、将图片嵌入CSS代码、域名分片(domain sharding)等等。
其实只要HTTP协议设计得更好一些,这些额外的工作是可以避免的。(Http:“怪我咯”)

四、HTTP/2

至于为什么是2,而不是2.0自行百度
2这个版本又完善1.1的不足
1、多工的概念,直接举个例子说明:
在一个TCP连接里面,服务器同时收到了A请求和B请求,于是先回应A请求,结果发现处理过程非常耗时,于是就发送A请求已经处理好的部分, 接着回应B请求,完成后,再发送A请求剩下的部分。
这样双向的、实时的通信,就叫做多工(Multiplexing);
2、不同于1.1版本,2 版本是绝对的二到底,无论头信息还是数据体都是二进制文件;
3、因为响应时不按顺序进行,而且响应的数据包也不可能一次发完,只能分批进行,这样就必须做好标记。对于同一个请求的所有响应数据包称为一个数据流,所以这个标记就是这个数据流的编号,每发送一个数据包就要打上这个数据流的编号。这个数据流还有一些妙用,例如取消数据流不会关闭TCP连接,也就说可以继续响应其他请求,而且如果想要某个响应快点可以给其数据流设置优先级;
4、HTTP/2 还引入了头信息压缩机制(header compression)。一方面,头信息使用gzip或compress压缩后再发送;另一方面,客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号,以后就不发送同样字段了,只发送索引号,这样就提高速度了;
5、HTTP/2 允许服务器未经请求,主动向客户端发送资源,这叫做服务器推送(server push)。
常见场景是客户端请求一个网页,这个网页里面包含很多静态资源。正常情况下,客户端必须收到网页后,解析HTML源码,发现有静态资源,再发出静态资源请求。其实,服务器可以预期到客户端请求网页后,很可能会再请求静态资源,所以就主动把这些静态资源随着网页一起发给客户端了。

总结

http的历史演变就是这么简单的4个版本,下篇内容说说android上的http协议的使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值