在没有理解 TCP 连接是如何建立和终止之前,我想你可能并不会使用 connect,accept,close 这三个函数并且使用 netstat 程序来调试应用。所以掌握 TCP 连接的建立和终止势在必行。
为什么发送加一的序列号呢?因为这是发送这一端所期待的下一个序列号,而且 SYN 占据一个字节的序列号空间;
在步骤 2 和步骤 3 之间,从执行被动关闭一端到执行主动关闭一端流动数据是又可能,这成为半关闭。
这个图只是展示了客户端执行主动关闭的情况,不过无论是客户端还是服务器端,任何一方都可以执行主动关闭。
在理解了前面的知识以后,再来看总体的状态转换图就会简单很多。
TCP 为一个连接定义了 11 种状态,并且 TCP 规则规定如何基于当前状态及在该状态下所接收的分节从一个状态转换到另一个状态。
- LISTEN :监听来自远方TCP端口的连接请求。
- SYN-SENT :在发送连接请求后等待匹配的连接请求。
- SYN-RECEⅣED :在收到和发送一个连接请求后等待对连接请求的确认。
- ESTABLISHED :代表一个打开的连接,数据可以传送给用户。
- FIN-WAIT-1 :等待远程TCP的连接中断请求,或先前的连接中断请求的确认。
- FIN-WAIT-2 :从远程TCP等待连接中断请求。
- CLOSE-WAIT :等待从本地用户发来的连接中断请求。
- CLOSING :等待远程TCP对连接中断的确认。
- LAST-ACK :等待原来发向远程TCP的连接中断请求的确认。
- TIME-WAIT :等待足够的时间以确保远程TCP接收到连接中断请求的确认。
- CLOSED :没有任何连接状态。
TCP 连接过程是状态的转换,促使发生状态转换的是用户调用:OPEN,SEND,RECEⅣE,CLOSE,ABORT 和 STATUS。传送过来的数据段,特别那些包括以下标记的数据段 SYN,ACK,RST 和 FIN。还有超时,上面所说的都会时 TCP 状态发生变化。
图中粗实线代表的是客户端状态转换,虚线代表的是服务器状态转换。
我们从图中可以发现两种特殊的情况,分别是同时打开和同时关闭,前者发生在两端几乎同时发送 SYN 并且这两个 SYN 在网络中交错的情形下,后者发送在同时发送 FIN 的情形下。
很明显,这个连接的过程经历四次数据交换,但是一个典型的连接建立只需要 3 次。
从状态转换图中可以发现,TCP 在遇见这种协议的时候,只会打开一条连接,比如图中是由客户端做主动打开。
在发送程序后则会进入到 FIN_WAIT_1 状态。在收到对端的 FIN 后,回复一个 ACK,会进入 CLOSING 状态。在收到对端的 ACK 后,进入 TIME_WAIT 状态,也就是说,这中间不会在存在半关闭的状态。
,可以存在谷歌云盘,还可以现场导出图片和 PDF
来源: http://www.cnblogs.com/George1994/p/6597842.html