本文共 1653 字,大约阅读时间需要 5 分钟。
TCP 三次握手与四次挥手解析
TCP 是一种双向通信协议,能够实现客户端与服务器之间的数据传输。为了建立和断开连接,TCP 使用三次握手进行连接建立,四次挥手进行连接释放。以下从基础到详细解析这两种过程。
TCP 三次握手
TCP 连接的建立需要三次握手完成,主要目的是确保双向通信的可靠性和顺序性。以下是具体过程:
SYN 位点:客户端向服务器发送一个 SYN 包,表示请求建立连接。SYN 包携带了客户端随机生成的序列号,用于标识后续数据包的顺序。 ACK 确认:服务器接收到 SYN 后,会回传一个 ACK 包。ACK 包中包含了一个确认号,确认客户端的序列号已经被接收。此外,服务器会在 ACK 中指定自己希望接收的下一个序列号,以便客户端知道后续数据包的编号。 SYN-ACK:客户端接收到服务器的 ACK 后,会向服务器发送一个 SYN-ACK 包。SYN-ACK 包既携带了客户端的序列号,又包含了对服务器序列号的确认。 连接建立完成:服务器接收到 SYN-ACK 后,会向客户端发送一个 ACK 包,双方完成三次握手,正式建立连接。 通过三次握手,TCP 不仅确保了通信双方能够互相发送数据,还保证了数据包的顺序性和可靠性。如果仅进行两次握手,可能会导致一方的初始序列号无法被确认,影响通信的可靠性。
为什么 TCP 需要三次握手
三次握手的主要作用包括信息对等和防止超时。通过三次握手,客户端和服务器能够相互告知初始序列号,并且彼此确认对方的序列号。这种机制避免了连接请求可能因为超时而导致的脏连接问题,确保了连接的可靠性。
TCP 四次挥手
断开一个 TCP 连接需要四次挥手完成,原因在于 TCP 是双向通信协议,两个方向的连接都需要关闭。在每个方向上,需要发送一个 FIN 请求,并等待对方的确认(ACK)。以下是详细过程:
发送 FIN 请求:当一方决定关闭连接时,会向对方发送一个 FIN 请求,表示不再发送更多数据。 等待 ACK 确认:发送 FIN 后,接收方需要确认接收到这个请求。ACK 包中包含了对 FIN 的确认,并指定了接收方希望接收的下一个序列号。 发送另一个 FIN 请求:在接收到 ACK 后,接收方会再次向发送方发送一个 FIN 请求,表示自己也要关闭连接。 等待最终 ACK 确认:发送方在收到第二个 FIN 请求后,会向接收方发送 ACK 确认。只有接收方也确认接收到这个 ACK,双方的连接才正式关闭。 为什么需要等待 2MSL
在四次挥手过程中,双方需要等待 2MSL(最大报文生存时间,大约 4 秒)以确保所有相关报文都已消失。2MSL 的目的是为了防止由于网络延迟或数据丢失导致的连接异常。具体原因包括:
防止丢失的报文:服务器发送 FIN 请求后,需要让客户端确认接收。如果客户端在 2MSL 内没有确认,服务器会重新发送 FIN 请求。 避免旧报文干扰:2MSL 时间足够长,可以确保所有与当前连接相关的报文都已从网络中消失,防止旧报文重复发送或干扰新连接。 TIME_WAIT 与 CLOSE_WAIT 的区别
在四次挥手过程中,连接状态会经历两个阶段:TIME_WAIT 和 CLOSE_WAIT。
- TIME_WAIT:表示连接已经请求断开,但尚未等待对方的确认。这种状态提示连接已经被一方主动关闭,等待对方的 ACK 确认。
- CLOSE_WAIT:表示连接已经请求断开,并且已经等待了对方的 ACK 确认。这种状态提示连接仍然需要继续等待。
两者都反映了连接关闭的过程,但区别在于状态的不同阶段。TIME_WAIT 表示等待确认,而 CLOSE_WAIT 表示正在等待确认。
总结
TCP 的三次握手和四次挥手机制确保了连接的可靠性和稳定性。三次握手通过三次通信确认双向序列号的对等,确保连接建立的可靠性。四次挥手则通过四次通信确认双向连接的关闭,避免了因网络延迟或数据丢失导致的连接异常。理解这些机制是掌握 TCP通信的核心内容。
转载地址:http://lcjh.baihongyu.com/