从上面的图中可以看出,TCP共有11状态.由TCP发送和接收的数据有:ACK, FIN, SYN,RST.对于一个还未调用connect的client和未调用listen的server来说,它们都处于CLOSED状态.ACK是应答信息,任何一端(client或者server),在接收到数据(这里的数据包括应用程序write或者TCP发出的信息比如FIN)之后,都会发出的应答信息.FIN是close一个socket后由TCP发出的信息,SYN是握手信息.RST信息,则是client向server发送数据请求,但是server并没有运行.则client会收到来自对方主机发送的RST信息.
客户端调用connect,会向server发送SYN信息,此时client状态有CLOSED转变成SYN_SENT状态.而server在调用listen之后,会由CLOSED状态转变成LISTEN状态,此时,server就会一直监听server的端口,接收来自client的信息.在server接收到来自client的SYN信号后,会向client发出一个SYN和ACK信息,此时,server由LISTEN状态转变成SYN_RCVD状态.client接收到server的SYN和ACK信息之后,会向server回复一个ACK信息,到此为止,client和server之间就建立起连接了.client和server的状态都变成ESTABLISHED状态.
在这11个状态中,除了ESTABLISHED外,还有2个比较重要的状态:CLOSED_WAIT和TIME_WAIT.CLOSE_WAIT状态时有对方主动调用close,向本地(这里本地,并不一定说的是client)发送FIN,本地接收到FIN,并向对方发送ACK之后,本地状态会变成CLOSE_WAIT状态.那么,本地如果需要从CLOSE_WAIT状态变成CLOSED状态,需要本地向对方发送FIN,也就是需要本地主动调用close,本地进入LAST_ACK,在本地接收到ACK之后,就进入CLOSED状态.
版权申明:
转载文章请注明原文出处http://blog.csdn.net/feiyinzilgd/archive/2010/09/19/5893995.aspx
并请联系谭海燕本人或者前往谭海燕个人主页留言