《TCP/IP详解卷3:TCP事务协议、HTTP、NNTP和UNIX域协议》 —2.5 T/TCP的扩展状态

举报
华章计算机 发表于 2019/11/19 21:11:25 2019/11/19
【摘要】 本节书摘来自华章计算机《TCP/IP详解卷3:TCP事务协议、HTTP、NNTP和UNIX域协议》一书中第2章,第2.5节,作者是[美]W. 理查德·史蒂文斯(W.Richard Stevens) ,胡谷雨 吴礼发 等译 谢希仁 校。

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个半同步加星状态)。

image.png

图2-7   TCP根据不同的当前状态(常规或加星)所发送的内容

在图2-7中,加星状态下把SYN和FIN这两个新标志置于开状态时用黑体标出。


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。