这是一个关于TCP三次握手与四次挥手原理的详细解释。
TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。“面向连接”意味着在数据传输前,通信双方必须先建立一条逻辑连接,传输结束后再释放。三次握手用于建立连接,四次挥手用于释放连接。
理解握手和挥手,需要先知道几个TCP报文头部的关键标志位:
SYN=1
ACK=1
ACK
FIN=1
ack
目的:确认双方的发送和接收能力都正常,并同步初始序列号。
第一次握手(客户端 -> 服务器):
SYN = 1
seq = J
ACK = 0
SYN_SENT
第二次握手(服务器 -> 客户端):
ACK = 1
seq = K
ack = J + 1
SYN_RCVD
第三次握手(客户端 -> 服务器):
seq = J + 1
ack = K + 1
ESTABLISHED
主要是为了防止已失效的连接请求报文突然又传送到服务器,导致服务器资源浪费(防止“旧的重复SYN”造成连接错乱)。
目的:双方都确认数据发送完毕,并安全地、无遗漏地关闭连接。由于TCP是全双工的(可以同时双向传输),每个方向必须单独关闭。
假设客户端主动发起关闭。
第一次挥手(客户端 -> 服务器):
FIN = 1
seq = u
FIN_WAIT_1
第二次挥手(服务器 -> 客户端):
ack = u + 1
seq = v
CLOSE_WAIT
FIN_WAIT_2
第三次挥手(服务器 -> 客户端):
seq = w
LAST_ACK
第四次挥手(客户端 -> 服务器):
seq = u + 1
ack = w + 1
TIME_WAIT
CLOSED
因为TCP是全双工,关闭需要两个独立的“提议-确认”过程。
FIN_WAIT_1/2
这个机制是TCP实现可靠数据传输的基石之一。