tcpip 3次握手

san*_*eep 6 networking tcp

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

(A到B)SYN

(B到A)ACK + SYN

(A到B)ACK ....为什么不能将数据与此ACK一起传输?

pax*_*blo 6

我一直相信这是保持会话的建立阶段,从数据传输相分离,这样没有实际的数据传输,直到会话的两端都同意顺序号和会话选项,尤其是因为数据包到达的可能是从完全不同的,以前的会话恰好具有相同的端点.

但是,经过进一步调查,我不完全确定不允许使用握手数据包传输数据.我使用TCP/IP 1书进行网际互联中的 TCP连接建立部分包含以下代码段:

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

由于使用SYN(或ACK)数据构造TCP数据包当然是可能的,因此很可能允许这样做.我从来没有看到它发生在野外,但还是那句话,我从来没有见过在野外毛耳鼠狐猴要么,虽然我确信它们的存在.

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

TCP软件保持数据直到握手完全完成的原因可能是由于上面提到的原因 - 只有在两端都同意序列号时才能确定数据不是来自前一个会话.


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