Java后端开发常考⾯试题⼤全
最近开始着⼿准备秋招了,根据许多⼤佬的⾯经总结了⼀些⾯试题,⼀是为了⾃⼰复习准备⾯试,⼆是想分享出来,希望能帮到⼀些同学。整理如有遗漏请⼤家谅解,答案如果不全欢迎⼤家补充。
其中⼀些题还是有点难度的,想冲击⼤⼚的同学可以看⼀看。理解⽐死记硬背更重要,希望⼤家都能拿到⾃⼰想要的offer。
随⼿点赞,养成好习惯~
⽬录
计算机⽹络
1.GET请求和POST请求的区别
答:
·  数据传输⽅式不同:GET请求通过URL传输数据,⽽POST的数据通过请求体传输。
·  安全性不同:POST的数据因为在请求主体内,所以有⼀定的安全性保证,⽽GET的数据在URL中,
通过历史记录,缓存很容易查到数据信息。
·  数据类型不同:GET只允许 ASCII 字符,⽽POST⽆限制。
·  GET⽆害: 刷新、后退等浏览器操作GET请求是⽆害的,POST可能重复提交表单。
·  特性不同:GET是安全(这⾥的安全是指只读特性,就是使⽤这个⽅法不会引起服务器状态变化)且幂等(幂等的概念是指同⼀个请求⽅法执⾏多次和仅执⾏⼀次的效果完全相同),⽽POST是⾮安全⾮幂等。
·  简单来说:GET产⽣⼀个TCP数据包,POST产⽣两个TCP数据包。
严格的说:对于GET⽅式的请求,浏览器会把http header和data⼀并发送出去,服务器响应200(返回数据);⽽对于POST请求。浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
2.在浏览器⽹址输⼊⼀个url后直到浏览器显⽰页⾯的过程 (这边⾯试官可能会详细的考察DNS服务器的知识)
步骤:
①输⼊⽹址:输⼊URL。
②缓存解析:获取URL后解析,先去服务器缓存中查看是否有⽬标⽹页的缓存,如果有就从缓存中加载(缓存就是把之前访问过的js、css、图⽚等资源存储在系统磁盘或内存中),没有就进⾏下⼀步。
③域名解析:在发送http之前需要进⾏DNS解析即域名解析(域名到IP地址的转换过程。域名的解析⼯作由DNS服务器完成,解析后可以获取域名相应的IP地址)。
④TCP连接,三次握⼿:域名解析后,浏览器向服务器发送http请求,此时就要进⾏TCP三次握⼿连接。
⑤服务器收到请求:TCP连接建⽴成功后,服务器收到浏览器发送的请求信息(包含请求头和请求体),返回⼀个响应头和响应体。
⑥页⾯渲染:浏览器收到服务器返回的响应头和响应体,进⾏客户端渲染,⽣成Dom树,解析css样式,进⾏js交互等。
3.TCP三次握⼿和四次挥⼿的过程 (为什么不可以两次握⼿,为什么握⼿要三次,挥⼿需要四次)
java可以开发什么软件
答:
三次握⼿
四次挥⼿
【问题⼀】为什么使⽤三次握⼿?
答:为了防⽌已失效的连接请求报⽂段突然⼜传送到了服务端,使服务端⼀直等待,浪费资源。
——谢希仁著《计算机⽹络》第四版
谢希仁版《计算机⽹络》中的例⼦是这样的,“已失效的连接请求报⽂段”的产⽣在这样⼀种情况下:client发出的第⼀个连接请求报⽂段并没有丢失,⽽是在某个⽹络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是⼀个早已失效的报⽂段。但server收到此失效的连接请求报⽂段后,就误认为是client再次发出的⼀个新的连接请求。于是就向client发出确认报⽂段,同意建⽴连接。假设不采⽤“三次握⼿”,那么只要server发出确认,新的连接就建⽴了。由于现在client并没有发出建⽴连接的请求,因此不会理睬server的确认,也不会向server发送数据。但server却以为新的运输连接已经建⽴,并⼀直等待client发来数据。这样,server的很多资源就⽩⽩浪费掉了。采⽤“三次握⼿”的办法可以防⽌上述现象发⽣。例如刚才那种情况,client不会向server的确认发出确认。server由于收不到确认,就知道client并没有要求建⽴连接。”主要⽬的防⽌server端⼀直等待,浪费资源。
【问题⼆】为什么连接的时候是三次握⼿,关闭的时候却是四次握⼿?
答:因为当Server端收到Client端的SYN连接请求报⽂后,可以将SYN+ACK放在同⼀个报⽂中发送(其中ACK报⽂是⽤来应答的,SYN 报⽂是⽤来同步的)。但是关闭连接时,当Server端收到FIN报⽂时,仅仅表⽰对⽅没有数据发送过来了,⽽并不会⽴即关闭SOCKET(因为数据可能还没有发送完)
,所以只能先回复⼀个ACK报⽂,告诉Client端,"你发的FIN报⽂我收到了"。只有等到我Server端所有的报⽂都发送完了,我才能发送FIN报⽂,因此不能⼀起发送。故需要四步握⼿。
【问题三】为什么TIME_WAIT状态需要经过2MSL(最⼤报⽂段⽣存时间)才能返回到CLOSE状态?
答:虽然按道理,四个报⽂都发送完毕,我们可以直接进⼊CLOSE状态了,但是我们必须假想⽹络是不可靠的,有可能最后⼀个ACK丢失。所以TIME_WAIT状态就是⽤来重发可能丢失的ACK报⽂。在Client发送出最后的ACK回复,但该ACK可能丢失。Server如果没有收到ACK,将不断重复发送FIN⽚段。所以Client不能⽴即关闭,它必须确认Server接收到了该ACK。Client会在发送出ACK之后进⼊到
TIME_WAIT状态。Client会设置⼀个计时器,等待2MSL的时间。如果在该时间内再次收到FIN,那么Client会重发ACK并再次等待
2MSL。所谓的2MSL是两倍的MSL(Maximum Segment Lifetime)。MSL指⼀个⽚段在⽹络中最⼤的存活时间,2MSL就是⼀个发送和⼀个回复所需的最⼤时间。如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接。
【问题四】为什么不能⽤两次握⼿进⾏连接?
答:3次握⼿完成两个重要的功能,既要双⽅做好发送数据的准备⼯作(双⽅都知道彼此已准备好),也
要允许双⽅就初始序列号进⾏协商,这个序列号在握⼿过程中被发送和确认。
现在把三次握⼿改成仅需要两次握⼿,可能会发⽣死锁。作为例⼦,考虑计算机S和C之间的通信,假定C给S发送⼀个连接请求分组,S收到了这个分组,并发送了确认应答分组。按照两次握⼿的协定,S认为连接已经成功地建⽴了,可以开始发送数据分组。可是,C在S的应答分组在传输中被丢失的情况下,将不知道S 是否已准备好,不知道S建⽴什么样的序列号,C甚⾄怀疑S是否收到⾃⼰的连接请求分组。在这种情况下,C认为连接还未建⽴成功,将忽略S发来的任何数据分组,只等待连接确认应答分组。⽽S在发出的分组超时后,重复发送同样的分组。这样就形成了死锁。
【问题五】如果已经建⽴了连接,但是客户端突然出现故障了怎么办?
答:TCP还设有⼀个保活计时器,显然,客户端如果出现故障,服务器不能⼀直等下去,⽩⽩浪费资源。服务器每收到⼀次客户端的请求后都会重新复位这个计时器,时间通常是设置为2⼩时,若两⼩时还没有收到客户端的任何数据,服务器就会发送⼀个探测报⽂段,以后每
隔75秒钟发送⼀次。若⼀连发送10个探测报⽂仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。
4.七层OSI模型或TCP/IP协议模型 (各层分别实现了什么协议)
5.各种IO模型的知识 (BIO,NIO,AIO)
⽂章略长,
6.HTTP协议和TCP协议的区别
TCP协议对应于传输层,⽽HTTP协议对应于应⽤层,从本质上来说,⼆者没有可⽐性。
①http对应于应⽤层。
②TCP协议对应于传输层。
③http协议是在TCP协议之上建⽴的,http在发起请求时通过TCP协议建⽴起连接服务器的通道,请求结束后,⽴即断开TCP连接。
说明:从HTTP/1.1起,默认都开启了Keep-Alive,保持连接特性,简单地说,当⼀个⽹页打开完成后,客户端和服务器之间⽤于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的⽹页,会继续使⽤这⼀条已经建⽴的连接。Keep-Alive不会永久保持连接,它有⼀个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。
④http是⽆状态的短连接,⽽TCP是有状态的长连接。
7.HTTP和HTTPS的区别
https是安全版的http,因为http协议的数据都是明⽂进⾏传输的,所以对于⼀些敏感信息的传输就很不安全,HTTPS就是为了解决HTTP 的不安全⽽⽣的。
HTTPS = HTTP + SSL(Secure Sockets Layer 安全套接字协议)
8.HTTPS的请求过程
①客户端向服务器发起HTTPS的请求,连接到服务器的443端⼝;
②服务器将⾮对称加密的公钥传递给客户端,以证书的形式回传到客户端;
③服务器接收到该公钥进⾏验证,就是验证2中证书,如果有问题,则HTTPS请求⽆法继续;如果没有问题,则上述公钥是合格的。(第⼀次HTTP请求)客户端这个时候随机⽣成⼀个私钥,称为client key 客户端私钥,⽤于对称加密数据的。使⽤前⾯的公钥对client key进⾏⾮对称加密;
④进⾏⼆次HTTP请求,将加密之后的client key传递给服务器;
⑤服务器使⽤私钥进⾏解密,得到client key,使⽤client key对数据进⾏对称加密
⑥将对称加密的数据传递给客户端,客户端使⽤⾮对称解密,得到服务器发送的数据,完成第⼆次HTTP请求。
9.HTTP协议的发展历程
⽂章略长,
10.lvs,nginx,HA在七层⽹络协议中分别作⽤于哪层,各⾃的区别
LVS:是基于四层的转发,介于⽹络层和运输层之间
Nginx:可以做七层的转发,是web服务器,缓存服务器,反向代理服务器
HA:负载均衡器,是基于四层和七层的转发
11.TCP如何实现可靠传输 (如何实现UDP的可靠传输)
CP通过序列号、检验和、确认应答信号、重发控制、连接管理、窗⼝控制、流量控制、拥塞控制实现可靠性。
UDP通过实现确认机制、重传机制、窗⼝确认机制实现可靠性。
12.TCP和UDP的区别
操作系统
1.线程和进程的区别 (可能会问到协程)
1)进程
进程是程序的⼀次执⾏过程,是⼀个动态概念,是程序在执⾏过程中分配和管理资源的基本单位,每⼀个进程都有⼀个⾃⼰的地址空间,⾄少有 5 种基本状态,它们是:初始态,执⾏态,等待状态,就绪状态,终⽌状态。
(2)线程
线程是CPU调度和分派的基本单位,它可与同属⼀个进程的其他的线程共享进程所拥有的全部资源。
(3)联系
线程是进程的⼀部分,⼀个线程只能属于⼀个进程,⽽⼀个进程可以有多个线程,但⾄少有⼀个线程。
(4)区别:理解它们的差别,我从资源使⽤的⾓度出发。(所谓的资源就是计算机⾥的中央处理器,内存,⽂件,⽹络等等)
根本区别:①进程是操作系统资源分配的基本单位,⽽线程是任务调度和执⾏的基本单位
②在开销⽅⾯:每个进程都有独⽴的代码和数据空间(程序上下⽂),程序之间的切换会有较⼤的开销;线程可以看做轻量级的进程,同⼀类线程共享代码和数据空间,每个线程都有⾃⼰独⽴的运⾏栈和程序计数器(PC),线程之间切换的开销⼩。
③所处环境:在操作系统中能同时运⾏多个进程(程序);⽽在同⼀个进程(程序)中有多个线程同时执⾏(通过CPU调度,在每个时间⽚中只有⼀个线程执⾏)
④内存分配⽅⾯:系统在运⾏的时候会为每个进程分配不同的内存空间;⽽对线程⽽⾔,除了CPU外,系统不会为线程分配内存(线程所使⽤的资源来⾃其所属进程的资源),线程组之间只能共享资源。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。