网络协议 (三) Http1.0 vs Http1.1 vs Http2.0 (应用层)_http1.0和http1.1哪个占用资源-程序员宅基地

技术标签: Java  网络  网络协议  Android  

这篇文章会从下面几个维度来对比 HTTP 1.0 和 HTTP 1.1 和 HTTP 2.0:

  • 响应状态码
  • 缓存处理
  • 连接方式
  • Host头处理
  • 带宽优化

1. 响应状态码

Http1.1 与 Http1.0 相比,新加入了大量的状态码。

2. 缓存处理

Http1.0 中的缓存机制非常简单,服务端使用 Expires 标签来标识一个相应体,在 Expires 标志的时间内的所有请求,获得的都会是缓存。

服务端 初次返回给 客户端 的响应体中,会有一个 Last-Modified 标签,该标签标记了被请求资源在服务器端的最后一次修改的时间。

在请求头中使用 If-Modified-Since 标签来 器:“该时间之前,要请求的资源是否有被修改过?”。

通常情况下, If-Modified-Since 的值即为上一次获得该资源时,响应体中的 Last-Modified 的值。

服务器接收到请求头之后,会判断 If-Modified-Since 时间,如果资源没有被修改过,则返回给客户端一个 304 not modified 的相应头,表示 "缓存可用,你直接从本地里拿吧"。

HTTP/1.1的缓存机制在HTTP/1.0的基础上,大大增加了灵活性和扩展性。基本工作原理和HTTP/1.0保持不变,而是增加了更多细致的特性。

3. 连接方式

Http 1.0 默认使用的是短链接,即客户端和服务端的每一次通信操作,都会建立一个新的链接,任务结束后就会中断链接,这样就会导致有大量的 "握手报文" 和 "挥手报文" 占用带宽。但是可以主动采用在请求头部加上 Connection:keep-alive,来要求服务器不要关闭TCP连接,以便其他请求复用。但是这样也需要客户端手动关闭连接 Connection: close。

为了解决资源浪费问题,Http 1.1 优化为默认长链接模式。客户端采用长链接的模式,通过请求报文来通知服务端:“向你发起请求链接,并且链接成功建立后,请不要关闭”。在后续的CS通信中,该TCP链接就会一直处于打开状态。

TCP链接一直保持开启的话,对于服务器资源来说,也是一种资源浪费。因此像 Apache 这样的服务器软件,还会支持超时自动关闭 TCP 链接的设置。

注意:在 Http1.0 中也提供了长链接的选项,也就是需要在请求头中加入 Connection: Keep-alive ;同样的,在 Http1.1 中如果想关闭长链接,则可以在请求头中加入 Connection: close;

4. Host 头处理

域名系统 DNS 允许多个主机名,绑定到同一个域名上。但是在 Http1.0中并没有考虑这个问题。

假设我们有一个资源URL是 http://example1.org/home.html,HTTP/1.0的请求报文中,将会请求的是GET /home.html HTTP/1.0.也就是不会加入主机名。这样的报文送到服务器端,服务器是理解不了客户端想请求的真正网址。

因此,HTTP/1.1在请求头中加入了Host字段。加入Host字段的报文头部将会是:

GET /home.html HTTP/1.1
Host: example1.org

这样,服务器端就可以确定客户端想要请求的真正的网址了。

5. 带宽优化

5.1 范围请求

Http 1.1 引入了范围请求机制(range request),以避免带宽的浪费。当客户端想请求一个文件的一部分,或者需要继续下载一个已经下载了部分但被终止的文件,HTTP/1.1可以在请求中加入Range头部,以请求(注意:只能请求字节型数据)数据的一部分。服务器端则可以忽略Range头部,也可以返回若干Range响应。

在 Http 1.0 中,如果一个响应体中只是包含部分数据的话,那么将会返回 206 (Partial Content) 的状态码。

