建立连接(3次握手)
- SYN是标志位,设置SYN=1,表示请求建立连接
- 服务端会同时和多个客户端建立连接,所以在报文交互时,需要带上序号seq,在响应是seq+1,以此来检测报文合法性
连接过程
- 客户端:我想建立一个连接。状态:CLOSED -> SYN SENT
- 服务端:可以,我同意建立连接。状态:LISTEN -> SYN RCVD
- 客户端:好的,我收到你的确认,我准备好接收数据了。状态:SYN SENT -> ESTABLISHED
- 服务端听到客户端准备好了,也进入准备状态。状态:SYN RCVD -> ESTABLISHED
至此,TCP连接就建立完毕,开始互相发送数据了。
断开连接(4次挥手)
- FIN是标志位,设置FIN=1,表示请求断开连接
断开连接过程
- 客户端:我数据发完了,我要断开连接了。状态:ESTABLISHED -> FIN WAIT 1
- 服务端:好,我知道你要断开连接了。状态:ESTABLISHED -> CLOSE WAIT
此时,客户端确认服务端已经知道要断开了。但是,服务端可能还有数据没发送完,所以客户端还能接收数据但不会发送数据。状态:FIN WAIT 1 -> FIN WAIT 2
过了一会,服务端数据发完了。
- 服务端:我准备好了,断开连接吧。状态:CLOSE WAIT -> LAST ACK
- 客户端:好,那我断开连接了,再见。状态:FIN WAIT 2 -> TIME WAIT
- 服务端:客户端已经断开了,我也断开吧。状态:LAST ACK -> CLOSED
- 客户端等待2个MSL时间以后断开连接,状态:TIME WAIT -> CLOSED
TCP握手挥手的状态
状态 | 描述 |
---|---|
CLOSED | 关闭状态,没有连接活动或正在进行 |
LISTEN | 监听状态,服务器正在等待连接进入 |
SYN SENT | 已经发出连接请求,等待确认 |
SYN RCVD | 收到一个连接请求,尚未确认 |
ESTABLISHED | 连接建立,正常数据传输状态 |
FIN WAIT 1 | (主动关闭)已经发送关闭请求,等待确认 |
FIN WAIT 2 | (主动关闭)收到对方关闭确认,等待对方关闭请求 |
TIME WAIT | 完成双向关闭,等待所有分组死掉 |
CLOSE WAIT | (被动关闭)收到对方关闭请求,已经确认 |
LAST ACK | (被动关闭)等待最后一个关闭确认,并等待所有分组死掉 |
CLOSING | 双方同时尝试关闭,等待对方确认 |