2010-08-09 128 views
6

为什么在TCP三次握手的第三部分数据不传输? 例如tcpip三次握手

(A至B)SYN

(B至A)ACK + SYN

(A至B)ACK ....为什么不能数据与此ACK一起传送?

+0

我不明白为什么它不能...该协议规定,在建立连接后* * B收到ACK,虽然。 – Borealid 2010-08-09 05:41:27

回答

5

我一直认为它是保持会话建立阶段与数据传输阶段分开,以便传输实际数据,直到会话的两端都就序列号和会话选项达成一致,尤其是因为到达的数据包可能来自完全不同的前一个会话,而这些会话恰好具有相同的端点。

但是,在进一步调查中,我并不完全确定使用握手数据包传输数据是不允许的。在我互联与TCP/IP 本书包含下面的代码片段上建立TCP连接的部分:

由于协议设计的,有可能与在初始序列号一起发送数据握手细分。在这种情况下,TCP软件必须保存数据直到握手完成。建立连接后,TCP软件可以释放正在保存的数据并将其快速传送到等待的应用程序。

由于它肯定可以构建一个TCP包与SYN(或ACK数据,这很可能被允许。我已经从来没有看到它发生在野外,但是,我再也没有见过野生毛茸茸的矮人狐猴,但我确信它们存在。

这可能是它的套接字软件可以防止数据在会话完全建立之前发生,但TCP似乎认为它是有效的。看起来您可以使用SYN-ACK数据包(连接建立的第2阶段)发送数据,因为您拥有另一端的序列号和选项。同样,发送包含阶段3 ACK数据包的数据似乎也是可能的。

TCP握手软件保持数据直到握手完全完成的原因可能是由于上面提到的原因 - 只有一旦两端同意序列号,您可以确信数据不是来自前一届会议。


Internetworking with TCP/IP Volume 1 Principles, Protocols and Architecture, 3rd edition, Douglas E. Comer, ISBN 0-13-216987-8.

+0

让你想知道这样的数据是否会潜伏在那些不需要初始握手中的数据的深度包检测过滤器中! – caf 2010-08-10 00:40:14