Java网络编程系列之TCP连接状态
1、TCP连接状态
- LISTEN:Server端打开一个socket进行监听,状态置为LISTEN
- SYN_SENT:Client端发送SYN请求给Server端,状态由CLOSED变为SYN_SENT
- SYN_RECV:Server端接收Client端发送的SYN请求,并回应ACK给Client端,同时发送SYN请求给Client端,状态由LISTEN变为SYN_RECV
- ESTABLISHED:Client端(接收Server端的ACK,状态由SYN_SENT变为ESTABLISHED)和Server端(接收Client端的ACk,状态由SYN_RECV变为ESTABLISHED)完成三次握手,状态置为ESTABLISHED,连接建立
- FIN_WAIT1:主动关闭端发出FIN请求主动关闭连接,状态由ESTABLISHED变为FIN_WAIT1
- CLOSE_WAIT:被动关闭端接收FIN请求,并回应ACK给主动关闭端,同时将FIN作为文件结束符发送给上层应用程序,状态由ESTABLISHED变为CLOSE_WAIT
- FIN_WAIT2:主动关闭端接收到ACK,状态由FIN_WAIT1变为FIN_WAIT2
- LAST_ACK:被动关闭端一段时间后,接收到文件结束符的上层应用程序,调用CLOSE关闭连接,此时被动关闭端会发送FIN请求给主动关闭端,状态由CLOSE_WAIT变为LAST_ACK
- TIME_WAIT:在主动关闭端接收到FIN请求,并回应ACK给被动关闭端,状态由FIN_WAIT2变为TIME_WAIT
- CLOSING:两端同时发起关闭请求时,会由FIN_WAIT1变为CLOSING
- CLOSED:1)被动关闭端收到主动关闭端的ACK,状态由LAST_ACK变为CLOSED;2)TIME_WAIT状态一段时间后,状态自动置为CLOSED
- UNKNOWN:未知的Socket状态,不正常
- SYN:(同步序列编号,SynchronizeSequence Numbers)该标志仅在三次握手建立TCP连接时有效,表示一个新的TCP连接请求
- ACK:(确认编号,AcknowledgementNumber)是对TCP请求的确认标志,同时提示对端系统已经成功接收所有数据
- FIN:(结束标志,FINish)用来结束一个TCP回话.但对应端口仍处于开放状态,准备接收后续数据
2、TCP连接建立(三次握手)
3、TCP连接断开(四次挥手)
4、TCP连接状态分析
- 若服务器出现了大量TIME_WAIT状态的连接,说明该服务器经常主动发起连接关闭操作,并且连接还未及时关闭;这一方面会产生大量的无用连接,无故增加tcp的连接数,另一方面就是服务端主动关闭连接也不正常。
- 若一个系统频繁出现CLOSE_WAIT状态的连接,说明该系统并未立即处理连接关闭请求;这一方面会产生大量的无用连接,无故增加tcp的连接数,另一方面就是服务端可能阻塞了。
作者:尜尜人物