在范围响应体中, 头部标志 Content-Range 指示出了该数据块的偏移量数据块的长度

5.2 状态码 100

Http1.1 中新加入了状态码 100,当存在某些大文件的请求时,该状态码 100 表示服务器可能不愿意响应这类请求,因此需要客户端再次进行确认是否继续请求该类资源。然而在 Http 1.0 中,并没有 100 (Continue) 状态码。

 5.3. 压缩

许多格式的数据在传输时都会做预压缩处理。数据的压缩可以大幅优化带宽的利用。然而,HTTP/1.0对数据压缩的选项提供的不多。HTTP/1.1则对内容编码(content-codings)和传输编码(transfer-codings)做了区分。内容编码总是端到端的,传输编码总是逐跳的。

Http 1.1 的特点

  • 加入了管道机制
    在同一个 TCP 连接里,允许多个请求同时发送,增加了并发性,进一步改善了 HTTP 协议的效率。
    举例来说,客户端需要请求两个资源。以前的做法是,在同一个 TCP 连接里面,先发送 A 请求,然后等待服务器做出回应,收到后再发出 B 请求。
    管道机制则是允许浏览器同时发出 A 请求和 B 请求,但是服务器还是按照顺序,先回应 A 请求,完成后再回应 B 请求。
    一个 TCP 连接现在可以传送多个回应,势必就要有一种机制,区分数据包是属于哪一个回应的。这就是 Content-length 字段的作用,声明本次回应的数据长度。
  • 分块传输编码
    使用 Content-Length 字段的前提条件是,服务器发送回应之前,必须知道回应的数据长度。对于一些很耗时的动态操作来说,这意味着,服务器要等到所有操作完成,才能发送数据,显然这样的效率不高。
    更好的处理方法是,产生一块数据,就发送一块,采用"流模式"(stream)取代"缓存模式"(buffer)。
    因此,HTTP 1.1 版本规定可以不使用 Content-Length 字段,而使用"分块传输编码"(chunked transfer encoding)。只要请求或回应的头信息有 Transfer-Encoding 字段,就表明回应将由数量未定的数据块组成。
  • 新增了请求方式 PUT、PATCH、OPTIONS、DELETE 等。
  • 客户端请求的头信息新增了 Host 字段,用来指定服务器的域名。
  • HTTP 1.1 支持文件断点续传,RANGE:bytes,HTTP 1.0 每次传送文件都是从文件头开始,即 0 字节处开始。RANGE:bytes=XXXX 表示要求服务器从文件 XXXX 字节处开始传送,断点续传。即返回码是 206(Partial Content)

Http2.0 的特点

  • 二进制协议
    HTTP 1.1 版的头信息肯定是文本(ASCII 编码),数据体可以是文本,也可以是二进制。
    HTTP 2.0 则是一个彻底的二进制协议,头信息和数据体都是二进制,并且统称为"帧"(frame):头信息帧和数据帧。
  • 多工
    HTTP 2.0 复用 TCP 连接,在一个连接里,客户端和浏览器都可以同时发送多个请求或回应,而且不用按照顺序一一对应,这样就避免了"队头堵塞"(HTTP 2.0 使用了多路复用的技术,做到同一个连接并发处理多个请求,而且并发请求的数量比 HTTP 1.1大了好几个数量级)。
    举例来说,在一个 TCP 连接里面,服务器同时收到了 A 请求和 B 请求,于是先回应 A 请求,结果发现处理过程非常耗时,于是就发送 A 请求已经处理好的部分, 接着回应 B 请求,完成后,再发送 A 请求剩下的部分。
  • 头信息压缩
    HTTP 协议不带有状态,每次请求都必须附上所有信息。所以,请求的很多字段都是重复的,比如 Cookie 和 User Agent,一模一样的内容,每次请求都必须附带,这会浪费很多带宽,也影响速度。
    HTTP 2.0 对这一点做了优化,引入了头信息压缩机制(header compression)。一方面,头信息使用 gzip 或c ompress 压缩后再发送;另一方面,客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号,以后就不发送同样字段了,只发送索引号,这样就提高速度了。
  • 服务器推送
    HTTP 2.0 允许服务器未经请求,主动向客户端发送资源,这叫做服务器推送(server push)。意思是说,当我们对支持 HTTP 2.0 的 web server 请求数据的时候,服务器会顺便把一些客户端需要的资源一起推送到客户端,免得客户端再次创建连接发送请求到服务器端获取。这种方式非常合适加载静态资源。 服务器端推送的这些资源其实存在客户端的某处地方,客户端直接从本地加载这些资源就可以了,不用走网络,速度自然是快很多的。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_49508485/article/details/124255304

