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,感觉这个组件还是很不错的,无论是设计思想还是架构设计,都能从中受到启发和帮助,建议感兴趣的小伙伴可以看看,当然,如果不感兴趣还…

《Starting with Starling》 Ep 1~11

starling 1.3,Hi-ReS-Stats FlashDevelop设置 Project->Properties ->Output->Platform->Flash Player->11.5 ->Classpaths->Add Classpath->(starling和Stats的src文件夹) 程序入口 [SWF(frameRate"60", width"800", …

Android之TextUtils类介绍

对于字符串处理Android为我们提供了一个简单实用的TextUtils类,如果处理比较简单的内容不用去思考正则表达式不妨试试这个在android.text.TextUtils的类,主要的功能如下: 是否为空字符 boolean android.text.TextUtils.isEmpty(CharSequence str) 拼接…

堆和栈的区别 (转贴)

从其他博客复制过来的,因为这个够详细,转过来学习一下! 堆和栈的区别一、预备知识—程序的内存分配一个由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…

Mac 修改用户名

系统偏好设置 > 用户与群组 > 解锁 > 用户 > 右键 > 高级选项 > 全名转载于:https://www.cnblogs.com/SimonGao/p/4989662.html

Android之学习笔记 Contacts (一)ContentResolver query 参数详解

1.获取联系人姓名 一个简单的例子,这个函数获取设备上所有的联系人ID和联系人NAME。 [java] view plaincopy public void fetchAllContacts() { ContentResolver contentResolver this.getContentResolver(); Cursor cursor contentResolver.query(an…

C# 序列化

XmlSerializer ser new XmlSerializer(typeof(Report)); if (Directory.Exists("c:\\工作报告\\" report.toBoss "\\" report.name)) {string filename date.Text;string filepath "c:\\工作报告\\" report.toBoss "\\" repo…

signature=18441de5a4bb8df92eb5cf5dcca47d1e,Heroísmo y los medios de comunicación (Capítulo 5A 5B)...

摘要:The unit encourages students to look at media and the portrayal of heroes and consider who is telling the story and why. The goal of this unit is to present grammar (preterite and imperfect tenses) and vocabulary in an authentic context (th…

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

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

Android之SharedPreferences详解

获取SharedPreferences的两种方式: 1 调用Context对象的getSharedPreferences()方法 2 调用Activity对象的getPreferences()方法 两种方式的区别: 调用Context对象的getSharedPreferences()方法获得的SharedPreferences对象可以被同一应用程序下的其他 组件共享. 调用Activity对…

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

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

MySQL大批量数据插入

公司有一个项目,需要频繁的插入数据到MySQL数据库中,设计目标要求能支持平均每秒插入1000条数据以上。目前功能已经实现,不过一做压力测试,发现数据库成为瓶颈,每秒仅能插入100多条数据,远远达不到设计目标…

项目背景介绍

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

canvas-a13prototype.html

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>扩展方法</title> </head> <body><canvas id"canvas" style"margin:0 auto;border:1px #ddd solid">The…

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

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

Android之layout属性介绍

android:id 为控件指定相应的ID android:text 指定控件当中显示的文字&#xff0c;需要注意的是&#xff0c;这里尽量使用strings.xml文件当中的字符串 android:gravity 指定View组件的对齐方式&#xff0c;比如说居中&#xff0c;居右等位置 这里指的是控件中的文本位置并不是…

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

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