天天看点

Linux 网络编程 之 TCP状态转换

                                               linux 网络编程 之 tcp状态装换

Linux 网络编程 之 TCP状态转换
Linux 网络编程 之 TCP状态转换

从上面的图中可以看出,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

并请联系谭海燕本人或者前往谭海燕个人主页留言

继续阅读