android http 三次 握手,面试解析:3次握手与4次挥手

在面试中,三次握手和四次挥手可以说是问的最频繁的一个知识点了,我相信大家也都看过很多关于三次握手与四次挥手的文章。今天的这篇文章,重点是围绕着面试,我们应该掌握哪些比较重要的点,哪些是比较多被面试官给问到的,我觉得如果你能把我下面列举的一些点都记住、理解,我想就差不多了。

1、三次握手

当面试官问你为什么需要有三次握手、三次握手的作用、讲讲三次握手的时候,我想很多人会这样回答。

首先很多人会先讲下握手的过程:

第一次握手:客户端给服务器发送一个 SYN 报文。第二次握手:服务器收到 SYN 报文之后,会应答一个 SYN+ACK 报文。第三次握手:客户端收到 SYN+ACK 报文之后,会回应一个 ACK 报文。服务器收到 ACK 报文之后,三次握手建立完成。

三次握手的作用是为了确认双方的接收与发送能力是否正常。

这里我顺便解释一下为啥只有三次握手才能确认双方的接受与发送能力是否正常,而两次却不可以:

第一次握手:客户端发送网络包,服务端收到了。

这样服务端就能得出结论:客户端的发送能力、服务端的接收能力是正常的。

第二次握手:服务端发包,客户端收到了。

这样客户端就能得出结论:服务端的接收、发送能力,客户端的接收、发送能力是正常的。不过此时服务器并不能确认客户端的接收能力是否正常。

第三次握手:客户端发包,服务端收到了。

这样服务端就能得出结论:客户端的接收、发送能力正常,服务器自己的发送、接收能力也正常。因此,需要三次握手才能确认双方的接收与发送能力是否正常。

这样回答其实也是可以的,但我觉得,这个过程我们应该要描述的更详细一点,因为三次握手的过程中,双方是由很多状态的改变的,而这些状态,也是面试官可能会问的点。

所以我觉得在回答三次握手的时候,我们应该要描述的详细一点,而且描述的详细一点意味着可以扯久一点。

加分的描述我觉得应该是这样:刚开始客户端处于 Closed 的状态,服务端处于 Listen 状态。

d4e879c7e30f65ab50b04e61153badd7.png

然后:

第一次握手:客户端给服务端发一个 SYN 报文,并指明客户端的初始化序列号 ISN(c)。此时客户端处于 SYN_Send 状态。

第二次握手:服务器收到客户端的 SYN 报文之后,会以自己的 SYN 报文作为应答,并且也是指定了自己的初始化序列号 ISN(s)。同时会把客户端的 ISN + 1 作为 ACK 的值,表示自己已经收到了客户端的 SYN,此时服务器处于 SYN_REVD 的状态。

第三次握手:客户端收到 SYN 报文之后,会发送一个 ACK 报文,当然,也是一样把服务器的 ISN + 1 作为 ACK 的值,表示已经收到了服务端的 SYN 报文,此时客户端处于 ESTABLISHED 状态。服务器收到 ACK 报文之后,也处于 ESTABLISHED 状态,此时,双方已建立起了链接。

2、三次握手的作用

三次握手的作用也是有好多的,多记住几个,保证不亏。例如:确认双方的接受能力、发送能力是否正常。指定自己的初始化序列号,为后面的可靠传送做准备。如果是 HTTPS 协议的话,三次握手这个过程,还会进行数字证书的验证以及加密密钥的生成。

单单这样还不足以应付三次握手,面试官可能还会问一些其他的问题,例如:

①(ISN)是固定的吗

三次握手的一个重要功能是客户端和服务端交换 ISN(Initial Sequence Number),以便让对方知道接下来接收数据的时候如何按序列号组装数据。

如果 ISN 是固定的,攻击者很容易猜出后续的确认号,因此 ISN 是动态生成的。

②什么是半连接队列

服务器第一次收到客户端的 SYN 之后,就会处于 SYN_RCVD 状态,此时双方还没有完全建立其连接,服务器会把此种状态下请求连接放在一个队列里,我们把这种队列称之为半连接队列。

