最后
面试题文档来啦,内容很多,485页!
由于笔记的内容太多,没办法全部展示出来,下面只截取部分内容展示。
1111道Java工程师必问面试题
MyBatis 27题 + ZooKeeper 25题 + Dubbo 30题:
Elasticsearch 24 题 +Memcached + Redis 40题:
Spring 26 题+ 微服务 27题+ Linux 45题:
Java面试题合集:
三次握手
-
第一次握手:客户端发送带有 SYN 标志的数据包到服务端,服务端收到表示客户端的发送能力没有问题
-
第二次握手:服务端发送带有 SYN/ACK 标志的数据包到客户端,客户端收到表示服务端的发送和接收能力没有问题
-
第三次握手:客户端发送带有带有 ACK 标志的数据包到服务端,服务端收到表示客户端的接收能力没有问题
追问:为什么要三次握手?一次,两次不行吗?
三次握手的目的是:建立可靠的通信信道,双方确认自己与对方的发送与接收是正常的.
- 那么TCP仅需两次握手,第二次握手时,服务端返回给客户端的确认报文丢失了,客户端这边认为服务端没有和他建立连接,而服务端却以为已经和客户端建立了连接,并且服务端开始向客户端发送数据,但客户端并不会接收这些数据,浪费了资源。如果是三次握手,不会出现双方连接还未完全建立成功就开始发送数据的情况。
- 如果此时服务端接收到了一个早已失效的来自客户端的连接请求报文,会向客户端发送确认报文同意建立TCP连接。但因为客户端并不需要向服务端发送数据,所以此次TCP连接没有意义并且浪费了资源。
又追问:第 2 次握手传回了 ACK,为什么还要传回 SYN?
- 服务端传回客户端所发送的 ACK 是为了告诉客户端,我接收到的信息确实就是你所发送的信号了,这表明从客户端到服务端的> 通信是正常的。而回传 SYN也就是同步序列编号则是为了建立并确认从服务端到客户端的通信
四次挥手
-
第一次挥手:客户端向服务端发送的数据完成后,向服务端发起释放连接报文,报文包含标志位FIN=1,序列号seq=u。此时客户端只能接收数据,不能向服务端发送数据。
-
第二次挥手:服务端收到客户端的释放连接报文后,向客户端发送确认报文,包含标志位ACK=1,序列号seq=v,确认号ack=u+1。此时客户端到服务端的连接已经释放掉,客户端不能像服务端发送数据,服务端也不能向客户端发送数据。但服务端到客户端的单向连接还能正常传输数据。
-
第三次挥手:服务端发送完数据后向客户端发出连接释放报文,报文包含标志位FIN=1,标志位ACK=1,序列号seq=w,确认号ack=u+1。
-
第四次挥手:客户端收到服务端发送的释放连接请求,向服务端发送确认报文,包含标志位ACK=1,序列号seq=u+1,确认号ack=w+1。
追问:为什么TCP连接的时候是3次,关闭的时候却是4次?
- 关闭连接时,客户端向服务端发送FIN 时,仅仅表示客户端不再发送数据了但是还能接收数据。
- 服务器收到客户端的FIN 报文时,先回一个ACK应答报文,而服务端可能还有数据需要处理和发送,等服务端不再发送数据时,>才发送FIN 报文给客户端来表示同意现在关闭连接。
从上面过程可知,服务端通常需要等待完成数据的发送和处理,所以服务端的ACK 和FIN一般都会分开发送,从而比三次握手导>致多了一次。
====================================================================================
流量控制是TCP 提供的可以让「发送方」根据「接收方」的实际接收能力控制发送数据量的⼀种机制。因为如果一直无脑的发数据给对方,但对方处理不过来,那么就会导致触发重发机制,从而导致网络流量的无端的浪费
拥塞控制就是为了防止过多的数据注入到网络中使网络中的路由器或链路不至于过载。
在某段时间内,若对网络中某一资源需求超过了该资源所能提供的可用部分,网络性能就变坏了,这种情况就叫拥塞。
拥塞控制和流量控制不同,拥塞控制是一个全局性的过程,而流量控制指点对点通信量的控制。
追问:流量控制具体怎么控制的?
- TCP利用滑动窗口机制实现流量控制。
- 在通信过程中,接收方根据自己接收缓存的大小,动态地调整发送方的发送窗口大小,即接收窗口rwnd,发送方的发送窗口取接收窗口rwnd和拥塞窗口cwnd的最小值。
又追问:拥塞控制具体的算法怎么样的?
TCP 的拥塞控制采用了四种算法,即慢开始 、 拥塞避免 、快重传、快恢复:
- 慢开始 : 慢开始算法的思路是当主机开始发送数据时由小到大逐渐增大发送窗口,也就是由小到大逐渐增大拥塞窗口数值。>cwnd 初始值为 1,每经过一个传播轮次,cwnd 加倍。因为如果立即把大量数据字节注入到网络,那么可能会引起网络阻塞。
- 拥塞避免 : 拥塞避免算法的思路是让拥塞窗口 cwnd 缓慢增大,即每经过一个往返时间 RTT 就把发送放的 cwnd 加 1。
- 快重传与快恢复: 在 TCP/IP 中,快速传和块恢复(fast retransmit and recovery,FRR)是一种拥塞控制算法,它能**快速恢
复丢失的数据包。\*\*没有 FRR,如果数据包丢失了,TCP 将会使用定时器来要求传输暂停。在暂停的这段时间内,没有新的或
复制的数据包被发送。有了 FRR,如果接收机接收到一个不按顺序的数据段,它会立即给发送机发送一个重复确认。如果发送机接收到三个重复确认,它会假定确认件指出的数据段丢失了,并立即重传这些丢失的数据段。有了 FRR,就不会因为重传时要求的暂停被耽误。当有单独的数据包丢失时,快速重传和恢复(FRR)能最有效地工作。当有多个数据信息包在某一段很短的时间内丢失时,它则不能很有效地工作。
===============================================================================
UDP:
1.UDP是无连接的, 在传送数据之前不需要先建立连接,远地主机在收到 UDP 报文后,不需要给出任何确认。
2.UDP使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的连接状态表。
3.UDP是面向报文的。发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付IP层。
TCP:
-
TCP是面向连接的运输层协议。在传送数据之前必须先建立连接,数据传送结束后要释放连接。
-
每一条TCP连接只能有两个端点,每一条TCP只能是点对点的。
-
TCP 提供可靠交付的服务,通过TCP连接传送的数据,无差错、不丢失、不重复,并且按时到达。
-
TCP提供全双工通信。TCP允许通信双方得到应用进程在任何时候都能发送数据。
-
面向字节流。含义是:虽然应用程序和TCP的交互是一次一个数据块,但TCP把应用程序交下来的数据仅仅看成是一连串的无结构的字节流。TCP中的“流”是指流入到进程或者从进程流出的字节序列。
追问:既然你说TCP提供的可靠的服务,那么TCP 协议如何保证可靠传输?
主要有校验和、序列号、超时重传、流量控制及拥塞避免等几种方法:
- 1.应用数据被分割成 TCP 认为最适合发送的数据块。TCP 给发送的每一个包进行编号,接收方对数据包进行排序,把有序数据传送给应用层。
- 2.校验和:TCP 将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP 将丢弃这个报文段和不确认收到此报文段。
- 3.TCP 的接收端会丢弃重复的数据。
- 4.流量控制: TCP 连接的每一方都有固定大小的缓冲空间,TCP 的接收端只允许发送端发送接收端缓冲区能接纳的数据。当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。TCP 利用滑动窗口实现流量控制。
- 5.拥塞控制: 当网络拥塞时,减少数据的发送。
- 6.ARQ 协议: 也是为了实现可靠传输的,它的基本原理就是每发完一个分组就停止发送,等待对方确认。在收到确认后再发下一个分组。
- 7.超时重传: 当 TCP 发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。
==================================================================================
GET- 从指定的服务器中获取数据
POST - 提交数据给指定的服务器处理
GET方法:
使用GET方法时,查询字符串(键值对)被附加在URL地址后面一起发送到服务器:
/test/demo_form.jsp?name1=value1&name2=value2
区别(post全部都相反):
-
GET请求能够被缓存
-
GET请求会保存在浏览器的浏览记录中
-
GET请求的URL能够保存为浏览器书签
-
GET请求有长度限制
==========================================================================================
总体来说分为以下几个过程:
-
DNS 解析:浏览器查询 DNS,获取域名对应的 IP 地址
-
TCP 连接:浏览器获得域名对应的 IP 地址以后,浏览器向服务器请求建立链接,发起三次握手
-
发送 HTTP 请求:TCP 连接建立起来后,浏览器向服务器发送 HTTP 请求
-
服务器处理请求并返回 HTTP 报文:服务器接收到这个请求,并根据路径参数映射到特定的请求处理器进行处
理,并将处理结果及相应的视图返回给浏览器
-
浏览器解析渲染页面
-
连接结束
追问:整个过程会使用哪些协议?
- 1.首先浏览器查找域名的IP地址的过程会使用DNS协议
- 2.与服务器建立TCP连接使用到了TCP协议
- 3.建立TCP协议时,需要发送数据,发送数据在网络层使用IP协议
- 4.IP数据包在路由器之间,路由选择使用OSPF协议
5.路由器在与服务器通信时,需要将ip地址转换为**MAC地址**,需要使用**ARP协议**
6.在TCP建立完成后,使用**HTTP协议**访问网页
6.HTTP 1.0 和 HTTP 1.1 的主要区别是什么?
==============================================================================================
-
长连接 : 在 HTTP/1.0 中,默认使用的是短连接,也就是说每次请求都要重新建立一次连接。HTTP 1.1 起,默认使用长连接,默认开启 Connection: keep-alive。
-
错误状态响应码:在 HTTP1.1 中新增了 24 个错误状态响应码。
-
缓存处理:在 HTTP1.0 中主要使用 header 里的 If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1 则引入了更多的缓存控制策略例如 Entity tag,If-Unmodified-Since,If-Match, If-None-Match 等更多可供选择的缓存头来控制缓存策略。
-
带宽优化及网络连接的使用:在HTTP1.0中会存在浪费带宽的现象,主要是因为不支持断点续传功能,客户端只是需要某个对象的一部分,服务端却将整个对象都传了过来。在HTTP1.1中请求头引入了range头域,它支持只请求资源的某个部分,返回的状态码为206。
言尽于此,完结
无论是一个初级的 coder,高级的程序员,还是顶级的系统架构师,应该都有深刻的领会到设计模式的重要性。
- 第一,设计模式能让专业人之间交流方便,如下:
程序员A:这里我用了XXX设计模式
程序员B:那我大致了解你程序的设计思路了
- 第二,易维护
项目经理:今天客户有这样一个需求…
程序员:明白了,这里我使用了XXX设计模式,所以改起来很快
- 第三,设计模式是编程经验的总结
程序员A:B,你怎么想到要这样去构建你的代码
程序员B:在我学习了XXX设计模式之后,好像自然而然就感觉这样写能避免一些问题
- 第四,学习设计模式并不是必须的
程序员A:B,你这段代码使用的是XXX设计模式对吗?
程序员B:不好意思,我没有学习过设计模式,但是我的经验告诉我是这样写的
从设计思想解读开源框架,一步一步到Spring、Spring5、SpringMVC、MyBatis等源码解读,我都已收集整理全套,篇幅有限,这块只是详细的解说了23种设计模式,整理的文件如下图一览无余!
搜集费时费力,能看到此处的都是真爱!
我都已收集整理全套,篇幅有限,这块只是详细的解说了23种设计模式,整理的文件如下图一览无余!
[外链图片转存中…(img-53VFqrKT-1715420383910)]
搜集费时费力,能看到此处的都是真爱!