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. 红帽RHCE考题总结练习(8.0 ansible)

    本文是红帽RHCE考题的总结,个别题目写了多种步骤. 一.安装和配置ansible 题目: 按照下方所述,在控制节点 bastion.lab.example.com 上安装和配置 Ansible: 安 ...

  2. AI绘画| 迪士尼风格|可爱头像【附Midjourney提示词】

    Midjourney案例分享 图片预览 迪士尼风格|可爱头像 高清原图及关键词Prompt已经放在文末网盘,需要的自取 在数字艺术的新时代,人工智能绘画已经迅速崭露头角.作为最先进的技术之一,AI绘画 ...

  3. Web通用漏洞--sql注入

    SQL注入 mysql注入目的:获取当前web权限 mysql注入--常规查询&union联合查询 MYSQL--Web组成架构 服务器搭建web服务可能存在多个站点搭建在一台服务器中,数据集 ...

  4. 线程方法接收参数和返回参数,Java的两种线程实现方式对比

    The difference beteen two way 总所周知,Java实现多线程有两种方式,分别是继承Thread类和实现Runable接口,那么它们的区别是什么? 继承 Thread 类: ...

  5. 学习JavaScript的路径

    学习JavaScript的路径可以按照以下步骤进行: 了解基本概念:首先学习JavaScript的基本概念,包括变量.数据类型.运算符.数组.对象.循环和条件语句等.可以通过阅读相关的教材.在线课程或 ...

  6. 用shell命令绘制三角形

    本文旨在通过几个经典的图案来练习shell编程,涉及知识点:for循环,大小比较,基本的数学公式计算,echo小技巧.update:2019-10-17 10:13:54 初次绘制 $ for ((l ...

  7. K8s 多集群实践思考和探索

    作者:vivo 互联网容器团队 - Zhang Rong 本文主要讲述了一些对于K8s多集群管理的思考,包括为什么需要多集群.多集群的优势以及现有的一些基于Kubernetes衍生出的多集群管理架构实 ...

  8. KRPANO资源分析工具下载720THINK全景图

    提示:目前分析工具中的全景图下载功能将被极速全景图下载大师替代,相比分析工具,极速全景图下载大师支持更多的网站(包括各类KRPano全景网站,和百度街景) 详细可以查看如下的链接: 极速全景图下载大师 ...

  9. LeetCode 周赛上分之旅 #45 精妙的 O(lgn) 扫描算法与树上 DP 问题

    ️ 本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 和 BaguTree Pro 知识星球提问. 学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越 ...

  10. JavaAgent寄生在目标进程中引起的ClassNotFoundException

    今天有解决方案部的小伙伴反映,我公司XWind产品在分析客户应用程序的潜在性能问题时,总是显现诊断任务异常,为了定位问题的根因,我们马上要求解决方案部的小伙伴提供XWind相关的日志,从日志中找到了如 ...