当然还有一个全连接队列,就是已经完成三次握手,建立起连接的就会放在全连接队列中。如果队列满了就有可能会出现丢包现象。

这里在补充一点关于SYN-ACK 重传次数的问题:

服务器发送完SYN-ACK包,如果未收到客户确认包,服务器进行首次重传,等待一段时间仍未收到客户确认包,进行第二次重传。如果重传次数超过系统规定的最大重传次数,系统将该连接信息从半连接队列中删除。

注意,每次重传等待的时间不一定相同,一般会是指数增长,例如间隔时间为 1s,2s,4s,8s......

③三次握手过程中可以携带数据吗

很多人可能会认为三次握手都不能携带数据,其实第三次握手的时候,是可以携带数据的。

也就是说,第一次、第二次握手不可以携带数据,而第三次握手是可以携带数据的。

为什么这样呢?大家可以想一个问题,假如第一次握手可以携带数据的话,如果有人要恶意攻击服务器,那他每次都在第一次握手中的 SYN 报文中放入大量的数据。

因为攻击者根本就不理服务器的接收、发送能力是否正常,然后疯狂着重复发 SYN 报文的话,这会让服务器花费很多时间、内存空间来接收这些报文。

也就是说,第一次握手可以放数据的话,其中一个简单的原因就是会让服务器更加容易受到攻击了。

而对于第三次的话,此时客户端已经处于 established 状态,也就是说,对于客户端来说,他已经建立起连接了,并且也已经知道服务器的接收、发送能力是正常的了,所以能携带数据页没啥毛病。

关于三次握手的,HTTPS 的认证过程能知道一下更好,不过我就不说了,留着写 HTTP 面试相关时的文章再说。

3、四次挥手

四次挥手也一样,千万不要对方一个 FIN 报文,我方一个 ACK 报文,再我方一个 FIN 报文,对方一个 ACK 报文。然后结束,要说的详细一点,例如像下面这样就差不多了,要把每个阶段的状态记好,我上次面试就被问了几个了,呵呵。我答错了,还以为自己答对了,当时还解释的头头是道,呵呵。

7c770a89ee31d6fddf5bdce4bb68c411.png

刚开始双方都处于 establised 状态,假如是客户端先发起关闭请求,则:

第一次挥手:客户端发送一个 FIN 报文,报文中会指定一个序列号。此时客户端处于 FIN_WAIT1 状态。

第二次挥手:服务端收到 FIN 之后,会发送 ACK 报文,且把客户端的序列号值 +1 作为 ACK 报文的序列号值,表明已经收到客户端的报文了,此时服务端处于 CLOSE_WAIT 状态。

第三次挥手:如果服务端也想断开连接了,和客户端的第一次挥手一样,发给 FIN 报文,且指定一个序列号。此时服务端处于 LAST_ACK 的状态。

第四次挥手:客户端收到 FIN 之后,一样发送一个 ACK 报文作为应答,且把服务端的序列号值 +1 作为自己 ACK 报文的序列号值,此时客户端处于 TIME_WAIT 状态。需要过一阵子以确保服务端收到自己的 ACK 报文之后才会进入 CLOSED 状态。服务端收到 ACK 报文之后,就处于关闭连接了,处于 CLOSED 状态。

这里特别需要注意的就是 TIME_WAIT 这个状态了,这个是面试的高频考点,就是要理解,为什么客户端发送 ACK 之后不直接关闭,而是要等一阵子才关闭。

这其中的原因就是,要确保服务器是否已经收到了我们的 ACK 报文,如果没有收到的话,服务器会重新发 FIN 报文给客户端,客户端再次收到 ACK 报文之后,就知道之前的 ACK 报文丢失了,然后再次发送 ACK 报文。

至于 TIME_WAIT 持续的时间至少是一个报文的来回时间。一般会设置一个计时,如果过了这个计时没有再次收到 FIN 报文,则代表对方成功,就是 ACK 报文,此时处于 CLOSED 状态。

这里我给出每个状态所包含的含义,有兴趣的可以看看:

LISTEN:侦听来自远方 TCP 端口的连接请求。

