Http的演进

Http在1.1版本之前具有无状态的特点,每次请求都需要通过TCP三次握手四次挥手与服务器重新建立连接。比如某个客户端在短时间多次请求同一个资源,服务器并不能区别是否已经响应过用户请求,所以每次需要重新响应请求、耗费不必要的时间和流量。为了节省资源消耗,Http也进行了发展和演进,通过持久连接的方法来进行连接复用。

Http的1.0版本

​ 第一个版本的Http是Http0.9,组成极其简单,只允许客户端发送Get这一种请求,且不支持请求头。由于没有协议头,因此Http0.9协议只支持一种内容,即纯文本。不过网页依然支持用html语言格式化,同时无法插入图片。

​ http的第二个版本为1.0版本,也是第一个在通信中指定版本号的Http版本,至今依然被广泛采用。相对于Http0.9版本,Http1.0版本增加了如下主要特性:

​ (1) 请求与响应支持头部字段

(2) 响应对象以一个响应状态行开始。

(3) 响应对象不只限于超文本。

(4) 开始支持客户端通过Post方法向web服务器提交数据,支持GET、Head、Post方法

(5) 支持长连接,但默认使用短连接,缓存机制,以及身份认证。

(6) 请求行必须在尾部添加协议版本字段(Http1.0),必须包含头部消息。

​ http请求访问的资源不再局限上一个版本的Html格式,可以根据Content-Type设置访问的格式;同时也开始支持Cache。当客户端在规定时间内访问同一URL资源时,直接访问Cache即可。



http请求访问的资源不再局限上一个版本的Html格式,可以根据Content-Type设置访问的格式;同时也开始支持Cache。当客户端在规定时间内访问同一URL资源时,直接访问Cache即可。

MIME类型的每个值包括一级类型和二级类型,之间用斜杠分隔。除了预定义的类型,厂商也可以自定义类型,例如下面是一个自定义类型的例子:

application/vnd.debian.binary-package

上面的自定义MIME类型表明发送的是Debian系统的二进制数据包。

MIME类型值还可以在尾部使用分号、添加参数,下面是一个添加参数的例子:

Content-type: text/html;charset=utf-8

上面的类型值表面Http报文中的报文中的内容是文本网页数据,并且文本编码为utf-8

客户端在发送请求时可以使用Accept头部字段声明自己可以接受哪些数据格式。下面是一个Accept的例子:

