2019Java面试经历(一)

一、计算机网络相关

1、是否在实验室项目中应用过计算机网络?

2、介绍一下TCP的三次握手和四次挥手?

答:(1)三次握手的描述是不准确的,这里的三次本应指三次发送TCP报文,其实只建立了一次连接。
客户机向服务器发送请求,是要建立TCP连接的(在建立连接之前,两者都是处于CLOSED状态。建立连接时,客户端主动打开,服务器被动打开并一直处于监听状态等待客户6端发送第一次握手的报文请求)。
首先,服务器一直在处于监听状态,此时,我们的客户机向服务器第一次发送报文(报文信息:同步号为SYN=1;此次报文的序列号seq=x);当服务器接受到第一次发送的报文时立刻发送确认报文(报文信息:同步号为SYN=1;确认位ACK=1,代表这个确认报文是有意义的,如果为0则忽略;确认位字段的值为ack=x+1;报文序列号为seq=y)给客户端;客户端收到确认报文后,再向服务器发送第三次握手报文(报文信息:确认位ACK=1,确认位是有效的;确认位值ack=y+1;序列号为seq=x+1)给服务器端,该报文表示客户端已经收到服务器确认收到客户端第一次发送的请求报文,服务端收到后链接建立。
重点:为什么客户端要发送第三次确认报文?解:因为如果第一次的请求报文在发送的过程中出现阻塞滞留(失效,如网络延时)的情况时,由于在整个TCP链接过程中有超时重传的机制,当客户端迟迟未收到服务器的确认报文时,就会重新发送建立链接的请求报文且成功建立链接。当我们用完连接,销毁后,之前阻塞滞留的那条连接又生效了且到达服务器,这时服务器发送确认报文给客户端。*若此时没有第三次握手,则该链接又一次建立,这样肯定是不行的。*所以要再一次确认。再一次确认即客户端会反应其未给服务器发送请求,就不会发送第三次报文,没有了第三次报文,链接就不会再次重复建立。
在这里插入图片描述 (2)四次挥手:链接关闭之前,客户机和服务器同时处于ESTABLISHED状态。首先,客户机主动关闭TCP链接,并
向服务器发送第一次报文请求
(报文信息:同步信息FIN=1;序列号seq=u);接着服务器收到断开连接的请求立刻返回一个确认报文(报文信息:确认位ACK=1;序列号seq=v;确认位值ack=u+1);【注:由于TCP链接是双向的,前两步挥手完成,则客户端向服务器端单向的链接断开,即客户端无法再向服务器端发送信息】【注:服务器端还有多余的信息要继续返回给客户端,执行数据传送,则还不能立刻断开,进入CLOSE-WAIT状态。】等所有数据全部传送完成,服务器二次向客户端发送其也要关闭请求报文(同步位FIN=1;确认位ACK=1;序列号seq=w;确认位值ack=u+1);再次,客户端发送确认报文到服务器端。
重点:**为什么客户机最后要等待2MSL才进行关闭?**原因一是因为如果服务器没有收到客户机向服务器最后发送的一条确认报文,则服务器会认为其发送的关闭报文,客户机没有收到,就会再次发送一个服务器要关闭的报文。原因二是因为防止“已失效的连接请求报文段”出现在本连接中。客户端在发送完最后一个ACK报文段后,再经过2MSL,就可以使本连接持续时间内所产生的所有报文段都从网络中消失,使下一个新的连接中不会出现这种旧的连接请求报文段。
在这里插入图片描述

3、了解什么是滑动窗口吗?