SYN-SENT:在发送连接请求后等待匹配的连接请求。

SYN-RECEIVED:在收到和发送一个连接请求后等待对连接请求的确认。

ESTABLISHED:代表一个打开的连接,数据可以传送给用户。

FIN-WAIT-1:等待远程 TCP 的连接中断请求,或先前的连接中断请求的确认。

FIN-WAIT-2:从远程 TCP 等待连接中断请求。

CLOSE-WAIT:等待从本地用户发来的连接中断请求。

CLOSING:等待远程 TCP 对连接中断的确认。

LAST-ACK:等待原来发向远程 TCP 的连接中断请求的确认。

TIME-WAIT:等待足够的时间以确保远程 TCP 接收到连接中断请求的确认。

CLOSED:没有任何连接状态。

最后,再放下三次握手与四次挥手的图:

e7d6b8a5c18dd7e506936ec904ea557b.png

参考

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/295908.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微服务组件记事本:Skywalking执行效果 · 多图篇

立冬时节知多少今天立冬,周末两天在家继续研究了下Skywalking,感觉这个组件还是很不错的,无论是设计思想还是架构设计,都能从中受到启发和帮助,建议感兴趣的小伙伴可以看看,当然,如果不感兴趣还…

堆和栈的区别 (转贴)

从其他博客复制过来的,因为这个够详细,转过来学习一下! 堆和栈的区别一、预备知识—程序的内存分配一个由c/C编译的程序占用的内存分为以下几个部分1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数…

ios和android交互差异,Android 和 iOS 主要交互区别整理

我简单整理了一下Android 和 iOS 主要的交互区别,如果有遗漏欢迎批评补充。我总结有下面五类区别:一、界面布局形式的差异1 iOS 的 Tab Bar在iOS应用内最多用Tab Bar来切换不同的模块,Tab Bar 也是最受欢迎最容易被用户认知的方式。2 Android…

要比惨吗?看看这个女人

全世界只有3.14 % 的人关注了爆炸吧知识她从不知道辞职是什么滋味,因为被炒的总是她;连续被三家公司炒掉之后,她不得不自己做SOHO。生了双胞胎,本是喜事;但还在月子里,却发现老公出轨。小三还没打走&#x…

【Blog.Core开源】完成升级.NET 6.0

(千呼万唤始出来,_ _ _ _ _ _ _)是不是每个人都已经尝试一遍vs2022和.NET6.0了😁,从各个微信群和盆友圈就可见一斑。今天一大早,一位粉丝就发私信,让升级6.0,这么简单的需求,必须满足&#xff0…

Jenkins file一行代码部署.NET程序到K8S

Jenkins file一行代码部署.NET程序什么是Jenkins共享库随着微服务的增多,每个项目的都需要pipline文件,这样的话Pipeline代码冗余度高,并且pipeline的功能越来越复杂。jenkins可以使用Shared Lib,将一些公共的pipeline抽象做成模块…

吵架后女生和男生的夜晚!所有男生都这样吗?

1 猫:哪个瓜娃子开的灯?!2 神回复在哪里3 舔舔舔舔舔,被发现了!4 喵喵:你当我傻吗?5 今晚可不可以到你家吃饭6 吵架后女生的夜晚vs吵架后男生的夜晚太真实了7 打游戏时候 对方队友和我方…

项目背景介绍

Adventure 项目(1) 墨翟坐在办公室里,正和秘书 Alan 开会,讨论着一件让他和 Alan 都很烦心的事情。Adventure 在全球都有工厂,制造各种不同的产品。作为制造部门的负责人,墨翟需要每个月了解各个工厂的运行…

不想升Win11?Win10新版马上到!

微软正式宣布 Windows 10 操作系统的下一个功能更新:Windows 10 版本 21H2。微软表示:虽然我们对下一代 Windows 11 感到兴奋,但也专注于支持 Windows 10 上超过 13 亿台活跃设备。当人们继续在混合和远程环境中工作、学习和娱乐时&#xff0…

娱乐项目和女朋友哪个重要?

