TCP三次握手

TCP 使用三次握手的设计是为了确保可靠的连接建立。下面是三次握手的过程及其原因:

  1. 第一次握手(SYN):客户端发送一个带有 SYN(同步)标志的数据包给服务器,请求建立连接。此时客户端进入 SYN_SENT 状态。

  2. 第二次握手(SYN + ACK):服务器收到客户端的 SYN 数据包后,会发送一个带有 SYN 和 ACK(确认)标志的数据包给客户端,表示接受连接请求,并确认客户端的请求有效。此时服务器进入 SYN_RCVD 状态。

  3. 第三次握手(ACK):客户端收到服务器的 SYN + ACK 数据包后,会发送一个带有 ACK 标志的数据包给服务器,表示连接建立成功。此时客户端和服务器都进入 ESTABLISHED(已建立)状态,可以开始进行数据传输。

三次握手与四次挥手

为什么不设计两次握手

  1. 双方都能确认对方的能力:通过三次握手,客户端和服务器都能确认对方的存在和正常工作。客户端发送 SYN 数据包,服务器回复 SYN + ACK 数据包,客户端再回复 ACK 数据包,双方都能确保对方的通信能力。

  2. 防止已失效的连接请求被误认为有效:如果只有两次握手,那么在某些情况下,已失效的连接请求可能会被服务器接受,导致资源浪费。通过第三次握手,可以确保服务器收到客户端的确认,避免处理已失效的连接请求。

  3. 防止网络延迟导致的问题:在网络中,数据包可能会出现延迟、丢失或重复传输的情况。通过三次握手,可以减少因网络延迟而导致的问题。如果只有两次握手,那么可能会出现客户端发送的连接请求在网络中滞留,服务器收到后误认为是新的连接请求,导致连接资源的浪费。

总的来说,三次握手可以确保可靠的连接建立,并减少因网络延迟和失效连接请求而导致的问题。它是 TCP 协议可靠性的基础。

TCP四次挥手

TCP 使用四次挥手的设计是为了确保可靠的连接关闭。下面是四次挥手的过程及其原因:

  1. 第一次挥手(FIN):当客户端决定关闭连接时,它发送一个带有 FIN(结束)标志的数据包给服务器,表示它不再发送数据。此时客户端进入 FIN_WAIT_1 状态。

  2. 第二次挥手(ACK):服务器收到客户端的 FIN 数据包后,会发送一个带有 ACK(确认)标志的数据包给客户端,表示收到了客户端的关闭请求。此时服务器进入 CLOSE_WAIT 状态,客户端进入 FIN_WAIT_2 状态。

  3. 第三次挥手(FIN):当服务器也决定关闭连接时,它发送一个带有 FIN 标志的数据包给客户端,表示它不再发送数据。此时服务器进入 LAST_ACK 状态。

  4. 第四次挥手(ACK):客户端收到服务器的 FIN 数据包后,会发送一个带有 ACK 标志的数据包给服务器,表示确认收到了服务器的关闭请求。此时客户端进入 TIME_WAIT 状态,等待一段时间后关闭连接,服务器收到客户端的 ACK 数据包后,进入 CLOSED 状态。

四次挥手的设计主要有以下原因:

  1. 双方都能确认关闭请求:通过四次挥手,客户端和服务器都能确认对方的关闭请求。客户端发送 FIN 数据包,服务器回复 ACK 数据包,服务器发送 FIN 数据包,客户端回复 ACK 数据包,双方都能确保对方的关闭请求有效。

  2. 确保双方的数据都能完整传输:在关闭连接前,双方可能还有未传输完的数据。通过四次挥手,双方可以先发送 FIN 数据包,表示不再发送数据,然后再等待对方的确认,确保双方的数据都能完整传输。

  3. 处理网络延迟和丢包:在网络中,数据包可能会出现延迟、丢失或重复传输的情况。通过四次挥手,可以更好地处理这些问题。双方在等待对方的确认时,可以重新发送未收到的数据包,以确保数据的可靠传输。

总的来说,四次挥手可以确保可靠的连接关闭,并处理未传输完的数据和网络问题。它是 TCP 协议可靠性的体现,确保数据的完整性和可靠性。