《TCP/IP详解卷3:TCP事务协议、HTTP、NNTP和UNIX域协议》 —2.5 T/TCP的扩展状态
2.5 T/TCP的扩展状态
T/TCP中定义了7个扩展状态,这些扩展状态都称为加星状态。它们分别是SYN_SENT*、SYN_RCVD*、ESTABLISHED*、CLOSE_WAIT*、LAST_ACK*、FIN_WAIT_1*和CLOSING*。例如,在图1-12中,客户发出的第一个报文段中包含有SYN标志、数据和FIN。当该报文段是在主动打开中发送出去时,客户随即进入SYN_SENT*状态,而不是进入通常的SYN_SENT状态,这是因为随报文段还必须发出一个FIN。当收到服务器的应答时,该应答中包含服务器的SYN、数据和FIN,以及对客户的SYN、数据和FIN的确认(ACK)。这时客户端插口的连接状态要经历一系列的状态变迁:
对客户SYN的ACK将连接的状态变迁到FIN_WAIT_1。传统的ESTABLISHED状态就这样完全跳过去了,因为这时客户已经发出了FIN。
对客户FIN的ACK将连接状态变迁到FIN_WAIT_2。
收到服务器的FIN,连接状态变迁到TIME_WAIT。
RFC 1379详细描述了包括所有这些加星状态后的状态变迁图演变过程。当然,得到的结果远比图2-6复杂,其中有很多重叠的线。幸运的是,无星状态和对应的加星状态之间只是一些简单的关系。
SYN_SENT*状态和SYN_RCVD*状态与对应的无星状态几乎完全相同,唯一的不同之处是在加星状态下要发出一个FIN。这就是说,当一端主动打开连接并且应用程序在连接建立之前就指定了MSG_EOF(发送FIN)时就进入相应的加星状态。在这种情况下,客户端一般是进入SYN_SENT*状态,SYN_RCVD*状态只有当双方碰巧同时执行打开连接操作的偶然情况下才会出现,关于这一点我们在卷1的18.8节中已有详细讨论。
ESTABLISHED*、CLOSE_WAIT*、LAST_ACK*、FIN_WAIT_1*和CLOSING*这五个状态与对应的不加星状态除了要发送SYN外也完全相同。当连接处于这五个状态之一时,叫作已经半同步了。当接收端处于被动状态且收到一个带有TAO测试、可选数据和可选FIN的SYN报文段时,连接即进入这些加星状态(4.5节详细描述了TAO测试)。之所以用半同步这个词,是因为一旦收到SYN,接收端就认为连接已经建立了(因为已经通过了TAO测试),尽管此时刚刚完成了常规三次握手过程的一半。
图2-7给出了加星状态和对应的常规状态。对于每个可能的状态,图中还列出了所发送的报文段类型。
我们将会看到,从实现的角度来看,这些加星的状态是很容易处理的。除了要保持当前已有的无星状态外,在每个连接的TCP控制块中还有两个额外的标志:
TF_SENDFIN 表示需要发送FIN(对应于SYN_SENT*状态和SYN_RCVD*状态)。
TF_SENDSYN 表示需要发送SYN(对应于图2-7中的5个半同步加星状态)。
图2-7 TCP根据不同的当前状态(常规或加星)所发送的内容
在图2-7中,加星状态下把SYN和FIN这两个新标志置于开状态时用黑体标出。
- 点赞
- 收藏
- 关注作者
评论(0)