Accept: */*

上面的Accept头部字段表明客户端声明自己可以接受来自服务端的任何格式的数据。

由于文本数据发送的时候往往可以通过压缩大大节省带宽,因此Http1.0版本协议可以支持把数据压缩后发送,其报文Content-Encoding头部用于说明数据的压缩格式。

http的1.1版本

Http1.1版本引入了许多关键技术:持久连接、管道机制、分块传输编码、字节范围请求等。

持久连接:即下层的TCP连接默认不关闭,可以被多个请求复用。

管道机制:在同一个tcp连接里允许多个请求同时发送,但是服务器还是按照顺序依次处理。(类似于前端同时发送两个请求给后端)

http1.1新增了put、patch、options、delete等多种请求方法。

http1.1版本客户端请求的头部信息新增了host字段,用来指定服务器的域名,还加了一个新的状态码100.(比如404之类的)

分块传输编码:该机制允许服务端将数据分成多个部分发送到客户端。普通的服务器响应会将响应数据的长度通过Content-Length字段告诉客户端。它主要是用Transfer-Encoding字段

Transfer-Encoding:chunked

每个分块包含十六进制的长度值和数据,其中长度值独占一行。长度不包括分块长度和(\r\n)的长度,也不包括分块数据后面结尾(\r\n)的长度。

最后一个分块的长度值必须为0,对应的分块数据没有内容,表示所有的body数据传输完成。

Http的2.0版本

它是一个二进制协议,传输效率明显提高,但是这样需要客户端和服务端都要引入新的二进制编码和解码的机制。

Protobuf,各位可以去了解一下。

好了,感兴趣的话,可以看看宝宝之前的博客吗0.0

参考文献:java高并发核心编程 Nio、netty、redis、zookeeper 作者:尼恩

Http的演进的更多相关文章

  1. 【腾讯Bugly干货分享】微信热补丁Tinker的实践演进之路

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57ad7a70eaed47bb2699e68e Dev Club 是一个交流移动 ...

  2. 【腾讯bugly干货分享】微信Android热补丁实践演进之路

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://bugly.qq.com/bbs/forum.php?mod=viewthread&tid=1264& ...

  3. Atitit 软件架构方法的进化与演进cs bs soa roa  msa  attilax总结

    Atitit 软件架构方法的进化与演进cs bs soa roa  msa  attilax总结 1.1. 软件体系架构是沿着单机到 CS 架构,再到 BS 的三层架构甚至多层架构逐步发展过来的,关于 ...

  4. Atitit 编程语言编程方法的进化演进 sp  COP ,AOP ,SOP

    Atitit 编程语言编程方法的进化演进 sp  COP ,AOP ,SOP 1.1.  Sp  oop>>COP ,AOP ,SOP1 1.2. Sp  oop 结构化方法SP(Stru ...

  5. PHP的性能演进(从PHP5.0到PHP7.1的性能全评测)

    本文是最初是来自国外的这篇:PHP Performance Evolution 2016, 感谢高可用架构公众号翻译成了中文版, 此处是转载的高可用架构翻译后的文章从PHP 5到PHP 7性能全评测( ...

  6. debian的版本演进

    debian有三个发行版本,stable版.testing版和unstable版. 其中,unstable版本是开发者正在开发的版本,它里面保存着debian的开发者当前的工作.这个版本是不断在被更新 ...

  7. 第一章 Java的I/O演进之路

    I/O基础入门 Java的I/O演进 第一章 Java的I/O演进之路 1.1 I/O基础入门 1.1.1 Linux网络I/O模型简介 根据UNIX网络编程对I/O模型的分类,UNIX提供了5中I/ ...

  8. 聚光灯下的熊猫TV技术架构演进

    2015年开始的百播大战,熊猫TV是其中比较特别的一员. 说熊猫TV是含着金钥匙出生的公子哥不为过.还未上线,就频频曝光,科技号,微博稿,站上风口浪尖.内测期间更是有不少淘宝店高价倒卖邀请码,光内测时 ...

  9. 微信Android客户端架构演进之路

    这是一个典型的Android应用在从小到大的成长过程中的“踩坑”与“填坑”的历史.互联网的变化速度如此之快,1年的时间里,可以发生翻天覆地的变化.今天在这里,重新和大家回顾微信客户端架构的演进过程,以 ...

  10. 规范化的软件项目演进管理--从 Github 使用说起

    规范化的软件项目演进管理 从 Github 使用说起 1   前言 首先,本文的层次定位是:很基本很基础的 Github 工具的入门级应用,写给入门级的用户看的. 基本上工作过几年的人,下面描述的这些 ...

随机推荐

  1. jQuery Mobile 使用中的问题

    1.点击data-role="page"内的页面,会自动隐藏头部栏和尾部栏. 在data-role="header"或data-role="foote ...

  2. Airtest的iOS实用接口介绍

    1. 前言 前段时间Airtest更新了1.3.0.1版本,里面涉及非常多的iOS功能新增和改动,今天想详细跟大家聊一下里面的iOS设备接口. PS:本文示例均使用本地连接的iOS设备,Airtest ...

  3. Linux 内核 ASoC DMA 引擎驱动程序

    Linux 内核 ASoC 框架,在概念上将嵌入式音频系统拆分为多个可复用的组件驱动程序,包括 Codec 类驱动程序.平台类驱动程序和机器类驱动程序.在实现上,机器类驱动程序用 struct snd ...

  4. Go 并发编程 - 并发安全(二)

    什么是并发安全 并发情况下,多个线程或协程会同时操作同一个资源,例如变量.数据结构.文件等.如果不保证并发安全,就可能导致数据竞争.脏读.脏写.死锁.活锁.饥饿等一系列并发问题,产生重大的安全隐患,比 ...

  5. 在.NET Framework中使用RocketMQ(阿里云版)实战【第二章】

    章节 第一章:https://www.cnblogs.com/kimiliucn/p/17662052.html 第二章:https://www.cnblogs.com/kimiliucn/p/176 ...

  6. QA|不同模块之间的引用(导入问题)问题;|Pycharm

    结构如图,在xxu的test.py中想要导入t2包中的sayhello和word两个方法 注意:首先需要打开xxu和t2的上层目录,因为解释器是从打开的那个文件开始查找的,所以这里应该打开B01_01 ...

  7. springboot项目自动关闭进程重启脚本

    话不多说,先上脚本 kill -15 $(netstat -nlp | grep :9095 | awk '{print $7}' | awk -F"/" '{ print $1 ...

  8. Springboot多种字段copy工具比较

    结论:推荐使用spring自带的copy工具,不能copy的手动set 1.springboot自带的BeanUtils.copyProperties package com.admin; impor ...

  9. PYQT5学习(13):QMidArea同时显示多个窗口,创建多个独立的窗口

    QMidArea  参考文章:https://blog.csdn.net/jia666666/article/details/81670569 一种同时显示多个窗口的方法,创建多个独立的窗口,这些独立 ...

  10. Arrays.asList():使用指南

    Arrays.asList() 是一个 Java 的静态方法,它可以把一个数组或者多个参数转换成一个 List 集合.这个方法可以作为数组和集合之间的桥梁,方便我们使用集合的一些方法和特性.本文将介绍 ...