在面试中,三向握手和四向挥手是被问到最多的知识点。三向握手和四向挥手的文章相信大家都看过不少。今天这篇文章,重点围绕面试,哪些是我们更应该把握的重点,哪些是面试官问的比较多的。我想如果你能记住并理解我下面列出的一些要点,我认为它几乎是一样的。三向握手由于三向握手是面试中被问得最多的面试题,所以这次我们就从面试的角度来讲解一下三向握手。在三次握手的过程中,我想很多人都会这样回答:首先,很多人会先说说握手的过程:1.第一次握手:客户端向服务器发送SYN报文。2、第二次握手:服务器收到SYN报文后,会回应一个SYN+ACK报文。3、第三次握手:客户端收到SYN+ACK报文后,会回复ACK报文。4、服务器收到ACK报文后,三次握手建立。作用是确认双方收发能力是否正常。这里我顺便解释一下为什么只有三次握手才能确认双方的收发能力是否正常,两次却不行:第一次握手:客户端发送一个网络包,服务端收到。这样服务器就可以断定客户端的发送能力和服务器的接收能力都是正常的。第二次握手:服务器发送数据包,客户端接收。这样客户端就可以断定服务端的收发能力和客户端的收发能力都是正常的。但是此时服务器无法确认客户端的接收能力是否正常。第三次握手:客户端发送数据包,服务器接收。这样服务器端就可以断定客户端的收发能力是正常的,服务器端自己的收发能力也是正常的。所以需要三次握手来确认双方的收发能力是否正常。这个答案其实是可以的,但是我觉得应该把这个过程描述的更详细一些,因为在三次握手的过程中,双方被很多状态改变,而这些状态也是面试官可能会问到的。观点。所以我觉得在回答三次握手的时候,我们应该描述的更详细一些,描述的更详细意味着我们可以聊的更久一些。我觉得加分的描述应该是这样的:一开始,client是closed状态,server是listen状态。然后1.第一次握手:客户端向服务器发送SYN报文,指定客户端的初始化序列号SN(c)。此时客户端处于SYN_Send状态。2、第二次握手:服务器端收到客户端的SYN报文后,会回复自己的SYN报文,同时指定自己的初始化序列号ISN(s),同时使用客户端的ISN+1为ACK的值表示已经收到客户端的SYN,此时服务端处于SYN_REVD状态。3、第三次握手:客户端收到SYN报文后,会发送ACK报文。当然它也把服务器的ISN+1作为ACK的值,表示收到了服务器的SYN报文。此时客户端处于establised状态。4、服务器收到ACK报文后,也处于established状态。此时,双方已经建立了联系。三向握手的作用三向握手的作用也很多。多记住几个,保证不亏本。例如:1、确认双方收发能力是否正常。2.指定自己的初始化序列号,为后面的可靠传输做准备。仅此一项不足以应对三次握手。面试官可能会问一些其他的问题,比如:1.(ISN)是固定的吗?三次握手的一个重要作用就是客户端和服务端交换ISN(InitialSequenceNumber),这样对方在下次收到数据时就知道如何根据序列号组装数据。如果ISN是固定的,攻击者很容易猜到后续的确认号,所以ISN是动态生成的。2、什么是半连接队列?服务器第一次收到客户端的SYN后,会处于SYN_RCVD状态。这个队列称为半连接队列。当然,还有一个全连接队列,即三次握手已经完成,已经建立连接的会被放入全连接队列。如果队列已满,可能会发生丢包。这里有一个关于SYN-ACK重传次数的问题: 服务器已经发送了SYN-ACK包。如果没有收到客户端的确认包,服务器会第一次重传,等待一段时间后还没有收到客户端的确认包。执行第二次重传。如果重传次数超过系统规定的最大重传次数,系统将从半连接队列中删除该连接信息。注意,每次重传的等待时间不一定相同,一般呈指数增长,例如间隔为1s、2s、4s、8s、……3.三次握手时是否可以携带数据?很多人可能认为三次握手中不能携带Data。其实第三次握手就可以携带数据。也就是说,第一次和第二次握手不能携带数据,但是第三次??握手可以携带数据。为什么?大家可以想一个问题,如果第一次握手可以携带数据,如果有人要恶意攻击服务器,他每次都会在第一次握手的SYN报文中放入大量数据,因为攻击者根本不会忽略是否服务器的接收和发送能力都正常,然后疯狂的重复发送SYN报文,会导致服务器花费大量的时间和内存空间来接收这些报文。也就是说,如果第一次握手就可以放数据,一个简单的原因就是会让服务器更容易受到攻击。第三次,此时client已经处于established状态,也就是说对于client来说,他已经建立了一个连接,他已经知道server的接收和发送能力是正常的,所以可以有携带数据页没有错。参考:前端高级面试题详解挥手四次由于三次握手是面试中问得最多的面试题,所以这次我们就从角度来讲解一下三次握手和四次挥手的采访。对方一个FIN报文,我方一个ACK报文,我方一个FIN报文,我方一个ACK报文。那么结束,最好再详细一点。比如下面这个就差不多了,每个阶段的状态要好好记住。上次面试问了几个问题,呵呵。我答错了,自以为答对了,当时就解释的头头是道,哈哈。一开始,双方都处于建立状态。如果客户端先发起关机请求,则:1.第一次挥手:客户端发送FIN报文,报文中会指定一个序列号。此时客户端处于FIN_WAIT1状态。2、第二次握手:服务端收到FIN后,会发送ACK报文,将客户端的序号值+1作为ACK报文的序号值,表示收到客户端的报文.服务器处于CLOSE_WAIT状态。3、第三次挥手:如果服务器端也想断开连接,会发送一个FIN报文并指定一个序列号,就像客户端的第一次挥手一样。此时服务器处于LAST_ACK状态。4.第四次挥手:客户端收到FIN后,同样发送ACK报文作为回应,将服务器的序号值+1作为自己ACK报文的序号值。此时客户端处于TIME_WAIT状态。需要一段时间才能保证服务器在收到自己的ACK报文后会进入CLOSED状态。5、服务器收到ACK报文后,会关闭连接,处于CLOSED状态。这里特别需要的是TIME_WAIT的状态。这是一个面试的高频测试站点。就是理解为什么client发送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——没有连接状态;最后,在三向握手和四向挥手的图中
