欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 建筑 > TCP的三次握手和四次挥手

TCP的三次握手和四次挥手

2025/4/18 20:14:45 来源:https://blog.csdn.net/2301_79446157/article/details/147098737  浏览:    关键词:TCP的三次握手和四次挥手

1.三次握手

1)三次握手的目的

确保双方通信能力正常,并同步初始序列号(ISN),防止历史重复连接干扰。

2)三次握手的流程

 

 这张图很复杂,我们可以将其简化为:

客户端Client                          服务器Server|-------- SYN (seq=x) ----------->|  |<-- SYN-ACK (seq=y, ack=x+1) ----|  |-------- ACK (ack=y+1) -------->|  

其中的syn和ack的含义是

  • SYN(Synchronize Sequence Numbers):即同步序列号,是 TCP 连接建立时使用的一个标志位。当客户端向服务器发送 SYN 包时,它表示客户端请求与服务器建立连接,并在包中携带一个随机生成的初始序列号(Initial Sequence Number,ISN)。这个序列号用于标识后续数据传输中每个字节的顺序,服务器收到 SYN 包后,会返回一个 SYN + ACK 包,其中的序列号会在客户端的 ISN 基础上加 1,作为对客户端 SYN 的确认。
  • ACK(Acknowledgment):即确认号,用于确认收到了对方发送的数据。在 TCP 通信中,接收方会在收到数据后发送一个 ACK 包,告知发送方数据已成功接收。ACK 包中包含一个确认号,这个确认号表示接收方期望收到的下一个字节的序列号。例如,如果接收方成功收到了序列号为 1 - 1000 的字节,那么它发送的 ACK 包中的确认号将是 1001,表示期望接收发送方接下来发送的序列号为 1001 及以后的字节。

 

由在建立连接前,客户端和服务器需要知道双方的信息,如ip地址、端口号等。

所以第一步客户端向服务器发送一个syn包(syn==1),表示请求建立连接。

第二步服务器向客户端返回一个ack包(ack==1),表示确认收到。

第三步服务器也向客户端发送一个syn包,表示请求建立连接。

第四步客户端向服务器发送一个ack包,表示确实收到。

其中第二步和第三步是可以由服务器一并发送,所以简化为“三步握手”。

3)三次握手的意义

1.投石问路,确认通信路径是否畅通。

2.验证发送方和接收方双方的发送能力、接受能力是否正常。

3.写上关键数据,如序列号。

4)三次握手可以变成两次握手吗?

不可以。如果变为两次握手,服务器发送完ack+syn包之后,不能收到客户端传来的ack确认包,所以无法得知数据是否发生了丢包现象

5)三次握手可以变成四次握手吗?

  • 四次握手过于冗余,增加了不必要的网络开销和时间延迟。

6)第三次握手的 ACK 包丢失会怎么样?

  • 如果第三次握手的 ACK 包丢失,服务器会因为未收到确认而超时重传 SYN + ACK 包,客户端在收到重传的包后会再次发送 ACK 包。
  • 若客户端不再发送 ACK 包,服务器会不断重传 SYN + ACK 包,直到达到一定的重传次数后放弃连接
  • 客户端单方面认为连接已建立,如果此时客户端有数据发送,服务器会正常接收并处理,但服务器发送的数据可能会因未收到 ACK 确认而出现问题,如被重传或认为丢失。

2.四次挥手

1)四次挥手的目的

双方独立关闭双向通道,确保数据完整传输后再释放连接。

2)四次挥手的流程

可以简化为:

A                                        B|-------- FIN (seq=u) ----------->|  |<------- ACK (ack=u+1) ----------|  |<------- FIN (seq=w) ------------|  |-------- ACK (ack=w+1) -------->|  

其中的FIN的含义是

FIN(Finish)是一个控制位,用于表示发送方已经完成数据发送,希望关闭连接。

当一方(比如客户端)发送 FIN 标志位为 1 的 TCP 报文段时,意味着它告知对方(服务器):自己这边没有数据要发送了,但仍可以接收对方的数据。对方收到 FIN 报文后,会进行相应的处理,并返回一个确认报文(ACK)。之后,当对方也完成数据发送,同样会发送 FIN 报文给发起方,发起方确认后,双方就完成了连接的关闭过程。通过 FIN 标志位的交互,TCP 连接的双方能够有序地释放连接资源,确保数据传输的完整性和可靠性。

之所以用A、B而不是客户端、服务器的原因是:

三次握手中主动发送SYN包、请求建立连接的一方叫客户端,被动的叫服务器。

