三次握手四次挥手
文章目录
- 三次握手与四次挥手详解
- 一、三次握手(建立TCP连接)
- 二、四次挥手(关闭TCP连接)
- 总结
三次握手与四次挥手详解
在TCP/IP协议中,TCP(传输控制协议) 是一种面向连接、可靠的传输层协议。为了实现可靠通信,TCP在建立连接时需要“三次握手”,关闭连接时需要“四次挥手”。以下是详细说明:
一、三次握手(建立TCP连接)
三次握手的目的是同步通信双方的序列号和确认号,并交换TCP窗口大小等信息,最终建立可靠的连接。过程如下:
-
第一次握手(客户端 → 服务器)
- 客户端主动发起连接,发送SYN报文(同步序列编号)。
- 报文内容:
SYN=1
(表示这是一个连接请求),初始序列号seq=x
(客户端随机生成的起始序号)。 - 此时客户端状态:
SYN_SENT
(等待服务器确认)。
-
第二次握手(服务器 → 客户端)
- 服务器收到SYN报文后,同意建立连接,发送SYN+ACK报文。
- 报文内容:
SYN=1
(服务器也发起同步),ACK=1
(确认客户端的请求),确认号ack=x+1
(表示已收到客户端的seq=x
,下一次期望收到x+1
),服务器初始序列号seq=y
(服务器随机生成的起始序号)。 - 此时服务器状态:
SYN_RCVD
(等待客户端确认)。
-
第三次握手(客户端 → 服务器)
- 客户端收到SYN+ACK报文后,发送ACK报文确认。
- 报文内容:
ACK=1
,确认号ack=y+1
(表示已收到服务器的seq=y
,下一次期望收到y+1
),客户端序列号seq=x+1
(基于第一次握手的x
递增)。 - 此时客户端状态:
ESTABLISHED
(连接建立)。 - 服务器收到ACK报文后,状态也变为
ESTABLISHED
,双方开始传输数据。
为什么需要三次握手?
- 核心是防止失效的连接请求报文被服务器接收,导致错误连接。例如:客户端发送的连接请求因网络延迟滞留,超时后客户端重新发送请求并建立连接;若滞留的请求随后到达服务器,服务器会误认为是新请求并回复,但客户端已忽略,此时服务器会一直等待客户端确认,造成资源浪费。
- 三次握手通过客户端的最后一次确认,确保双方都明确“对方已准备好连接”,避免上述问题。
二、四次挥手(关闭TCP连接)
TCP连接是全双工的(双方可同时发送数据),关闭连接时需双方分别终止各自的发送通道,因此需要四次挥手。过程如下:
-
第一次挥手(主动关闭方 → 被动关闭方)
- 假设客户端主动关闭连接,发送FIN报文(结束标志)。
- 报文内容:
FIN=1
,序列号seq=u
(客户端当前的序列号,基于之前传输的数据递增)。 - 此时客户端状态:
FIN_WAIT_1
(等待对方确认)。
-
第二次挥手(被动关闭方 → 主动关闭方)
- 服务器收到FIN报文后,发送ACK报文确认。
- 报文内容:
ACK=1
,确认号ack=u+1
(表示已收到客户端的关闭请求),服务器序列号seq=v
(服务器当前的序列号)。 - 此时服务器状态:
CLOSE_WAIT
(等待自身数据发送完毕),客户端状态:FIN_WAIT_2
(等待服务器的关闭请求)。 - 注意:此时服务器仍可向客户端发送数据,客户端需继续接收。
-
第三次挥手(被动关闭方 → 主动关闭方)
- 服务器完成所有数据发送后,发送FIN报文,表示自己也准备关闭连接。
- 报文内容:
FIN=1
,ACK=1
,序列号seq=w
(服务器最后的序列号),确认号ack=u+1
(重复确认,确保客户端知晓)。 - 此时服务器状态:
LAST_ACK
(等待客户端确认)。
-
第四次挥手(主动关闭方 → 被动关闭方)
- 客户端收到FIN报文后,发送ACK报文确认。
- 报文内容:
ACK=1
,确认号ack=w+1
(表示已收到服务器的关闭请求),客户端序列号seq=u+1
。 - 此时客户端状态:
TIME_WAIT
(等待一段时间,确保服务器收到确认),服务器收到ACK后状态变为CLOSED
。 - 客户端在
TIME_WAIT
(通常为2倍报文最大生存时间,约1-4分钟)后,状态变为CLOSED
,连接彻底关闭。
为什么需要四次挥手?
- 因TCP是全双工通信,双方需分别关闭各自的发送通道。服务器收到客户端的FIN后,可能还有未发送完的数据,因此先回复ACK确认“已收到关闭请求”,待数据发送完毕后,再发送FIN告知“我方也关闭”,因此需要四次交互。
TIME_WAIT
的作用:防止最后一次ACK报文丢失(若服务器未收到ACK,会重发FIN,客户端可在TIME_WAIT
内重传ACK);确保网络中滞留的报文已失效,避免新连接受到旧报文干扰。
总结
- 三次握手:通过“请求-确认-再确认”建立可靠连接,同步双方序列号。
- 四次挥手:因全双工特性,双方需分别关闭发送通道,通过四次交互完成,并通过
TIME_WAIT
保证连接彻底关闭。
这两个过程是TCP可靠性的核心保障,广泛应用于HTTP、FTP等依赖可靠传输的协议中。