TCP_IP通信主要包含以下三个步骤(/阶段):
一、建立连接阶段 —— 三次握手
二、数据传输阶段
三、关闭连接阶段(/释放连接) —— 四次挥手
第一阶段:建立连接 (如下图)
① 客户端向服务端发送连接请求报文 → (SYN=1,seq = client_isn)
② 服务端接受客户端的连接请求并回复ACK报文及给此次连接分配资源。 → (SYN=1,seq = client_isn, ack = client_isn + 1)
③ 客户端接受来自服务端的ACK报文后,回复ACK报文给服务端并分配资源。 → (SYN=0,seq = server_isn, ack = server_isn + 1) // 图有误
第三阶段:断开连接 (如下图)
【注】 TCP连接的断开可以是服务端,也可以是客户端。
下面以客户端断开TCP连接为例说明。
① 客户端向服务端发送断开TCP连接的请求,即发送FIN报文。【这一步表明客户端没有数据要发送给服务端了】
② 服务端接受客户端的FIN报文后,由于可能还有数据未发送完成,因此先发送ACK报文。【这一步表明服务端已收到客户端的关闭连接请求,但服务端可能还有数据需要发送,让客户端等待消息】 —— 此时客户端进入FIN_WAIT状态,等待服务端的FIN报文。
③ 当服务端的数据发送完毕,就向客户端FIN报文。【这一步表明服务端数据发送完毕,准备好关闭连接了】
④ 客户端接受到服务端的FIN报文后,但仍不确定服务端是否清楚要关闭。因此接着发送ACK报文,直至服务端接收到为止。【这一步客户端发送完ACK报文后就进入TIME_WAIT状态】
服务端接受到客户端的ACK报文后,就断开连接。客户端等待2MSL依然没有收到回复则说明服务端已正常关闭,此时客户端也关闭连接。
OVER~TCP连接就正常关闭了。
整个TCP连接建立至断开的过程中,
客户端的状态变化
建立连接阶段:
发送SYN → SYN_SEND
接收SYN+ACK & 发送ACK → ESTABLISHED
断开连接阶段:
向服务端发送FIN → FIN_WAIT_1
接收服务端ACK → FIN_WAIT_2
接收服务端FIN & 发送ACK → TIME_WAIT
等待2MLS → CLOSED
服务端的状态变化
建立连接阶段:
监听套接字 → LISTEN
接收到客户端SYN & 发送SYN+ACK → SYN_RCVD
接收客户端ACK → ESTABLISHED
断开连接阶段:
接收FIN & 发送ACK → CLOSE_WAIT
发送FIN报文 → LAST_ACK
接收客户端ACK → CLOSED
参考:
TCP协议中的三次握手和四次挥手(图解)
在此表示感谢。