TCP状态
作为一个Winsock程序员,通常没必要了解实际的TCP状态。但了解TCP状态,就能更好地理解Winsock API调用如何对基层协议中的改变产生影响。此外,许多程序员在关闭套接字时,会碰到一个常见的问题;围绕套接字关闭的TCP状态是我们目前最感兴趣的问题。
对每一个套接字来说,它的初始状态都是CLOSED。若客户机初始化一个连接,就会向服务器发送一个SYN包,同时将客户机套接字状态设置为SYN_SENT.服务器收到SYN包后,会发出一个'SYN-ACK"包。作为客户机,需要用一个ACK包对它做出反映。此时,客户机的套接字会变成ESTABLISHED状态。如果服务器一直不发送“SYN-ACK”,客户机就会超时,并返回CLOSED状态。
若一个服务器的套接字同一个本地接口和端口绑定起来,并在它生面进行监听,那么套接字的状态便是LISTEN.客户机试图与之连接时,服务器就会收到一个SYN包,并用一个SYN_ACK包做出相应。服务器套接字的状态就变成SYN-RCVD。最后,客户机发出一个ACK包,令服务器套接字的状态编程ESTABLISHED。
一旦应用处于ESTABLISHED状态,可通过两种方法来关闭它。如果由应用程序来关闭,便叫作“主动套接字关闭”;否则 ,套接字的关闭便是被动的。图 7-2对两种关闭方法进行了解释。如主动关闭,应用程序便会发出一个FIN包。应用程序调用closesocket或shutdown时(把SD_SENT当做第二个参数),会向对方发出一个FIN包,而且套接字的状态则变成
FIN_WAIT_1.正常情况下