2012-03-08 122 views
2

此链接解释了TCP State Machine。它列出了基于发送/接收事件的所有状态转换。我觉得它只是描述了那些明显的。我想知道当您处于LISTEN状态并且您收到DATA包时,或者处于ESTABLISHED状态并且您收到SYN时发生了什么。TCP状态转换如何发生?

在c/C++可用,WINSOCK库或其他的任何TCP的实现? TCP RFC文档很好,所有的,但实施将更有帮助,IMO。

回答

3

这是你想要的东西的优秀资源:

1995 - TCP/IP详解,卷2:实现(与加利R.莱特) - ISBN 0-201-63354-X

+0

我在大学的图书馆借了这本书,其确实非常全面,解决了我对状态变化以及如何实际处理单个数据包的大多数担忧。谢谢,接受回答。 – 2012-03-08 19:38:36

3

在任何网络协议(状态机等)的描述中,假设对于一个给定状态无效的数据包正要被丢弃是相当安全的。如果堆栈在已建立的TCP流(源/目标IP:PORT与该流匹配)中获得SYN,则可能是一些欺骗性攻击或头校验无法捕获的损坏。数据包应该在没有任何状态更新的情况下丢弃。

我不怀疑在TCP状态机的描述中明确包含像这样的情况是有用的。这就像在语言的语法描述中包含每一个可能的语法错误:混乱,庞大而混乱。

+0

+1,仅包含生成有效操作的状态/事件是完全合理的。有可能,也可能不会,有些段落。某处说所有其他情况都不会导致行动。 – 2012-03-09 11:52:48

2

正如您所提到的,TCP RFC是一个非常丰富的阅读。

你问到实现,所以这里有一些资源,你可能感兴趣的:

LWIP的重点放在最大限度地减少资源使用,并有一个paper (PDF)已经发布,详细说明了它是如何实现这一点的。本文详细介绍了实现,这可能会回答上面的一些问题。 Linux内核提供了一个完整的实现和一些更具体的堆栈实现。由于其复杂性,导航源代码的确很难,但可能是您可以找到的最完整的开源实现。