Window网络编程 TCP状态
来源:互联网 发布:php员工信息管理系统 编辑:程序博客网 时间:2024/04/29 14:33
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.正常情况下,通信对方会回应一个ACK包,我们的套接字的状态随之编程FIN_WAIT2.如对方也关闭了连接,便会发出一个FIN包,我们的机器则会相应一个ACK包,并将己方套接字的状态置为TIME_WAIT.
TIME__WAIT状态也叫作2MSL等待状态。其中,MSL代表“分段最长生存时间”(Maximum Segment Lifetime),表示一个数据包在丢弃之前,可在网络存在多长时间。每个IP包都包含一个“生存时间”(TTL)字段,若它递减为0,包便会被丢弃。一个包经过网络上的每个路由器时,TTL值就会减1,然后继续传递。一旦应用程序进入TIME_WAIT状态,那么就会一直持续MSL时间的两倍之久。这样一来,TCP就可以在最后的一个ACK丢失的前提下,重新发送它,也就是说,FIN会被重新传送出去。MSL时间两倍之久的等待状态之后,套接字便进入CLOSED状态。
采取主动关闭措施时,有两个路径会进入TIME_WAIT状态。在我们以前的讨论中,只有一方发出一个FIN,并接受一个ACK相应。然而,另一方仍然可以自由地发送数据,直到它也被关闭为止。因此,需要两个路径发挥作用。在一个路径中(即同步关闭),一台计算机和它的通信对方会同时要求关闭;计算机向对方送出一个FIN数据包,并从它那里接受一个FIN数据包。随后,计算机会发出一个ACK数据包,想对方的FIN包做出相应,并将自己的套接字置为CLOSING状态。计算机从对方那里接收到最后一个ACK包之后,它的套接字状态会百年城TIME_WAIT.
主动关闭时,另一个路径其实就是同步关闭的变体:套接字从FIN_WAIT_1转台直接编程TIME_WAIT。若应用程序发出一个FIN数据包,但几乎同时便从对方那里接收到一个FIN-ACK包,这种情况就会发生。在这种情况下,对方会确认收到应用程序的FIN包,并送出自己的FIN包。对于这个包,应用程序就会用一个ACK包做出相应。
TIME_WAIT状态的主要作用是在TCP连接处于2MSL等待状态的时候,规定用于建立那个连接的一对套接字不可被拒绝。这对套接字有本地IP端口以及远程IP端口组成。对某些TCP实施方案来说,它们不允许拒绝处于TIME_WAIT状态下的套接字对中的任何端口号。然而,若试图通过一对已处于TIME_WAIT状态的套接字建立连接,就会失败,并返回
WSAEADDRINUSE错误。
被动关闭情况下,应用程序会从对方哪里接收一个FIN包,并用ACK包做出相应。此时,应用程序的套接字会变成CLOSE_WAIT状态。由于对方已关闭自己的套接字,所以不能再发送数据了。但应用程序不同,它能一致发送数据,直到对方的套接字已关闭为止。要先关闭对方的连接,应用程序需要发出字节的FIN,另应用程序的套接字状态变成LAST_ACK。应用程序会从对方收到一个ACK包后,它的套接字就会逆转成CLOSED状态。
资料参考:《WINDOOWS 网络编程》 第二部分 Winsock API,
- Window网络编程 TCP状态
- Window网络编程之TCP通信
- Linux网络编程系列-TCP状态分析
- Linux网络编程之TCP状态转换
- TCP状态(选自Windows网络编程技术)
- Linux 网络编程 之 TCP状态装换
- 网络编程Socket之TCP之TIME_WAIT状态详解
- 【Unix 网络编程】TCP状态转换图详解
- 【网络编程】TCP状态转换图(重点)
- Linux网络编程10(2) -- TCP通信过程中的状态
- 网络--- tcp状态总结
- window网络编程
- window下TCP socket编程
- TCP/IP网络编程
- TCP/IP网络编程
- dotnet 网络编程 tcp
- 网络编程TCP
- 网络编程 TCP
- Linux开发环境下的动态库和静态库
- spring+jotm 多数据源事务管理(二)hibernate
- IOS Socket使用大全 -将持续更新
- Mybatis中的批量添加和批量删除
- MyEclipse优化
- Window网络编程 TCP状态
- 文件不小心给删了还能找回吗
- 软件人员推荐书目(一) 大师篇
- spring+jotm 多数据源事务管理(三)JNDI+Tomcat
- MBProgressHUD特效
- java 网络编程回顾(一)
- 鼎力支持地球一小时,点心移动彰显移动互联网“社会责任感”
- 使用 udev 高效、动态地管理 Linux 设备文件
- CreateEvent()的用法