TCP 三次握手四次挥手
TCP 用三次握手过程建立一个连接.在连接建立的过程中,很多参数要被初始化,例如序号被初始化以保证按序传输和连接的健壮性.
TCP 是全双工的,因此每个方向都必须单独进行关闭.
三次握手
一对终端同时初始化一个它们之间的连接是可能的.但通常是由一端打开一个套接字然后监听来自另一方的连接,这就是通常所指的被动打开.服务器端被被动打开后,用户端就能建立主动打开.
- 客户端通过向服务器端发送一个 SYN 来建立一个主动打开,作为三次握手的一部分.客户端把这段连接的序号设定为随机数 A, 此时客户端进入
SYN_SENT状态,服务端进入LISTEN状态. - 服务器端应当为一个合法的 SYN 回送一个 SYN/ACK.ACK 的确认码应为 A + 1, SYN/ACK 包本身又有一个随机产生的序号 B, 服务器端进入
SYN_RCVD状态. - 最后,客户端再发送以一个 ACK. 当服务端收到这个 ACK 时,就完成了三次握手,并进入
ESTABLISHED状态.此时包的序号被设定为收到的确认号 A + 1, 而响应号则为 B + 1.
四次挥手
- 主机 1(可以是客户端,也可以是服务器端),设置 Seq 和 ACK, 向主机 2发送一个 FIN 报文段;此时主机 1 进入
FIN_WAIT_1状态;这表示主机 1 没有数据要发送给主机 2 了. - 主机 2 收到了主机 1 发送的 FIN 报文段,向主机 1 回一个 ACK 报文段, ACK 为 Seq + 1, 主机 1 进入
FIN_WAIT_2状态;主机 2 告诉主机 1, 我同意你的关闭请求. - 主机 2 向主机 1 发送 FIN 报文段,请求关闭连接,同时主机 2 进入
LAST_WAIT状态 - 主机 1 收到主机 2 发送的 FIN 报文段,向主机 2 发送 ACK 报文段,然后主机 1 进入
TIME_WAIT状态;主机 2 收到主机 1 的 ACK 报文段以后,就关闭连接;此时,主机 1 等待 2 MSL(Max Segment life,报文最大生存时间)后依然没有收到回复,证明 Server 端已经正常关闭,主机 1 也可以正常关闭
TCP 状态转换图