2024年最全【面试必会】全网最具深度的三次握手、四次挥手讲解,androidstudio学习

Android核心知识点

面试成功其实是必然的,因为我做足了充分的准备工作,包括刷题啊,看一些Android核心的知识点,看一些面试的博客吸取大家面试的一些经验。

下面这份PDF是我翻阅了差不多3个月左右一些Android大博主的博客从他们那里取其精华去其糟泊所整理出来的一些Android的核心知识点,全部都是精华中的精华,我能面试到现在2-2资深开发人员跟我整理的这本Android核心知识点有密不可分的关系,在这里本着共赢的心态分享给各位朋友。

不管是Android基础还是Java基础以及常见的数据结构,这些是无原则地必须要熟练掌握的,尤其是非计算机专业的同学,面试官一上来肯定是问你基础,要是基础表现不好很容易被扣上基础不扎实的帽子,常见的就那些,只要你平时认真思考过基本上面试是没太大问题的。

最后为了帮助大家深刻理解Android相关知识点的原理以及面试相关知识,这里放上我搜集整理的2019-2021BAT 面试真题解析,我把大厂面试中常被问到的技术点整理成了PDF,包知识脉络 + 诸多细节。

节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

为了下文描述方便,我们将三次握手分别称为:SYN 报文SYNACK 报文ACK 报文

问题深究

1.为什么要三次握手而不是两次?

简单来说,三次握手的目的是为了让双方验证各自的接收能力和发送能力

  • 第一次握手,A 发送SYNBB接收到了后,能确认什么呢?
    显然,B能确认A发送能力和B接收能力;

  • 第二次握手,B发送SYNACKAA接收到后,能确认什么呢?
    A能确认B的发送能力和A自己的接收能力,此外,A收到了SYNACK,那么说明前面A发的SYN成功到达B的手中,所以也能确认A自己的发送能力和B接收能力;至此,A已经确认了双方各自的发送能力和接收能力都是OK的,因此转为ESTABLISHED状态;

  • 第三次握手,A发送ACKBB接收后,能确认什么呢?

直接的,B能确认A发送能力和B接收能力,另外由于B能收到ACK说明前面发送的SYNACK已经成功被接受了,说明能确认A接收能力和B发送能力。

如果使用两次握手,就不能确认上述所说的四种能力,那么就会导致问题。

假定不采用第三次报文握手,那么只要B发出确认,新的连接就建立了。

现假定一种异常情况,即A发出的SYN报文段并没有丢失,而是在某些网络节点长时间滞留了,以致延误到连接释放后的某个时间才到达B。本来这是一个早已失效的报文段。但B收到此失效的连接请求报文段后,却误以为是A又发出一次新的连接请求,于是就向A发出确认报文段,同意建立连接。

由于现在A并没有发出建立连接的请求,因此不会理睬B的确认,也不会向B发送数据,但B却以为新的运输连接已经建立了,并一直等待A发来的数据。B的许多资源就这样白白浪费了。

2.两个TCP建立请求相互之间同时发起时会发生什么?建立几个连接?

首先理解题意,我们知道三次握手正是建立TCP连接的过程,我们假设 A 是客户端,B 是服务端:

rfc793-同时启动rfc793-同时启动

这里先给大家讲一下上图中一些符号的含义:

  • 右箭头 (–>) :从 A 发送到 B 的 TCP 报文段,且 B 接收到了;
  • 左箭头 (<–) :从 B 发送到 A 的 TCP 报文段,且 A 接收到了;
  • 省略号 (…) :TCP 报文段仍在网络中(delayed);
  • 丢失 (“XXX”) :TCP 报文段丢失或者被拒绝。
  • 注释会放在括号中;
  • TCP 状态代表了处于中间的报文段到达之后的状态(AFTER);
  • 报文段的内容只显示了序列号(SEQ)、控制符(CTL)和 ACK,其余内容被省略。

接下来我们详细来看看上图中,两个请求同时相互发起时,两个TCP均会经历如下状态的转换:

