应用层层面面试题汇总
Posted runhua
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了应用层层面面试题汇总相关的知识,希望对你有一定的参考价值。
1.什么是http协议?
http协议是超文本传送协议,是客户端与服务器端间请求与响应的一套标准,即规则与格式。
http协议是无连接的,无状态的,所谓无连接,是指客户端和服务器端之间的通信不需要事先建立连接,所谓无状态,是指服务器不会保存访问服务器的客户信息,同一个客户两次访问同一个页面,服务器的响应与第一次响应相同,一旦数据交换完毕,客户端与服务器端连接就会关闭,再次交换数据需要建立新的连接,这意味着服务器无法从连接上跟踪会话
2.http协议与https协议的区别?
https协议就是安全版的http协议,是在http协议的基础上添加上了ssl协议来对传输内容进行加密,因此https=http+ssl
3.https协议的工作原理?
https的工作步骤如下
*url访问页面,要求与服务器建立ssl连接
*服务器接收请求,返回公钥给客户端
*客户端与服务器协商安全等级,即加密等级
*客户端与服务器建立会话密钥,通过公钥来加密会话密钥
*服务器根据自己的私钥来解密出会话密钥
*服务器就使用会话密钥来加密客户端之间的通信
这里,会话密钥是客户端和服务器之间通信的真正钥匙。生成会话密钥需要服务器生成的公钥与私钥,公钥是用来装会话密钥的盒子,私钥用来打开这个盒子。
4.TCP三次握手的过程
(1)第一次握手:客户端首先向服务器端发出数据包,并将syn置为1,生成一个随机值seq=j,然后客户端等待服务器端的确认
(2)第二次握手:服务器端得到数据包后,根据syn=1得知客户端请求建立TCP连接。将syn置1,ack=j+1(用来确认已经收到数据包,并表示希望接下来收到的数据包序列号为j+1),ACK=1,再随机生成一个值seq=k,并将该数据包发送给客户端
(3)第三次握手:客户端得到服务器端的数据包后,检查数据包数据后再次向服务器端发送数据包,将syn置1,ack=k+1,ACK=1,随机生成一个值seq,发送给服务器端,服务器端接收数据包后,再次检查数据,检查完后,三次握手完成,双方建立连接
三次握手每一次握手可以确认的信息:
(1)第一次握手:服务器端只可以知道自己能够接收客户端的消息
(2)第二次握手:客户端知道自己发送的消息可以被服务器端接收到,以及自己可以接收到服务器端的信息
(3)第三次握手:服务器确认客户端接收到了自己的信息
5.UDP与TCP的区别
(1)TCP是面向连接的,UDP是无连接的,也就是说在发送数据前,客户端与服务器端不需要先建立连接
(2)TCP提供可靠的服务,UDP提供尽最大努力交付的服务。因此TCP传输的数据不会出现丢失,重复等情况,但是UDP则可能会导致数据丢失,失序
(3)TCP是面向字节流的,UDP面向报文,网络出现拥堵时不会使得发送速率降低(对实时的应用比如视频会议等会出现丢包的情况)
(4)TCP连接是1对1,而UDP支持1对1,1对多
(5)TCP的首部较大为20字节,UDP为8字节
6.Cookie与Session的基本概念
(1)Cookie:HTTP协议是无状态的,不会记录用户的信息,因此在用户登录,以及用户登录之后的请求都需要使用一定的方式来标记用户的身份,这个方式就是Cookie,Cookie由客户端第一次请求服务器时,由服务器生成,并放在响应中返回给客户端,客户端的浏览器会保存这个响应中的Cookie作为用户的身份识别,在以后的客户端请求中,请求都会在响应头中放上这个Cookie值,发送到服务器与服务器持有的数据进行比对,就可以判断这个用户是谁了。Cookie的存储大小有限,最多只有4KB,且因为存储在本地,所以容易被攻击
(2)Session与Cookie作用相近,也是用于存储用户的信息,但是Session一般是用于记录用户的行为,而不是用户的身份认证,比如说记录用户的购物车中添加了几件商品。Session是一种存放在服务器中的一种用来存放用户数据的类HashTable结构。浏览器第一次发送请求的时候,服务器自动生成了HashTable和session_id来唯一标识这个HashTable,并将其通过响应发送到浏览器中。第二次发送请求,则会将前一次服务器响应中的session_id一并发送到服务器上,服务器再从请求中提取出session_id,与所有的session_id进行比较
可以看到Session和Cookie的工作原理是相当相似的,这是因为我们经常是将两者结合起来来使用。
Session是在服务器保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在集群、数据库、文件中;而Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现Session的一种方式。
Cookie通常用来存储session_id,然后具体的数据保存在session的数据结构中,如果用户已经登录,服务器会在cookie中保存一个session_id,等到下次再次请求的时候,会把该session_id携带上来,服务器根据session_id在session库中获取用户的session数据。就能知道该用户到底是谁,以及之前保存的一些状态信息。Cookie具有不可跨域性
7.什么是RESTFUL
简单讲就是用URL定位资源,用HTTP描述操作。Rest即representational state transfer(表象性状态转变)。Rest是一种架构风格,其主要原则是:
(1)网络上的所有事物都被抽象为资源
(2)每个资源都有一个唯一的资源标识符
(3)同一个资源具有多种表现形式(xml,json等)
(4)所有的操作都是无状态的
(5)符合REST原则的架构方式则可称为RESTFUL。RESTFUL中文就是REST式的
RESTFUL接口常用的方式是get和post,调用RESTFUL接口是通过url的方式来访问后端的代码
8.Cookie是否会被覆盖,localStorage是否会被覆盖?
Cookie是可以覆盖的,只要把同名Cookie写入,就会覆盖原先的Cookie。如果要删除某个Cookie,只需要新建一个同名的Cookie,并将maxAge设置为0,并添加到response中覆盖原先的Cookie,注意maxAge要设置为0而不是负数,负数代表其他意思,如果设置为负值,则为浏览器进程Cookie(在内存中保存),关闭浏览器才会失效,设置为0,立即删除
9.如何保持登录状态?
把登录信息如账号、密码等保存在Cookie中,并控制Cookie的有效期,下次访问时再验证Cookie中的登录信息即可。
保存登录信息的方案有多种,最直接的是把用户名和密码都保持在Cookie中,下次 访问时检查Cookie中的用户名与密码,与数据库直接比较,但是这种方式非常危险,一般不把密码等重要信息保存到Cookie中,而且,也有一些用户会关闭Cookie的使用。另一种比较安全的方法是把加密后的密码保存到Cookie,解密后在与数据库比较
10.304是什么意思?
304是指请求资源没有修改,可以直接使用浏览器缓存
11.强缓存与协商缓存的命中和管理
(1)浏览器加载资源,首先根据资源内的http header来判断是否命中强缓存,如果命中强缓存,则直接从浏览器缓存中读取资源,不会发请求到服务器
(2)加入强缓存没有命中,浏览器就会发送一个请求到服务器,通过服务器来判断资源是否命中协商缓存,如果命中协商缓存,这个请求就会返回,但服务器不会返回资源,它会告知浏览器,资源没有改变,直接从浏览器缓存中读取资源
(3)强缓存和协商缓存的共同之处在于,两者都从自己浏览器缓存中去加载资源,但是强缓存不发送请求到服务器,而协商缓存则发送请求到服务器
(4)当强缓存,协商缓存都没有命中,直接从服务器加载资源数据
*当ctrl+f5强制刷新网页时,直接从服务器中加载,跳过强缓存和协商缓存
而按f5刷新网页时,则跳过强缓存,但是会检查协商缓存
1.强缓存:如何判断命中强缓存?以及强缓存的原理
当查看返回http状态为200,并且chrome开发者工具中的network中size显示from cache,即为命中强缓存
强缓存是利用http中的两个header来实现的:Expires或Cache-Control,前者使用的是绝对时间,后者是相对时间
Expires:表示资源过期时间的header,由服务器返回,时间格式为GMT,如:Sat,4 Aug 2018 16:32:33 GMT
当浏览器第一次请求资源,服务器再返回资源的同时,在response header中加上Expires header。
浏览器接受该资源后,将资源连同所有header一起缓存下来,因此强缓存中的header不是服务器返回的,而是从缓存中读取来的,所以返回的status状态自然为200成功
浏览器第二次请求资源时,则从缓存中寻找这个资源,找到后,将它的Expires跟当前的请求时间比较,如果Expires还没过期,则直接读取这个资源,命中缓存,否则不行
Cache-Control:由于Expires使用的是GMT这种绝对时间,因此在客户端和服务器端时间相差较大时,缓存就容易出问题,Cache-Control是相对时间,如:Cache-Control:max-age=315360000
Cache-Control的原理和Expires相似,只是在判断有效期是否过期的时候,会将Cache-Control设定的有效期拿出算得资源过期时间,再将资源过期时间与请求时间进行比较
2.协商缓存的原理
假如协商缓存命中,请求响应返回的http状态为304并且会显示一个Not Modified的字符串,这就表明,命中了协商缓存。
协商缓存利用的Last-Modified,If-Modified-Since以及ETag、If-None-Match这两对Header来管理的
浏览器首次请求资源时,服务器返回资源同时会返回加有Last-Modified的header的response,Last-Modified表示这个资源最后一次修改的时间
再次请求资源时,浏览器则在请求的header中添加If-Modified-Since,它的值是上一次请求中Last-Modified的值。当服务器收到资源请求时,根据浏览器传过来的If-Modified-Since和服务器上的最后修改时间来判断资源是否有变化,没有则返回304,有则正常返回资源内容。
ETag、If-None-Match与Last-Modified,If-Modified-Since的原理类似,只是ETag是一个随机的唯一标识,而不是时间,只要资源有变化这个标识就不同
12.HTTP请求和响应的消息结构?
请求消息结构:
包括一个请求行,若干消息头,以及实体内容。其中的消息头和实体内容部分可选,消息头和实体内容之间用空行隔开
响应消息结构:
包括状态行,若干消息头,以及实体内容。其中的消息头和实体内容可选,消息头和实体内容用空行隔开
13.http响应常见状态码:
1XX:表示成功接收请求,要求客户端继续提交下一次请求才能完成整个处理过程
2XX:表示成果接收请求并已完成整个处理过程.常见的状态有200
3XX:为完成请求,客户需进一步细化需求:例如:请求的资源已经移动一个新地址,常用302(重定向),307和304(拿缓存)
4XX:客户端的请求有错误,包括语法错误或者不能正确执行.常用404(请求的资源在web服务器中没有)403(服务器拒绝访问,权限不够)
5XX:服务器出现错误
常用状态码具体含义:
200:正常
302/307:临时重定向,请求的文档已被临时移动到别处,此文档的新的url在location响应头中给出
304:未修改,表示客户机缓存的版本是最新的,客户机应该继续使用它
403:禁止,服务器理解客户端请求,但拒绝处理它,通常用于服务器上文件或目录的权限设置所致
404:找不到
500:服务器错误
14.请列举三种禁止浏览器缓存的头字段,并写出相应的设置值
1.Expires:告诉浏览器 把回送的资源保存多长时间,设置为-1或是0是不缓存
2.Cache-Control:no-cache
3.pragma:no-cache
15.简述http1.0与http1.1的区别
http1.0对于每个链接都得建立一次连接,一次只能传送一个请求和响应,之后请求就会关闭。而http1.1在一次连接中,可以多次请求和响应,多个请求重叠和同时进行。http1.1比http1.0要有更多状态码以及请求头,比如ETag或者Cache-Control
16.js异步的方法(promise,generator,async)
js语言的执行环境是单线程,一次只能完成一个任务,如果有多个任务则需要排队,于是,js将任务的执行模式分为两种:同步和异步,同步就是后一段等前一个任务执行结束后再执行,异步模式则是:每一个任务都有一个回调函数,前一个任务结束后,不是执行后一个任务,而是执行回调函数,后一个任务则是不等前一个任务执行完毕就执行,所以程序的执行顺序与任务的排序顺序是不一致的,异步的
异步的方法:
1.回调函数
2.事件监听:采用事件驱动模式,任务的执行不取决于代码的顺序,而取决于某个事件是否发生
3.观察者模式
4.promise对象:每一个异步任务返回一个promise对象,该对象有一个then方法,允许指定回调函数
17.get和post的区别
1.get向服务器获取资源,post向服务器发送数据
2.get会把查询字符串的参数追加到url的末尾,post请求则把数据作为请求的主体来提交,可以包含非常多的数据,因此客户可以看到get提交的
参数,post则不可以
3.因为get请求提交的数据直接加载url末尾,所以有大小限制,而post则没有
4.post比get安全性高
5.对于get方式,服务器端有Request.QueryString来获取变量的值,对于post方式,服务器用Request.Form来获取提交的数据
6.get形式的url对搜索引擎更加友好,可以提高搜索引擎排名。而post甚至会阻止爬虫和搜索引擎的访问。
18.使用get和post的情况
若符合下列任一情况则用post方法:
1.请求的结果有持续性的影响改变,比如向数据库内添加新的数据行
2.表单收集的数据过多,若使用get方式会使url过长
3.要传送的数据不是采用7位的ASCII编码
若符合下列任一情况,则用get方法:
1.请求是为了查找资源,表单的数据只是用来帮助搜索
2.请求结果无持续性的影响改变
3.收集的数据及html表单内的输入字段名称的总长不超过1024个字符
以上是关于应用层层面面试题汇总的主要内容,如果未能解决你的问题,请参考以下文章
历时一个月整理2021金三银四Java面试题汇总,足足127页!