这篇文章会从下面几个维度来对比 HTTP 1.0 和 HTTP 1.1 和 HTTP 2.0:
Http1.1 与 Http1.0 相比,新加入了大量的状态码。
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保持不变,而是增加了更多细致的特性。
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;
域名系统 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
这样,服务器端就可以确定客户端想要请求的真正的网址了。
Http 1.1 引入了范围请求机制(range request),以避免带宽的浪费。当客户端想请求一个文件的一部分,或者需要继续下载一个已经下载了部分但被终止的文件,HTTP/1.1可以在请求中加入Range
头部,以请求(注意:只能请求字节型数据)数据的一部分。服务器端则可以忽略Range
头部,也可以返回若干Range
响应。
在 Http 1.0 中,如果一个响应体中只是包含部分数据的话,那么将会返回 206 (Partial Content) 的状态码。
在范围响应体中, 头部标志 Content-Range 指示出了该数据块的偏移量和数据块的长度。
Http1.1 中新加入了状态码 100,当存在某些大文件的请求时,该状态码 100 表示服务器可能不愿意响应这类请求,因此需要客户端再次进行确认是否继续请求该类资源。然而在 Http 1.0 中,并没有 100 (Continue) 状态码。
许多格式的数据在传输时都会做预压缩处理。数据的压缩可以大幅优化带宽的利用。然而,HTTP/1.0对数据压缩的选项提供的不多。HTTP/1.1则对内容编码(content-codings)和传输编码(transfer-codings)做了区分。内容编码总是端到端的,传输编码总是逐跳的。
Content-length
字段的作用,声明本次回应的数据长度。Content-Length
字段的前提条件是,服务器发送回应之前,必须知道回应的数据长度。对于一些很耗时的动态操作来说,这意味着,服务器要等到所有操作完成,才能发送数据,显然这样的效率不高。Content-Length
字段,而使用"分块传输编码"(chunked transfer encoding)。只要请求或回应的头信息有 Transfer-Encoding
字段,就表明回应将由数量未定的数据块组成。Cookie
和 User Agent
,一模一样的内容,每次请求都必须附带,这会浪费很多带宽,也影响速度。文章浏览阅读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
文章浏览阅读2.6k次,点赞2次,收藏6次。MEDA: Meta-Learning with Data Augmentation for Few-Shot Text Classification出发点数据增强球合成器合成模块Synthesis module转换模块Transformation module损失函数球生成器部分损失函数元学习损失训练策略实验数据集结语出发点对于小样本学习文本分类问题中,限制其性能的主要原因之一是因为对于每一个类别有多种的表示方式。所以本文提出了一种数据增强方式来解决样本不足的问题。数据增强原文的数据增强:随机替_data augmentation for meta-learning
文章浏览阅读10w+次,点赞588次,收藏3.7k次。目录SSH的安全机制SSH的安装启动服务器的SSH服务SSH两种级别的远程登录SSH的高级应用Secure Shell(SSH) 是由 IETF(The Internet Engineering Task Force) 制定的建立在应用层基础上的安全网络协议。它是专为远程登录会话(甚至可以用Windows远程登录Linux服务器进行文件互传)和其他网络服务提供安全性的协议,..._ssh @
文章浏览阅读4.6w次,点赞32次,收藏118次。Java中的byte详解介绍byte,即字节,由8位的二进制组成。在Java中,byte类型的数据是8位带符号的二进制数。在计算机中,8位带符号二进制数的取值范围是[-128, 127],所以在Java中,byte类型的取值范围也是[-128, 127]。byte取值范围分析一直在想为什么不是 -128 到 128呢?今天分析了一下这个问题。首先我们得明白一件事情,那就是运算规则(因为计算机中的数是以反码形式存储的,反码再求反码得到该数真值):正数的最高位都是 0 ,正数的值就是二进制表示的_java byte
文章浏览阅读2.8k次,点赞5次,收藏10次。默认样式(啥都没有……):一条:最大条数我设置的3:先简单说下我做的过程,希望有大佬指点,也想能够帮助到刚入门的各位同学。需求和实现:点击上传图片显示图片缩略图并不立即上传,将beforeUpdata中获取到的file存入fileList数组(multiple多选时,beforeUpdata依次传入每一张图的file),同时在beforeUpdata中要控制随后可上传的数组..._react ant-design upload图片上传 multiple
文章浏览阅读335次。转载自曹大公众号,不光是图,还有动画,读完对 Go GC 会有一个高层次的理解。这一篇是之前给极客时间 tony bai 老师专栏的供稿,经过编辑的同意,延迟几个月后可以在我的个人号上发出~本文内容只作了解,不建议作为面试题考察。武林秘籍救不了段错误包教包会包分配在各种流传甚广的 C 语言葵花宝典里,一般都有这么一条神秘的规则,不能返回局部变量:int*func(vo..._go gc
文章浏览阅读3.1w次,点赞15次,收藏102次。Vue3项目中引入 ElementUI详解,ElementPlus引入使用。_vue3 element-ui
文章浏览阅读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
文章浏览阅读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定义
文章浏览阅读76次。网络编程入门软件结构C/S结构 :全称为Client/Server结构,是指客户端和服务器结构。常见程序有QQ、迅雷等软件。B/S结构 :全称为Browser/Server结构,是指浏览器和服务器结构。常见浏览器有谷歌、火狐等。网络通信协议网络通信协议:通信协议是对计算机必须遵守的规则,只有遵守这些规则,计算机之间才能进行通信。这就好比在道路中行驶的汽车一定要遵守交通规则一样,协议中对数据..._java中网络编程课程作用大码
文章浏览阅读725次,点赞17次,收藏10次。USB8814是一款为测试音频和振动信号而设计的数据采集卡。该板卡提供8路同步模拟输入通道,24bit分辨率,每通道采样速率高达204.8KSPS,并且每通道集成独立的IEPE激励源,可直接实现对加速度传感器及麦克风等相关信号的调理。采集卡板载数字抗混叠滤波器,可有效降低高频噪声并抑制频率混叠。USB8814具备灵活的通道配置、多通道的动态信号采集,适用于诸如动态结构测试、音频/振动等高动态范围信号的采集应用场合。_8通道同步振动数据采集卡
文章浏览阅读322次。方案一:STM32系列单片机控制,该型号单片机为LQFP44封装,内部资源足够用于本次设计。STM32F103系列芯片最高工作频率可达72MHZ,在存储器的01等等待周期仿真时可达到1.25Mip/MHZ(Dhrystone2.1)。内部128k字节的闪存程序存储器,也就是说代码量可以写到128k字节,本次设计足够,内部高达20K字节的SRAM。_篮球计时器proteus