同步请求的状态转换同步请求的状态转换

上述的状态转换图可以跟前面的三次握手的转换图进行对比理解,同时发起的两个请求最终只会建立一个连接

SYN-RECEIVEDSYN-RCVD是一样的,前者rcf793中的描述方法,后者是《计算机网络-自顶向下方法》中的使用方法。

3. 客户端正在和服务端建立 TCP 连接,然而当服务器变 SYN-RCVD 后,此时一个旧的 SYN 报文 又到达了,服务器会如何处理?

其实这道题更加深挖了TCP 建立连接的过程,我们可以在rfc793中了解到详细信息。

rfc793-RSTrfc793-RST

从上图可以看到,第三行就是旧的SYN 连接到达服务器时,第四行是服务器照常返回,第五行是客户端给服务端发送RST 报文,将服务端重置为LISTEN

我们需要从上图了解到的一点是,服务端在SYN_RECEIVED状态下,接收到旧的SYN 报文时是不能作出判断的,而是照常返回,当客户端接收到该报文后发现异常,才会发送RST 报文,重置连接。

关于RST 报文,我一开始也很疑惑,直到看到rfc793 原文

rfc793-page33rfc793-page33

确实说明了TCP B不能检测这个旧的SYN 报文是否正确,所以正常返回。而客户端收到会进行检测,发现是旧的报文,就会返回RST 报文

4.第三次握手失败了怎么办?

这个问题在网上找到的答案质量参差不齐,翻阅了rfc793,仔细研究后,最终整理出以下答案:

首先考虑失败的情况:

ACK报文丢失导致第三次握手失败ACK报文丢失导致第三次握手失败

当客户端收到服务端的SYNACK应答后,其状态变为ESTABLISHED,并会发送ACK包给服务端,准备发送数据了。如果此时ACK在网络中丢失(如上图所示),过了超时计时器后,那么服务端会重新发送SYNACK包,重传次数根据/proc/sys/net/ipv4/tcp_synack_retries来指定,默认是5次。如果重传指定次数到了后,仍然未收到ACK应答,那么一段时间后,Server自动关闭这个连接。

问题就在这里,客户端已经认为连接建立,而服务端则可能处在SYN-RCVD或者CLOSED,接下来我们需要考虑这两种情况下服务端的应答:

  • 服务端处于CLOSED,当接收到连接已经关闭的请求时,服务端会返回RST 报文,客户端接收到后就会关闭连接,如果需要的话则会重连,那么那就是另一个三次握手了。
  • 服务端处于SYN-RCVD,此时如果接收到正常的ACK 报文,那么很好,连接恢复,继续传输数据;如果接收到写入数据等请求呢?注意了,此时写入数据等请求也是带着ACK 报文的,实际上也能恢复连接,使服务器恢复到ESTABLISHED状态,继续传输数据。

这个结论也可以在STACKFLOW上找到验证:

What if a TCP handshake segment is lost?What if a TCP handshake segment is lost?

上图圈住的部分:

总的来说,如果一个ACK 报文丢失了,但它的下一个数据包没有丢失,那么连接正常,否则,连接会被重置。

5.知道SYN攻击吗?如何防范?

所谓SYN 洪泛攻击,就是利用SYNACK 报文的时候,服务器会为客户端请求分配缓存,那么黑客(攻击者),就可以使用一批虚假的ip向服务器大量地发建立TCP 连接的请求,服务器为这些虚假ip分配了缓存后,处在SYN_RCVD状态,存放在半连接队列中;另外,服务器发送的请求又不可能得到回复(ip都是假的,能回复就有鬼了),只能不断地重发请求,直到达到设定的时间/次数后,才会关闭。

服务器不断为这些半开连接分配资源(但从未使用),导致服务器的连接资源被消耗殆尽,不过所幸,我们可以使用SYN Cookie进行有效地防御。

