TCP状态迁移

来源:互联网 发布:开淘宝都买宝马了 编辑:程序博客网 时间:2024/05/20 10:12

TCP 状态变迁


最近重新阅读了一下TCP/IP详解这本书。当读到TCP状态变迁图的时候,对于书中描述的一些状态变迁过程很不理解,感觉应该是中文版的书翻译有问题。于是找来了英文原版对照,发现真的是翻译有误。所以记录下来,希望可以让后来看到这个地方有疑惑的同学避免入坑。其中如果有什么错误,欢迎各位同学进行指正。


图1原版TCP状态变迁图


图2中文版TCP状态变迁图


两张图的对比

英文原本中对应的状态变迁变化用了3种线来描述,3种线区别非常明显。黑长直代表的是正常的client的状态迁移;虚长直代表的是正常的server的状态迁移;细长直代表是server或者client的状态迁移,要根据实际情况来看。而在中文版的图中,3种线差别并不是非常明显无法让人区分开。(当我看到SYN_RCVD—->LISTEN的时候,我的内心是崩溃的。客户端从SYN_RCVD状态会变成LINSTEN状态,客户机根本都没有调用listen函数,这是什么鬼。)这里正确的理解应该根据书中的一句话:

只有当SYN_RCVD状态是从LISTEN状态(正常情况)进入,而不是从 SYN_SENT状态(同时打开)进入时,从SYN_RCVD回到LISTEN的状态变迁才是有效的。这意味着如果我们执行被动关闭(进入 LISTEN),收到一个SYN,发送一个带ACK的SYN(进入SYN_RCVD),然后收到一个RST,而不是一个ACK,便又回到LISTEN状态并等待另一个连接请求的到来。

其中书中有一个地方是翻译错误,就是黑体标注的地方,这里应该是被动打开才对。我们可以看一下英文版是怎么描述的:

The state transition from LISTEN to SYN_SENT is legal in the TCP protocol but is not supported by Berkeley sockets and is rarely seen. The transition from SYN_RCVD back to LISTEN is valid only if the SYN_RCVD state was entered
from the LISTEN state (the normal scenario), not from the SYN_SENT state (a
simultaneous open). This means that if we perform a passive open (enter LISTEN),
receive a SYN, send a SYN with an ACK (enter SYN_RCVD), and then receive a
reset instead of an ACK, the endpoint returns to the LISTEN state and waits for
another connection request to arrive.

可以看到,正确的翻译应该是被动打开。这句话的意思其实是只有被动打开了LISTEN状态变迁到SYN_RCVD,如果收到RST就会回到LISTEN状态,这个是有效的(这个可以有)。言外之意,是从SYN_SENT变迁到SYN_RCVD的情况,如果收到RST,不会变迁为LISTEN状态(这个真没有)。

0 0