1、什么是软件测试?
在规定的条件下对程序进行操作,以免出现程序错误,衡量软件质量,并对其能否满足设计要求进行评估的过程。
软件测试的目标?
在软件投入生产运行之前尽可能发现软件中的错误,是保证软件质量的关键性步骤。根本目标是尽可能地发现并且排除隐藏的错误,最终把高质量的软件系统交给用户。
软件测试的原则?
1、所有测试的标准必须建立在用户需求之上
2、遵循质量第一的思想,当时间和质量冲突的时候,时间要服从质量
3、事先定义好产品的质量标准,只有有了质量标准,才能根据测试的结果,对产品的质量进行分析和评估
4、软件项目启动之后,软件测试也就是开始了,而不是等程序写完,才开始测试
5、穷举测试不可能
6、第三方测试会更加可观、更加有效
7、软件测试计划是做好软件测试工作的前提
8、测试用例是要设计出来的,不是写出来的,要根据软件测试的目的,采用相应的方法去设计测试用例,从而提高测试的效率,更多的发现错误,提高程序的可靠性
9、对于发现程序错误的程序段,应该进行更加深入的测试,程序中发现的错误越多,其中存在错误概率也越大
10、重视文档,妥善保管一切测试文档
11、尽早和不断地测试是测试人员的座右铭
12、回归测试关联性一定要引起充分的注意,修改一个错误引起更多的错误的现象并不少见
13、测试应该从”小规模“开始,逐渐装箱”大规模“
14、不可将测试用例置之度外,排除随意性
15、必须测试检查每一个测试卷结果
16、一定要注意测试中的错误集中发生现象,这和程序员的编程水平和习惯有很大的关系
17、对测试结果一定要有一个确认的过程
软件测试的生命周期?
获取测试需求-编写测试计划-制定测试方案-开发与设计测试用例-执行测试-测试分析与评审-提交测试总结-准备下一版本的测试。
测试工程师的职责?
1、独立负责功能模块或产品的测试工作
2、参与需求评审、技术评审,从测试角度给出意见和建议
3、负责根据需求制定测试计划,撰写测试用例,组织开展用例评审,提交跟踪bug,撰写测试报告,分析测试结果。
4、运用缺陷管理工具,对缺陷进行确认、分析、跟踪和管理
软件的分类?
办公软件、互联网软件、多媒体软件、分析软件、协作软件和商务软件
软件测试的主要方面?
功能测试、可操作性测试、性能测试、兼容性测试、安全性测试、可靠性测试。
软件测试的对象?
源程序、目标程序、数据以及相关文档
测试案例?
对一项特定的软件产品进行测试任务的描述,体现测试方案、方法、技术和策略。内容包括测试目标、测试环境、输入数据、测试步骤、预期结果、测试脚本等,并形成文档。
软件测试的方法?
从是否执行代码看分为:
1、静态测试:指不运行被测程序本身,仅通过分析或检查源程序的语法、结构、过程、接口等来检查程序的正确性。
2、动态测试:是指通过运行被测程序,检查运行结果与预期结果的差异,并分析运行效率、正确性和健壮性等性能指标。
从是否关心内部结构来看分为:
1、白盒测试:又称为结构测试或逻辑驱动测试,是一种按照程序内部逻辑结构和编码结构,设计测试数据并完成测试的一种测试方法。
2、黑盒测试:又称为数据驱动测试,把测试对象当做看不见的黑盒,在完全不考虑程序内部结构和处理过程的情况下,测试者仅依据程序功能的需求规范考虑,确定测试用例和推断测试结果的正确性,它是站在使用软件或程序的角度,从输入数据与输出数据的对应关系出发进行的测试。
3、灰盒测试:是一种综合测试法,它将“黑盒”测试与“白盒”测试结合在一起,是基于程序运行时的外部表现又结合内部逻辑结构来设计用例,执行程序并采集路径执行信息和外部用户接口结果的测试技术。
软件测试结束的标准有?
1、测试单中的测试案例全部执行完毕
2、缺陷管理平台上本次迭代的bug已经全部关闭或者发现的错误已经得到了修改并且各级缺陷修复率达到了标准。
3、回归测试结束并未发现回退的问题。
4、bug数量曲线已经平滑,但是实际工作中,bug的数量不会很平滑,需要人为制定上线标准(错误强度曲线下降到预定的水平)
5、系统的功能和性能满足需求中的要求。
什么是泛智屏?
泛智屏是将AlxIoT技术融入到OTT大屏电视中,使其了能够满足用户在全屋范围内的各种场景下的使用需求的智能终端。OTT是指在互联网公司中越过运营商,发展基于开放互联网的各种数据和数据服务业务,利用运营商的网络,服务由运行商之外的第三方提供,运营在用户已经获得的网络之上并且不需要网络运营商额外的商业技术支持,广义的OTT是指互联网公司通过互联网提供各项应用服务,典型的应用服务是指互联网电视业务、苹果应用商店业务等
测试过程可以分为三个步骤?
单元测试、集成测试和系统测试
面向对象的设计对测试具有什么样的影响?
面向对象的工程能够比较容易的从内部代码设计跟踪到功能设计和需求。然而,这是对白盒测试而言,而对黑盒测试则影响很小(因为黑盒测试没有必要理解应用程序的内部设计)。如果应用程序软件设计比较好则可以简化测试设计。
做好软件测试的一般步骤?
1、测试人员必须经过软件测试技能相关的培训,不仅要熟知软件测试的知识理论相关,还要通过项目实战,熟悉整个项目的测试流程。实现编写测试用例,测试执行阶段必须根据测试用例进行,同时要善于工具,提高测试效率。
2、测试人员需有测试思维,比如参与某个项目测试,拥有测试思维的人员会很快回答出从哪里入手,怎么分析才会更有条理,更有逻辑。从各个角度考虑,易用性,功能,分支,边界,性能等功能性和非功能性需求都要进行测试,使得测试过程中不会有漏测的情况出现。测试思维大都是后天培养的,随着测试人员接手的项目越来越多,在实战中总结经验,测试思维慢慢也就形成了。
3、测试人员做好测试必须要熟悉系统功能和业务,因为测试人员面对的项目种类是各种各样的,而且用户的需求有时差别也是比较大的。故测试人员要开展某个新项目的测试时,一定要和产品经理沟通好,在参与需求评审时,要提出有建设性的问题。
4、做好软件测试也与其个人所具备的素质是息息相关的。测试的过程中要静得下心,专心致志地去做测试,因为软件测试有时是比较枯燥的,而且有些细微的bug不细心去测的话容易被忽视。做好软件测试也要求测试人员具备有效的沟通能力,在和产品经理、开发人员沟通时要明确阐述出重点。
软件测试的五个步骤?
单元测试、集成测试、确认测试、系统测试、验收测试
如何估算测试的工作量?
1、开发时间的百分比法,测试工作量依赖于开发时间/开发工作量,方法变化比较大或者通常基于以前的经验,通常预留项目的总花费时间的35%给测试
2、类比法(经验值法或历史数据法)
3、WBS估算法:将项目或产品分解为具体的工作,然后分别对各个工作进行时间估算,最终求和得出项目或产品的测试工作量/时间。
4、Delphi 法:专家评估技术,在没有历史数据的情况下,这种方式可以减轻估算的偏差。Delphi法鼓励参加者就问题相互讨论。这个技术,要求有多种相关经验人的参与,互相说服对方。
5、PERT估计法:PERT对各个项目活动的完成时间按三种不同情况估计:一个产品的期望规模,一个最低可能估计,一个最高可能估计。用这三个估计用来得到一个产品期望规模和标准偏差的Pert 统计估计。
6、代码行分析方法,计算物理行数,不计算空行,不计算注释.对于其他选项,一般为计算源文件根目录下的所有文件.所以代码行指的是指所有的可执行的源代码行数。
7、 COCOMO模型:工作量调整因子(Effort Adjustment Factor, EAF)代表多个参数的综合效果,这些参数使得项目可以特征化和根据COCOMO数据库中的项目规格化.每个参数可以定位很低,低,正常,高,很高.每个参数都作为乘数,其值通常在0.5到1.5之间,这些参数的乘积作为成本方程中的系数.
COCOMO用3个不同层次的模型来反映不同程度的复杂性,他们分别为:
基本模型 (Basic Model). 是一个静态单变量模型,它用一个以已估算出来的源代码行数 (LOC) 为自变量的函数来计算软件开发工作量。
中间模型 (Intermediate Model). 则在用 LOC 为自变量的函数计算软件开发工作量的基础上,再用涉及产品、硬件、人员、项目等方面属性的影响因素来调整工作量的估算。
详细模型:包括中间 COCOMO 模型的所有特性,但用上述各种影响因素调整工作量估算时,还要考虑对软件工程过程中分析、设计等各步骤的影响。
8、功能点分析法 (FPA:function point analysis) 是一种相对抽象的方法,是一种”人为设计”出的度量方式,主要解决如何客观,公正,可重复地对软件的规模进行度量的问题。
软件测试常见问题及解决方法?
1、针对概率性的bug,一时无法重现:告诉开发人员这个bug出现的概率能达到多少,尽量寻找bug重现的条件。
2、如何处理需求方面的异议:解决方法:记载交流记录,作为曾经发生歧义的证明。
3、对应的开发人员解决相应的问题:建立一个讨论组,把负责相关内容的开发都邀请到所见的这个讨论组中。当你在讨论组中提出一个问题时,相信在那么多人的监督下,是谁的责任,那个人一定会尽快给予回应。
4、开发人员眼中的没问题和测试人员眼中的有问题:人员在和开人员进行沟通的时候,一定要讲究方法,千万不可争得面红耳赤,伤了和气。
测试执行过程应注意的问题
全方位的观察测试用例执行结果: 测试执行过程中,当测试的实际输出结果与测试用例中的预期输出结果一致的时候,是否可以认为测试用例执行成功了?答案是否定的,即便实际测试结果与测试的预期结果一致,也要查看软件产品的操作日志、系统运行日志和系统资源使用情况,来判断测试用例是否执行成功了。全方位观察软件产品的输出可以发现很多隐蔽的问题。
测试过程记录:测试执行过程中,一定要加强测试过程记录。如果测试执行步骤与测试用例中描述的有差异,一定要记录下来,作为日后更新测试用例的依据;如果软件产品提供了日志功能,比如有软件运行日志、用户操作日志,一定在每个测试用例执行后记录相关的日志文件,作为测试过程记录,一旦日后发现问题,开发人员可以通过这些测试记录方便的定位问题。而不用测试人员重新搭建测试环境,为开发人员重现问题。
及时确认发现的问题: 测试执行过程中,如果确认发现了软件的缺陷,那么可以毫不犹豫的提交问题报告单。如果发现了可疑问题,又无法定位是否为软件缺陷,那么一定要保留现场,然后知会相关开发人员到现场定位问题。如果开发人员在短时间内可以确认是否为软件缺陷,测试人员给予配合;如果开发人员定位问题需要花费很长的时间,测试人员千万不要因此耽误自己宝贵的测试执行时间,可以让开发人员记录重新问题的测试环境配置,然后,回到自己的开发环境上重现问题,继续定位问题。
与开发人员良好的沟通: 测试执行过程中,当你提交了问题报告单,可能被开发人员无情驳回,拒绝修改。这时候,只能对开发人员晓之以理,做到有理、有据,有说服力。首先,要定义软件缺陷的标准原则,这个原则应该是开发人员和测试人员都认可的,如果没有共同认可的原则,那么开发人员与测试人员对问题的争执就不可避免了。此外,测试人员打算说服开发人员之前,考虑是否能够先说服自己,在保证可以说服自己的前提下,再开始与开发人员交流。
及时更新测试用例
测试执行过程中,应该注意及时更新测试用例。往往在测试执行过程中,才发现遗漏了一些测试用例,这时候应该及时的补充;往往也会发现有些测试用例在具体的执行过程中根本无法操作,这时候应该删除这部分用例;也会发现若干个冗余的测试用例完全可以由某一个测试用例替代,那么删除冗余的测试用例。
测试评估的目标
1、量化测试进程
2、生成缺陷和测试覆盖率的总结报告
测试评估的问题
1、没有把测试覆盖率作为报告测试进程的根据,使得不知测试是否结束;
2、没有做缺陷评估,缺陷评估是量度软件可行性的重要指标;
3、不使用专门的软件工具进行数据输入任务和相应的评估活动,使得这些任务变得繁重累人。
怎么提高测试质量?
1.尽量要求产品人员对需求进行讲解(需求评审)
2.熟悉透彻需求文档
3.测试需求分析的方法:分解功能点,然后对每一个功能点进行需求规则的分析。
4.所有功能点和需求规则都要被覆盖,(用例设计方法、评审、需求分析)
5.减少重复测试用例,(合适的用例设计方法)
6.多考虑测试场景与结果检查
7.测试环境应该要尽可能的接近真实环境,测试环境应该能够包含各种测试场景
8.测试数据应该尽可能真实,也包含了各种能够覆盖场景的测试数据
9.用例要100%的执行,不能够放过任何一个测试用例或测试场景
10.测试的轮次安排,应安排2-3轮测试
11.使用测试工具(数据库工具,Linux、自动化、接口、性能测试等)
12.引用缺陷管理工具,标准化缺陷管理流程,规范开发与测试对缺陷的管理
C/S模式?
C/S模式是传统的网络应用设计模式,客户机(client)/服务器(server)模式。需要在通讯两端各自部署客户机和服务器来完成数据通信。如(QQ、微信、LOL、CF、DNF等游戏需要下载客户端)
C/S 优点:
协议选择灵活,由于客户端和服务器都是自己开发,可以自定义协议进行消息传递。例如,腾讯公司所采用的通信协议,即为ftp协议的修改剪裁版
可以本地进行大量缓存,速度快,体验好。例如,知名的网络游戏魔兽世界。3D画面,数据量庞大,使用C/S模式可以提前在本地进行大量数据的缓存处理,从而提高观感。
C/S缺点:
安全性低,客户端的安装可能会导致本地用户信息泄露
跨平台性,需要为不同操作系统进行客户端定制
开发工作量大,由于服务器+客户端都需要一个团队完成开发量倍增
B/S模式?
浏览器(browser)/服务器(server)模式。只需在一端部署服务器,而另外一端使用每台PC都默认配置的浏览器即可完成数据的传输。
优点:
安全性高,跨平台性好,开发工作量小。因为不需要安装客户端,只需要浏览器即可完成数据交互。
B/S缺点:
由于使用浏览器无特殊客户端所以不能换成大量数据且必须准守HTTP协议
10个以上的Linux命令
ls,pwd,ps,mkdir,rm,cd,touch,cat,more,head,tail,more,less
linux中设置文件隐藏?
在文件名前添加“.”来隐藏该文件mv 文件名 .文件名
linux系统中的755权限是什么意思
755权限是指所有者拥有可读、可写、可执行权限,所属组与其他用户仅拥有可读与可执行权限。linux系统的权限一般是用1-3位数字代表文件所有者的权限,4-6位数字代表同组用户的权限,7-9位数字代表其他用户的权限。
linux的cpu信息:
可以从文件中cpuinfo读取。执行命令:# cat /proc/cpuinfo
查看占用CPU使用率最高的进程
top
查看文件末尾几行的数据?
tail -n 20 filename
过滤掉文件内容中包含error 的行
grep “ERROR” filename 或者
cat filename |grep “ERROR”
查看某端口号?
lsof -i:端口号
创建和删除一个多级目录
mkdir -p
在当前用户多家目录中查找haha.txt 文件?
find ~/ -name haha.txt
如何查询出 tomcat 的进程并杀掉这个进程,写出linux 命令?
ps -ef | grep tomcat kill -9 tomcat_port
动态查看日志文件?
tail -f log_file
查看系统硬盘空间的命令?
df -aTh
查看当前机器 listen 的所有端口?
netstat -tlnp
把一个文件夹打包压缩成.tar.gz 的命令,以及解压拆包.tar.gz 的命令
tar zcvf xxx.tar.gz file tar zxvf xxx.tar.gz
Xshell 工具如果想要实现从服务器上传或者下载文件的话,可以在服务器上安装什么包?
lrzsz
以/etc/passwd的前五行内容为例,提取用户名?
cat /etc/passwd | head -n 5 | cut -d : -f 1
什么是数据库
按照数据结构来组织、存储和管理数据的仓库
什么是关系型数据库?
基于组织彼此相关的数据点的模型数据的集合
主键、外键、索引
数据库中的主键指的是能够唯一标识一条记录的属性或属性组。
外键指的是另一张表中的主键起到与其他表建立联系的作用,用来建立与另一张表的关联。
索引是用来快速查找具有特定值的记录
sql中增删改查语句:
1、“INSERT INTO”语句,用于向表格中增加新的行;
2、“DELETE”语句,用于删除表中的行;
3、“Update”语句,用于修改表中的数据;
4、“SELECT”语句,用于从表中选取数据
sql数据库表连接
主要分为:内连接、外连接(左连接、右连接 、全连接)、交叉连接,今天统一整合一下,看看他们的区别。
http://t.zoukankan.com/janneystory-p-5618140.html
三范式?
第一范式:数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性存在传递函数依赖关系。
第二范式:完全依赖于主键,消除非主属性对主码的部分函数依赖。
第三范式:每个非关键字列都独立于其他非关键字列,并依赖于关键字,第三范式指数据库中不能。
SELECT执行顺序
FROM -> WHERE -> GROUP BY -> HAVING -> SELECT 的字段 -> DISTINCT -> ORDER BY -> LIMIT
事务的特性?
原子性、一致性、隔离性和持久性
MySQL中常用的四种存储引擎
分别是:
MyISAM存储引擎
innoDB存储引擎
MEMORY存储引擎
ARCHIVE存储引擎。
各引擎间有什么区别?
InnoDB:支持事务处理,支持外键,支持崩溃修复能力和并发控制。如果需要对事务的完整性要求比较高(比如银行),要求实现并发控制(比如售票),那选择InnoDB有很大的优势。如果需要频繁的更新、删除操作的数据库,也可以选择InnoDB,因为支持事务的提交(commit)和回滚(rollback)。
MyISAM:插入数据快,空间和内存使用比较低。如果表主要是用于插入新记录和读出记录,那么选择MyISAM能实现处理高效率。如果应用的完整性、并发性要求比较低,也可以使用。如果数据表主要用来插入和查询记录,则MyISAM引擎能提供较高的处理效率
MEMORY:所有的数据都在内存中,数据的处理速度快,但是安全性不高。如果需要很快的读写速度,对数据的安全性要求较低,可以选择MEMOEY。它对表的大小有要求,不能建立太大的表。所以,这类数据库只使用在相对较小的数据库表。如果只是临时存放数据,数据量不大,并且不需要较高的数据安全性,可以选择将数据保存在内存中的Memory引擎,MySQL中使用该引擎作为临时表,存放查询的中间结果。
如果只有INSERT和SELECT操作,可以选择Archive,Archive支持高并发的插入操作,但是本身不是事务安全的。Archive非常适合存储归档数据,如记录日志信息可以使用Archiv。
什么是数据库索引?
数据库索引其实就是为了使查询数据效率快。
数据库查询优化?
1、对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
2、应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描。
3、应尽量避免在 where 子句中使用!=或<>操作符,否则引擎将放弃使用索引而进行全表扫描。
4、应尽量避免在 where 子句中使用or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描。
5、in 和 not in 也要慎用,否则会导致全表扫描,如:select id from t where num in(1,2,3) 对于连续的数值,能用 between 就不要用 in 了:
7、如果在 where 子句中使用参数,也会导致全表扫描。因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。然 而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。
8、应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。
9、应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。
10、不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。
11、在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。
12、不要写一些没有意义的查询,如需要生成一个空表结构:
13、很多时候用 exists 代替 in 是一个好的选择:
14、并不是所有索引对查询都有效,SQL是根据表中数据来进行查询优化的,当索引列有大量数据重复时,SQL查询可能不会去利用索引,如一表中有字段sex,male、female几乎各一半,那么即使在sex上建了索引也对查询效率起不了作用。
15、索引并不是越多越好,索引固然可 以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有 必要。
16、应尽可能的避免更新 clustered 索引数据列,因为 clustered 索引数据列的顺序就是表记录的物理存储顺序,一旦该列值改变将导致整个表记录的顺序的调整,会耗费相当大的资源。若应用系统需要频繁更新 clustered 索引数据列,那么需要考虑是否应将该索引建为 clustered 索引。
17、尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。
18、尽可能的使用 varchar/nvarchar 代替 char/nchar ,因为首先变长字段存储空间小,可以节省存储空间,其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。
19、任何地方都不要使用 select * from t ,用具体的字段列表代替“*”,不要返回用不到的任何字段。
20、尽量使用表变量来代替临时表。如果表变量包含大量数据,请注意索引非常有限(只有主键索引)。
21、避免频繁创建和删除临时表,以减少系统表资源的消耗。
22、临时表并不是不可使用,适当地使用它们可以使某些例程更有效,例如,当需要重复引用大型表或常用表中的某个数据集时。但是,对于一次性事件,最好使用导出表。
23、在新建临时表时,如果一次性插入数据量很大,那么可以使用 select into 代替 create table,避免造成大量 log ,以提高速度;如果数据量不大,为了缓和系统表的资源,应先create table,然后insert。
24、如果使用到了临时表,在存储过程的最后务必将所有的临时表显式删除,先 truncate table ,然后 drop table ,这样可以避免系统表的较长时间锁定。
25、尽量避免使用游标,因为游标的效率较差,如果游标操作的数据超过1万行,那么就应该考虑改写。
26、使用基于游标的方法或临时表方法之前,应先寻找基于集的解决方案来解决问题,基于集的方法通常更有效。
27、与临时表一样,游标并不是不可使 用。对小型数据集使用 FAST_FORWARD 游标通常要优于其他逐行处理方法,尤其是在必须引用几个表才能获得所需的数据时。在结果集中包括“合计”的例程通常要比使用游标执行的速度快。如果开发时 间允许,基于游标的方法和基于集的方法都可以尝试一下,看哪一种方法的效果更好。
28、在所有的存储过程和触发器的开始处设置 SET NOCOUNT ON ,在结束时设置 SET NOCOUNT OFF 。无需在执行存储过程和触发器的每个语句后向客户端发送DONE_IN_PROC 消息。
29、尽量避免大事务操作,提高系统并发能力。
30、尽量避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否合理。`
什么是接口?
为不同系统和功能实现分离和连接的口
如果模块请求http改为了https,测试方案应该如何制定、修改?
分别用http还有https登录试试。如果用https可以正常登录,地址栏显示一把锁头,那么这个网站是有部署SSL的。如果 http和https都能够正常登录,进一步说明该网站没有设置强制https登录,或者说没有设置http链接自动跳转https链接;相反如果用http登录,结果跳转到https页面,说明网站部署了SSL,而且设置了http自动跳转https。
HTTP1.0和HTTP1.1的区别:
长连接:HTTP 1.1支持长连接(Persistent Connection)和请求的流水线(Pipelining)处理,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟,在HTTP1.1中默认开启Connection: keep-alive,一定程度上弥补了HTTP1.0每次请求都要创建连接的缺点。
缓存处理:在HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略,可供选择的缓存头来控制缓存策略。
带宽优化及网络连接的使用:HTTP1.0中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,HTTP1.1则在请求头引入了range头域,它允许只请求资源的某个部分,即返回码是206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接。
错误通知的管理:在HTTP1.1中新增了24个错误状态响应码,如409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除。
Host头处理:在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)。
HTTP1.1和 HTTP2.0的区别?
HTTP2.0相比HTTP1.1支持的特性:
新的二进制格式:HTTP1.1的解析是基于文本。基于文本协议的格式解析存在天然缺陷,文本的表现形式有多样性,要做到健壮性考虑的场景必然很多,二进制则不同,只认0和1的组合。基于这种考虑HTTP2.0的协议解析决定采用二进制格式,实现方便且健壮。
多路复用,即连接共享,即每一个request都是用作连接共享机制的。一个request对应一个id,这样一个连接上可以有多个request,每个连接的request可以随机的混杂在一起,接收方可以根据request的 id将request再归属到各自不同的服务端请求里面。
头部压缩,HTTP1.1的头部(header)带有大量信息,而且每次都要重复发送;HTTP2.0使用encoder来减少需要传输的header大小,通讯双方各自cache一份header fields表,既避免了重复header的传输,又减小了需要传输的大小。
服务端推送:服务器除了对最初请求的响应外,服务器还可以额外的向客户端推送资源,而无需客户端明确的请求。