1 这招风卷残云我只演示一遍,看好了2 摄影师给男生拍照VS给女生拍照3 这个视力表是永远不会近视的4 娱乐项目和女朋友哪个重要?小伙子你飘了啊5 最怕空气突然安静6 “灵魂六问”7 原来是这样周末愉快↓ ↓ ↓

这些高校竟因名字太“坑爹”被误会为三本?盘点九所实力强劲但被名字耽误的大学...

全世界只有3.14 % 的人关注了爆炸吧知识有这样一个段子:西北某地一学生,志存高远,矢志从医。首次高考考入泸州医学院,到校后发现不理想,果断返乡复读。一年后成功考入四川医科大学,到校后傻眼了&#xff0c…

【全】.net core平台单元/集成测试结果、覆盖率、圈复杂度到可视化HTML报告之路...

.net core 平台的测试框架有好几个可供选择,内置的MSTest框架、NUnit框架以及强大好用的xUnit框架,依托宇宙最强的编辑器Visual Studio,可以开展非常友好的测试以及快乐的展示测试的结果。如果仅限于此,那么这篇文章对你来说就是多…

哪种HTML列表会自动编号,HTML列表的种类

HTML 支持有序、无序和定义列表无序列表无序列表是一个项目的列表,此列项目使用粗体圆点(典型的小黑圆圈)进行标记。无序列表始于 标签。每个列表项始于 。(推荐学习:HTML入门教程)CoffeeMilk浏览器显示如下:CoffeeMilk列表项内部可以使用段落…

Android之AsyncTask异步任务详解总结

Android 多线程----AsyncTask异步任务详解 【正文】 本文将讲解一下Android的多线程的知识,以及如何通过AsyncTask机制来实现线程之间的通信。 一、Android当中的多线程: 在Android当中,当一个应用程序的组件启动的时候,并且没有其…

docker源码_使用docker、Jenkins、gitlee、springboot、搭建个人博客网站 并实现CI/CD 外加机器人提醒...

看朱成碧思纷纷,憔悴支离为忆君。--- barcke前言:服务器用的是云服务器买的阿里的linux、jdk1.8、docker服务端使用的为阿里的docker镜像仓库、mysql使用5.7版本的、redis使用最新版即可、文件服务使用的阿里的oss.项目采用jib推送docker镜像.附录: git源码地址—-h…

初次见面,如何令人永远难忘

1 初次见面,如何令人永远难忘2 见到熟人和见到偶像的区别3 真正的好朋友是在最紧急的时刻帮你一把的那个人4 当你正在减肥时,你朋友约你出去吃饭5 被这样的友谊感动到了6 等我老了也要和大爷一样做一个时尚的人不说别的大爷好酷↓ ↓ ↓

号称迄今为止最快,.NET6带来了什么?

北京时间11月8号午夜,.NET6正式发布。该版本经历了一万多次Git提交,号称迄今为止最快的.NET,究竟有哪些亮点呢?1LTS版本,发布前经过了长期的线上生产压力测试;2性能提升,包括文件I/O&#xff0c…

linux 文件系统的管理 (硬盘)

RH133—Unit4 文件系统的管理 一、系统在初始化时如何识别硬盘 1、系统初始时根据MBR的信息来识别硬盘,其中包括了一些执行文件就来载入系统,这些执行文件就是MBR里前面446bytes里的boot loader 程式,而后面的16X4的空间就是存储分区表信息的…

Android之多线程----异步消息处理机制之Handler详解

一、handler的引入: 我们都知道,Android UI是线程不安全的,如果在子线程中尝试进行UI操作,程序就有可能会崩溃。相信大家在日常的工作当中都会经常遇到这个问题,解决的方案应该也是早已烂熟于心,即创建一个…

colorkey唇釉是否安全_colorkey空气唇釉,19/支

国货之光来喽 !!!!超火的colorkey空气唇釉给你们安排上 !!!R601 酒酿梅子超酷超性感的一支 !!这个颜色是偏调但是不显老的深草莓红 一点都不挑皮 谁涂谁白一个度~厚厚的涂一层气场值upup !R608 焦糖红棕偏橘棕调的红棕板栗 !!薄涂厚涂都显白、显气质!味道…