答:TCP 使用的流量控制协议是可变大小的滑动窗口协议,保证TCP传输的可靠性。通过此进行流量控制,防止较快主机致使较慢主机的缓冲区溢出。
滑动窗口协议的基本原理就是在任意时刻,发送方都维持了一个连续的允许发送的帧的序号,称为发送窗口;同时,接收方也维持了一个连续的允许接收的帧的序号,称为接收窗口。发送窗口和接收窗口的序号的上下界不一定要一样,甚至大小也可以不同。不同的滑动窗口协议窗口大小一般不同。
  所谓滑动窗口协议,理解可分为有两点:1)、“窗口”对应的是一段可以被发送者发送的字节序列,其连续的范围称之为“窗口”;2)、“滑动”则是指这段“允许发送的范围”是可以随着发送的过程而变化的,方式就是按顺序“滑动”。在此之前要先了解以下前提:
  1、TCP 协议的两端分别为发送者 A 和接收者 B,由于是全双工协议,因此 A 和 B 应该分别维护着一个独立的发送缓冲区和接收缓冲区,由于对等性(A发B收 和 B发A收),我们以 A 发送 B 接收的情况作为例子;
  2、发送窗口是发送缓存中的一部分,是可以被 TCP 协议发送的那部分,其实应用层需要发送的所有数据都被放进了发送者的发送缓冲区;
  3、发送窗口中相关的有四个概念:已发送并收到确认的数据(不在发送窗口和发送缓冲区之内)、已发送但未收到确认的数据(位于发送窗口之中)、允许发送但尚未发送的数据以及发送窗口外发送缓冲区内暂时不允许发送的数据;
  4、每次成功发送数据之后,发送窗口就会在发送缓冲区中按顺序移动,将新的数据包含到窗口中准备发送;

4、什么是拥塞控制

(1)拥塞控制:防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载,过载可导致严重后果:死锁现象。拥塞控制所要做的都有一个前提:网络能够承受现有的网络负荷。拥塞控制是一个全局性的过程,涉及到所有的主机、路由器,以及与降低网络传输性能有关的所有因素。而流量控制是指点对点通信量的控制,是端到端中的问题。流量控制所要做的就是抑制发送端发送数据的速率,以便使接收端来得及接收。
如果网络出现拥塞,分组将会丢失,此时发送方会继续重传,从而导致网络拥塞程度更高。因此当出现拥塞时,应当控制发送方的速率。这一点和流量控制很像,但是出发点不同。流量控制是为了让接收方能来得及接收,而拥塞控制是为了降低整个网络的拥塞程度。
(2)拥塞控制算法
TCP 主要通过四个算法来进行拥塞控制:慢开始、拥塞避免、快重传、快恢复。
发送方需要维护一个叫做拥塞窗口(cwnd)的状态变量,注意拥塞窗口与发送方窗口的区别:拥塞窗口只是一个状态变量,实际决定发送方能发送多少数据的是发送方窗口。
在这里插入图片描述
慢开始与拥塞避免
发送的最初执行慢开始,令 cwnd = 1,发送方只能发送 1 个报文段;当收到确认后,将 cwnd 加倍,因此之后发送方能够发送的报文段数量为:2、4、8 …
注意到慢开始每个轮次都将 cwnd 加倍,这样会让 cwnd 增长速度非常快,从而使得发送方发送的速度增长速度过快,网络拥塞的可能性也就更高。设置一个慢开始门限 ssthresh,当 cwnd >= ssthresh 时,进入拥塞避免,每个轮次只将 cwnd 加 1。
如果出现了超时,则令 ssthresh = cwnd / 2,然后重新执行慢开始。

快重传与快恢复
在接收方,要求每次接收到报文段都应该对最后一个已收到的有序报文段进行确认。例如已经接收到 M1 和 M2,此时收到 M4,应当发送对 M2 的确认。
在发送方,如果收到三个重复确认,那么可以知道下一个报文段丢失,此时执行快重传,立即重传下一个报文段。例如收到三个 M2,则 M3 丢失,立即重传 M3。
在这种情况下,只是丢失个别报文段,而不是网络拥塞。因此执行快恢复,令 ssthresh = cwnd / 2 ,cwnd = ssthresh,注意到此时直接进入拥塞避免。
慢开始和快恢复的快慢指的是 cwnd 的设定值,而不是 cwnd 的增长速率。慢开始 cwnd 设定为 1,而快恢复 cwnd 设定为 ssthresh。

二、MySQL相关

1、知道什么是事务吗?

2、事务ACID分别代表什么?

三、Linux相关

1、看你了解Linux,你用过redis吗?用过unix吗?

2、你解释一下正向代理和反向代理的区别?

3、那你说一说负载均衡算法?

4、现在写一下加权轮询算法?

四、前端相关

看你对前端有所了解,做过什么项目吗?使用VUE写的吗?不是,用LayUI写的。你对前端框架了解多少呢?了解一些主流的前端框架吗?

五、Java 算法相关

1、你对Java了解到什么程度呢?看过哪些关于Java的书籍、源码吗?

2、那你说一下JVM的分区?

3、说一下线程和进程的区别

4、写一下算法:把0和1分开

5、大根堆和小根堆问题

6、Java中的协程问题

以上为DIDI面,与君共享!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值