分类: LINUX
2011-06-06 19:05:17
在TCP中,所涉及的状态转换如下:
最上面的CLOSED为起始状态点,其中的虚线部分为服务器,而实线部分为客户端。
在一开始服务器处于LISTEN状态,当客户端主动连接服务器时,客户端向服务器发生SYN请求,服务器接受到SYN请求,发送ACK,此时服务器处于 SYN_RCVD,而客户端处于状态SYN_SENT状态。
当客户端发送ACK请求后,服务器与客户端之间就处于连接建立状态,ESTABLISHED状态,双方开始进行通信。
通信完成后,一方开始发送FIN请求(由于TCP为全双工通信,则任何一方都可以发送终止数据流向的FIN请求),先发的一方称为active ,另一方则称为passive ,当active发送完FIN请求后,则处于FIN_WAIT_1等待对方的确认,而passive 接受到FIN请求后,发送ACK确认之后就处于CLOSE_WAIT状态,active 接受到ACK之后,就处于FIN_WAIT_2状态,如果先接受到FIN,则发送ACK,处于状态CLOSING,如果同时接受FIN,ACK则处于TIME_WAIT状态。
当passive 发送完数据后,也发送 FIN请求,这样它最后只需要接受一个ACK确认,这样它就处于状态LAST_ACK,而当active发送ack之后,就处于状态TIME_WAIT,到了2个MSL时间后,端口自动重用。