智能推荐

ROS环境下串口通信_ifr_interface::msg::serialgimbal toros(){ ifr_inte-程序员宅基地

文章浏览阅读1.3w次,点赞5次,收藏67次。1. 环境:操作系统: Ubuntu 14.04ROS版本: ROS Indigo2. 步骤:2.1 下载安装ROS对应版本的工具包(此处为indigo版)输入以下命令安装:sudo apt-get-install ros-indigo-serial重启终端,输入以下命令可以检测到serial包的路径说明已经安装好:(路径为 opt/ros/in..._ifr_interface::msg::serialgimbal toros(){ ifr_interface::msg::serialgimbal m

小样本学习记录————文本中特征空间的数据增强MEDA: Meta-Learning with Data Augmentation for Few-Shot Text Classification_data augmentation for meta-learning-程序员宅基地

文章浏览阅读2.6k次,点赞2次,收藏6次。MEDA: Meta-Learning with Data Augmentation for Few-Shot Text Classification出发点数据增强球合成器合成模块Synthesis module转换模块Transformation module损失函数球生成器部分损失函数元学习损失训练策略实验数据集结语出发点对于小样本学习文本分类问题中,限制其性能的主要原因之一是因为对于每一个类别有多种的表示方式。所以本文提出了一种数据增强方式来解决样本不足的问题。数据增强原文的数据增强:随机替_data augmentation for meta-learning

SSH简介及两种远程登录的方法_ssh @-程序员宅基地

文章浏览阅读10w+次,点赞588次,收藏3.7k次。目录SSH的安全机制SSH的安装启动服务器的SSH服务SSH两种级别的远程登录SSH的高级应用Secure Shell(SSH) 是由 IETF(The Internet Engineering Task Force) 制定的建立在应用层基础上的安全网络协议。它是专为远程登录会话(甚至可以用Windows远程登录Linux服务器进行文件互传)和其他网络服务提供安全性的协议,..._ssh @

Java中的byte详解_java byte-程序员宅基地

文章浏览阅读4.6w次,点赞32次,收藏118次。Java中的byte详解介绍byte,即字节,由8位的二进制组成。在Java中,byte类型的数据是8位带符号的二进制数。在计算机中,8位带符号二进制数的取值范围是[-128, 127],所以在Java中,byte类型的取值范围也是[-128, 127]。byte取值范围分析一直在想为什么不是 -128 到 128呢?今天分析了一下这个问题。首先我们得明白一件事情,那就是运算规则(因为计算机中的数是以反码形式存储的,反码再求反码得到该数真值):正数的最高位都是 0 ,正数的值就是二进制表示的_java byte

ant design 照片墙样式手动上传多图 支持multiple_react ant-design upload图片上传 multiple-程序员宅基地

文章浏览阅读2.8k次,点赞5次,收藏10次。默认样式(啥都没有……):一条:最大条数我设置的3:先简单说下我做的过程,希望有大佬指点,也想能够帮助到刚入门的各位同学。需求和实现:点击上传图片显示图片缩略图并不立即上传,将beforeUpdata中获取到的file存入fileList数组(multiple多选时,beforeUpdata依次传入每一张图的file),同时在beforeUpdata中要控制随后可上传的数组..._react ant-design upload图片上传 multiple

图解 Go GC-程序员宅基地

文章浏览阅读335次。转载自曹大公众号,不光是图,还有动画,读完对 Go GC 会有一个高层次的理解。这一篇是之前给极客时间 tony bai 老师专栏的供稿,经过编辑的同意,延迟几个月后可以在我的个人号上发出~本文内容只作了解,不建议作为面试题考察。武林秘籍救不了段错误包教包会包分配在各种流传甚广的 C 语言葵花宝典里,一般都有这么一条神秘的规则,不能返回局部变量:int*func(vo..._go gc

随便推点

Vue3项目中引入ElementUI使用详解_vue3 element-ui-程序员宅基地

文章浏览阅读3.1w次,点赞15次,收藏102次。Vue3项目中引入 ElementUI详解,ElementPlus引入使用。_vue3 element-ui

python爬虫框架scarpy之AttributeError: module 'scrapy' has no attribute 'spider'-程序员宅基地

文章浏览阅读6.3k次。用scrapy的spider做爬虫,发现运行有问题。源码:import scrapyclass PpdSpider(scrapy.spider): name='PpdSpider' start_url=['http://www.dailianmeng.com/p2pblacklist/index.html'] def parse(self,response): _module 'scrapy' has no attribute 'spider

java map定义_Java Map定义的方法-程序员宅基地

文章浏览阅读4.9k次。package com.abin.map.test;import java.util.HashMap;import java.util.Iterator;import java.util.Map;import java.util.Set;public class MapTestOne {public static Map addMap(){Map map=new HashMap();for(int..._java map定义

Java就业课程网络编程(11)_java中网络编程课程作用大码-程序员宅基地

文章浏览阅读76次。网络编程入门软件结构C/S结构 :全称为Client/Server结构,是指客户端和服务器结构。常见程序有QQ、迅雷等软件。B/S结构 :全称为Browser/Server结构,是指浏览器和服务器结构。常见浏览器有谷歌、火狐等。网络通信协议网络通信协议:通信协议是对计算机必须遵守的规则,只有遵守这些规则,计算机之间才能进行通信。这就好比在道路中行驶的汽车一定要遵守交通规则一样,协议中对数据..._java中网络编程课程作用大码

USB8814动态信号采集卡——声音振动类信号处理的理想之选!_8通道同步振动数据采集卡-程序员宅基地

文章浏览阅读725次,点赞17次,收藏10次。USB8814是一款为测试音频和振动信号而设计的数据采集卡。该板卡提供8路同步模拟输入通道,24bit分辨率,每通道采样速率高达204.8KSPS,并且每通道集成独立的IEPE激励源,可直接实现对加速度传感器及麦克风等相关信号的调理。采集卡板载数字抗混叠滤波器,可有效降低高频噪声并抑制频率混叠。USB8814具备灵活的通道配置、多通道的动态信号采集,适用于诸如动态结构测试、音频/振动等高动态范围信号的采集应用场合。_8通道同步振动数据采集卡

253、仿真-基于51单片机篮球计时计分器Proteus仿真设计(程序+Proteus仿真+原理图+PCB源文件+参考论文+开题报告+任务书+元器件清单+硬件框图+配套资料等)_篮球计时器proteus-程序员宅基地

文章浏览阅读322次。方案一:STM32系列单片机控制,该型号单片机为LQFP44封装,内部资源足够用于本次设计。STM32F103系列芯片最高工作频率可达72MHZ,在存储器的01等等待周期仿真时可达到1.25Mip/MHZ(Dhrystone2.1)。内部128k字节的闪存程序存储器,也就是说代码量可以写到128k字节,本次设计足够,内部高达20K字节的SRAM。_篮球计时器proteus

推荐文章

热门文章

相关标签