而四次挥手中则不同,无论是客户端或者是服务器都可以主动发送FIN包来表示希望断开连接,因此这里用A、B来表示双方。

第一次挥手:A向B发送FIN包来表示请求断开连接。

第二次挥手:B向A发送ACK包来表示收到请求。

第三次挥手:B向A也发送FIN包来表示请求断开连接。

第四次挥手:A向B发送ACK包来表示收到请求。

3)四次挥手的意义

  • 确保数据完整传输:在关闭连接之前,四次挥手可以保证双方都能完成数据的发送和接收,避免数据丢失。例如,当客户端发送 FIN 表示不再发送数据后,服务器可能仍有数据需要发送,服务器会先发送 ACK 确认收到客户端的 FIN,然后继续发送剩余数据,待数据发送完毕后再发送 FIN 给客户端,这样就保证了服务器的数据能够完整地传输到客户端。
  • 通知对方关闭连接:通过 FIN 标志位,双方可以明确地通知对方自己希望关闭连接的意图。客户端和服务器在收到对方的 FIN 后,会进行相应的资源释放和状态更新操作,为关闭连接做好准备。
  • 实现可靠的连接终止:四次挥手过程中的 ACK 确认机制确保了连接关闭过程的可靠性。每一次的 FIN 都需要对方的 ACK 确认,只有当双方都收到对方的 FIN 和 ACK 后,才能真正关闭连接。如果没有这种确认机制,可能会出现一方认为连接已关闭,而另一方仍在等待数据或进行其他操作的情况,导致连接异常或数据丢失。
  • 避免资源浪费:四次挥手使得双方能够在合适的时机释放连接资源,如端口号、缓冲区等。及时释放这些资源可以避免资源的长时间占用,提高系统资源的利用率,以便为其他连接或任务提供服务。

 4)TIME_WAIT和CLOSE_WAIT

主动发起FIN断开连接请求的一方会进入TIME_WAIT状态。

被动发起FIN断开连接请求的一方会进入CLOSE_WAIT状态。

1.TIME-WAIT

TIME-WAIT

  • 含义:TIME_WAIT 是主动关闭方在完成最后一次 ACK 发送后的状态。
  • 作用:一方面是为了确保连接被动关闭方能够收到最后一个 ACK 确认包,如果被动关闭方未收到该 ACK 而重传 FIN 包,处于 TIME_WAIT 状态的主动关闭方可以及时响应;另一方面是防止在网络中延迟的数据包影响新连接的建立,等待 2MSL(最大报文生存时间)后,可确保旧连接的所有报文都已从网络中消失,避免新连接受到旧连接残留报文的干扰。
  • 持续时间:通常持续 2MSL,RFC793 中规定 MSL 的时间为 2 分钟,Linux 实际设置为 30 秒。
  • 总的来说,TIME-WAIT状态是为了防止最后一个ACK确认包出现丢包现象,所以主动发起断开连接请求的一方在发送完毕之后,会等待一段时间再断开连接

2.CLOSE-WAIT

  • 含义:CLOSE_WAIT 是连接被动关闭方在收到对方发送的 FIN 请求后,发送 ACK 确认进入的状态。
  • 说明:在这个状态下,被动关闭方的应用程序可能还有未处理的数据需要发送,因此需要等待应用程序处理完这些数据后,才能发送 FIN 请求来关闭连接。如果应用程序没有及时关闭连接,可能会导致大量的 CLOSE_WAIT 状态,从而消耗系统资源。
  • 总的来说,CLOSE-WAIT是在等待程序员写的应用程序代码来调用close()方法来断开连接

5)如果服务器出现大量CLOSE_WAIT状态,可能是什么原因?如何解决?

  • 原因:被动方收到FIN后未及时调用close()释放连接(如代码未正确关闭Socket)。

  • 解决

    1. 检查服务端代码,确保FIN被正确处理(如Java的Socket.close())。

    2. 调整系统参数(如Linux的tcp_fin_timeout)。

6)什么情况下四次挥手会变成三次?

  • 当被动方没有数据要发送时,会将第二步的ACK和第三步的FIN合并发送(如HTTP短连接)。

  • 示例

Client       ServerFIN --------><------- ACK+FINACK -------->

7)客户端为什么需要TIME_WAIT,而服务端不需要?

  • 客户端TIME_WAIT:主动关闭方需确保最后一个ACK到达,且让旧报文失效。

  • 服务端:通常是被动关闭方,收到最后一个ACK后直接关闭连接。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词