所谓的SYN Cookie防御系统,与前面接收到SYN 报文就分配缓存不同,此时暂不分配资源;同时利用SYN 报文目的地IP端口,以及服务器存储的一个秘密数,使用它们进行散列,得到server_isn,然后附着在SYNACK 报文中发送给客户端,接下来就是对ACK 报文进行判断,如果其返回的ack字段正好等于server_isn + 1,说明这是一个合法的ACK,那么服务器才会为其生成一个具有套接字的全开的连接。

SYN Cookie 防御SYN Cookie 防御

当然这种方案也有一定缺点,最明显的就是服务器不保存连接的半开状态,就丧失重发SYN-ACK消息的能力,这一方面会降低正常用户的连接成功率,另一方面会导致某些情况下正常通信的双方会对连接是否成功打开产生误解,如客户端发给服务端的第三次握手消息(ACK)半路遗失,客户端认为连接成功了,服务端认为没收到ACK,连接没成功,这种情况就需要上层应用采取策略特别处理了。

6.(ISN)是固定的吗?

不固定,client_isn是随机生成的,而server_isn则需要根据SYN 报文中的源、ip和端口,加上服务器本身的密码数进行相同的散列得到,显然这也不是固定的。

7.三次握手过程中可以携带数据吗?

讲过程的时候其实已经讲了,第三次握手是可以携带数据的,而前两次不行。

8. 关于 https 的认证过程?

限于篇幅,此处暂时不讲,留意后续文章。

四次挥手

握手类似,每次挥手也代表一次报文的发出和接收。

过程描述

因为自顶向上这本书里面的图比较简略,这里采用谢希仁版本的计算机网络中的图:

计算机网络-谢希仁-四次挥手计算机网络-谢希仁-四次挥手

首先,当前客户端和服务器的状态都为ESTABLISHED,接下来我们详细讲解下上图的过程:

  • 客户主机发起连接释放的请求,设置FIN1,当然,序号seq也会带上,这里假设为u;发送完毕后,客户端进入 FIN-WAIT-1 状态。

第一次挥手:FIN报文第一次挥手:FIN报文

  • 服务端接收到FIN 报文后,会返回一个ACK 报文回去,此时设置ACK1确认号u + 1;表明自己接受到了客户端关闭连接的请求,但还没有准备好关闭连接。发送完毕后,服务器端进入 CLOSE-WAIT 状态,客户端接收到这个确认包之后,进入 FIN-WAIT-2 状态,等待服务器端关闭连接。

第二次挥手:ACK报文第二次挥手:ACK报文

  • 服务器端准备好关闭连接时,向客户端发送结束连接请求,FIN 置为1;发送完毕后,服务器端进入 LAST-ACK 状态,等待来自客户端的最后一个ACK

第三次挥手:FIN报文第三次挥手:FIN报文

  • 客户端接收到服务端传来的FIN 报文后,知道服务器已经准备好关闭了,发送一个确认包,并进入 TIME-WAIT状态,等待可能出现的要求重传的ACK 报文;服务器端接收到这个确认包之后,关闭连接,进入 CLOSED 状态。

客户端等待了某个固定时间(两个最大段生命周期,2MSL,2 Maximum Segment Lifetime)之后,没有收到服务器端的 ACK ,认为服务器端已经正常关闭连接,于是自己也关闭连接,进入 CLOSED 状态。

第四次挥手:ACK报文第四次挥手:ACK报文

这里我们再来看下rfc793中关于四次挥手的简单例子:

最后

其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。

上面分享的百度、腾讯、网易、字节跳动、阿里等公司2021年的高频面试题,博主还把这些技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,上面只是以图片的形式给大家展示一部分。

【Android思维脑图(技能树)】

知识不体系?这里还有整理出来的Android进阶学习的思维脑图,给大家参考一个方向。

【Android高级架构视频学习资源】

**Android部分精讲视频领取学习后更加是如虎添翼!**进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

,那么很难做到真正的技术提升。**

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 16
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值