TCP 使用三次握手协议建立连接,过程如下:
客户端发送 syn(seq=x)报文给服务器端,进入 syn_send 状态。
服务器端收到 syn 报文,回应一个 syn(seq=y)、ack(ack=x+1)报文,进入 syn_recv 状态。
客户端收到服务器端的 syn 报文,回应一个 ack(ack=y+1)报文,进入 established 状态。三次握手完成,TCP 客户端和服务器端成功地建立连接,可以开始传输数据。
在关闭连接时则使用四次挥手,过程如下:
客户端要断开连接,向服务器发送 fin 报文,发送后客户端变成 fin_wait_1 状态,同时进入半关闭状态,即无法向服务端发送报文,只能接收。
服务端接收后向客户端确认,变成 closed_wait 状态,客户端接收到服务端的确认后,变成 fin_wait_2 状态。
服务端向客户端发送 fin,自己进入 last_ack 状态。
客户端收到服务端发来的 fin 后,变成 time_wait 状态,然后发送 ack 给服务端。客户端需要等待足够长的时间(2 个 MSL,Maximum Segment Lifetime,报文最大生存时间),如果在这段时间内没有收到服务端的重发请求,则表示 ack 成功到达,挥手结束;否则客户端重发 ack。等待 2MSL 的意义在于确保四次挥手中主动关闭方最后的 ack 报文最终能达到对端,以及确保主动关闭方没有收到对端收到 ack 重传的 fin 报文。



