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. 【Windows】KMS 激活命令记录

    目录 KMS 服务器激活 Office.Visio 推荐使用 office tool plus 部署并配置 KMS 激活 什么是 KMS? KMS 正版与否的区别 总结 KMS 服务器激活 利用 KM ...

  2. 如何将现有的`Blazor`项目的主题切换写的更好看?

    如何将现有的Blazor项目的主题切换写的更好看? 在现有的系统当中,我们的主题切换会比较生硬,下面我们将基于Masa Blazor实现好看的扩散主题切换的样式效果. 安装MASA.Template ...

  3. GitHub Actions CI/CD 工作流实战

    1. 什么是 GitHub Actions 与 workflow ? GitHub Actions 是 GitHub 提供的一种持续集成(CI)和持续部署(CD)的工具,用于自动化软件开发过程中的各种 ...

  4. 应用程序接口(API)安全的入门指南

    ​  什么是 API?​ 对于初学者来说,API 是指为两个不同的应用之间实现流畅通信,而设计的应用程序编程接口.它通常被称为应用程序的"中间人".由于我们需要保护用户的持有数据. ...

  5. 记一次 Redisson 线上问题 → ERR unknown command 'WAIT' 的排查与分析

    开心一刻 昨晚和一个朋友聊天 我:处对象吗,咱俩试试? 朋友:我有对象 我:我不信,有对象不公开? 朋友:不好公开,我当的小三 问题背景 程序在生产环境稳定的跑着 直到有一天,公司执行组件漏洞扫描,有 ...

  6. C++指针和地址偏移在HotSpot VM中的应用

    在前面我们介绍过new运算符,这个操作实际上上包含了如下3个步骤: 调用operator new的标准库函数.此函数会分配一块内存空间以便函存储相应类型的实例. 调用相应类的构造函数 返回一个指向该对 ...

  7. vue~封装一个文本框添加与删除的组件

    标签组件的效果如下 组件作用 这是一个div,包含了两个文本框,后面是添加和删除按钮 添加按钮复制出新的div,除了文本框没有内容,其它都上面一样 删除按钮将当前行div删除 组件实现 <tem ...

  8. oracle优化-分页查询的错误认识

    对于分页查询,上一篇文章总结了实现分页查询的办法.同时给出等价写法,另外在执行计划角度验证SQL的等价性https://www.cnblogs.com/handhead/p/13856505.html ...

  9. 【matplotlib 实战】--堆叠面积图

    堆叠面积图和面积图都是用于展示数据随时间变化趋势的统计图表,但它们的特点有所不同.面积图的特点在于它能够直观地展示数量之间的关系,而且不需要标注数据点,可以轻松地观察数据的变化趋势.而堆叠面积图则更适 ...

  10. QQ机器人整理合集

    QQ机器人有什么用呢? QQ机器人可以实现包括自动回复.定时推送.发送图片QQ机器人,营销圈用的比较多,可以开发各种自动功能等等.用其制作的QQ机器人程序 机器人框架+插件 小栗子机器人 官网:htt ...