计算机网络常见面试题(1)——TCP的三次握手和四次挥手

本文详细解释了TCP协议中连接的建立与释放的过程,包括三次握手和四次挥手的具体步骤,以及为何需要这些步骤来确保连接的正确建立与安全释放。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、TCP建立连接时三次握手过程描述

三次握手由客户端发起

1、客户端向服务器端发送SYN包,其中包含客户端的初始序号seq=x,客户端进入SYN_SENT状态,等待服务器确认。(其中,SYN=1,ACK=0,表示这是一个TCP连接请求数据报文;序号seq=x,表明传输数据时的第一个数据字节的序号是x)。

2、服务器收到请求后,必须确认客户的数据包,向客户端返回确认报文SYN+ACK包,服务端进入SYN-REVD状态。(其中确认报文段中,标识位SYN=1,ACK=1,表示这是一个TCP连接响应数据报文,并含服务端的初始序号seq[服务器]=y,以及服务器对客户端初始序号的确认号ack[服务器]=seq[客户端]+1=x+1)

3、客户端收到服务器的SYN+ACK包,向服务器发送一个确认收到的报文ACK=1、一个序列号(seq=x+1)、一个确认号为ack[客户端]=seq[服务器]+1=y+1,此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。

形象描述:三次握手相当于浏览器和服务器见面了,要相互问候一下。(建立连接)

浏览器:“你吃饭了吗?”

服务器:“我吃了,你呢?”

浏览器:“我也刚吃完”

2、TCP建立连接为什么需要三次握手?

三次握手的目的是“为了防止已经失效的连接请求报文段突然又传到服务端,因而产生错误”,具体情况是:一端(client)A发出去的第一个连接请求报文并没有丢失,而是因为某些未知的原因在某个网络节点上发生滞留,导致延迟到连接释放以后的某个时间才到达另一端(server)B。本来这是一个早已失效的报文段,但是B收到此失效的报文之后,会误认为是A再次发出的一个新的连接请求,于是B端就向A又发出确认报文,表示同意建立连接。如果不采用“三次握手”,那么只要B端发出确认报文就会认为新的连接已经建立了,但是A端并没有发出建立连接的请求,因此不会去向B端发送数据,B端没有收到数据就会一直等待,这样B端就会白白浪费掉很多资源。所以其主要目的是防止server端一直等待,浪费资源。

3、TCP释放连接时四次回收过程描述

 

四次挥手中,客户端和服务端均可以发起(以客户端为发起方为例说明):

1、客户端发起请求断开连接,发送一个FIN,用来关闭客户端到服务器的数据传送,然后等待服务器的确认,客户端进入FIN-WAIT-1状态。(其中FIN=1,表明此报文的发送方已经完成了数据的发送,没有新的数据要传送,并要求释放连接;序列号seq=u)

2、服务器收到客户端的请求断开连接的报文之后,返回确认报文ACK包,服务器进入CLOSE-WAIT状态。(其中确认报文段中,ACK=1,并含服务端的初始序号seq[服务器]=v,以及服务器对客户端初始序号的确认号ack[服务器]=seq[客户端]+1=u+1)TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,此时客户端不能给服务器发送信息报文,只能接收。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。

3、客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)

4、当服务器也没有了可以传的信息之后,就向客户端发送连接释放报文。FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。

5、客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。

6、服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。

形象描述:四次挥手就是浏览器和服务器要离别了,互道珍重。(关闭连接)

浏览器:“我不在你家吃饭了哈,我要走了”

服务器:“我知道了,你等会,我给你准备的东西还没完,你再坐会”

服务器:“好了,我给你准备完了,就这些东西,带走吧”

浏览器:“好的,我走了,你把门关上吧”

4、为什么释放连接的发起方最后还要等待2MSL?

第一,为了保证发起方(A)发送的最后一个ACK报文能够到达接收方(B)。最后的ACK报文有可能丢失,因而使处在LAST-ACK状态的B收不到对已发送的FIN+ACK报文段的确认。B会超时重传这个FIN+ACK报文段,而A就能在2MSL时间内收到这个重传的FIN+ACK报文段。如果A在TIME-WAIT状态不等待一段时间,而是在发送完ACK报文段后就立即释放连接,就无法收到B重传的FIN+ACK报文段,因而也不会再发送一次确认报文段。这样,B就无法按照正常的步骤进入CLOSED状态。 
第二,A在发送完ACK报文段后,再经过2MSL时间,就可以使本连接持续的时间所产生的所有报文段都从网络中消失。这样就可以使下一个新的连接中不会出现这种旧的连接请求的报文段。 

5、为什么释放连接需要四次挥手?

因为TCP有个半关闭状态,假设A、B要释放连接,那么A发送一个释放连接报文给B,B收到后发送确认,这个时候A不发数据,但是B如果发数据A还是要接受,这叫半关闭。然后B还要发给A释放连接报文,然后A发确认,所以是4次。

6、注解

  1. SYN - 创建一个连接
  2. FIN -  终结一个连接
  3. ACK - 确认接收到的数据
  4. seq:序列号
  5. ack:确认号

转载于:https://www.cnblogs.com/adai-study/p/9518989.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值