- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
为什么在 TCP 3 次握手的第 3 部分没有传输数据?例如
(A 到 B)同步
(B 到 A)ACK+SYN
(A 到 B)ACK.... 为什么不能将数据与此 ACK 一起传输?
最佳答案
我一直认为这是将 session 建立阶段与数据传输阶段分开,以便在 session 两端就序列号和 session 达成一致之前没有真正的数据被传输选项,特别是因为到达的数据包可能来自完全不同的、先前的 session ,而该 session 恰好具有相同的端点。
但是,在进一步调查中,我不能完全确定使用握手数据包传输数据是不允许的。我的Internetworking with TCP/IP1 一书中关于 TCP 连接建立的部分包含以下片段:
Because of the protocol design, it is possible to send data along with the initial sequence numbers in the handshake segments. In such cases, the TCP software must hold the data until the handshake completes. Once a connection has been established, the TCP software can release data being held and deliver it to a waiting application program quickly.
因为用SYN
(或ACK
)和数据构造TCP数据包当然是可能的,所以这很可能被允许。我从未在野外见过这种情况,但是,话又说回来,我也从未在野外见过毛耳矮狐猴,尽管我确信它们存在。
可能是套接字软件在 session 完全建立之前阻止数据外出,但 TCP 似乎认为它有效。看来您可以使用 SYN-ACK
数据包发送数据(连接建立的第 2 阶段),因为您有另一端的序列号和选项。同样,使用阶段 3 ACK
数据包发送数据似乎也是可能的。
TCP 软件在握手完全完成之前一直保留数据的原因可能是由于上述原因 - 只有双方就序列号达成一致后,您才能确定数据不是来自先前的数据 session 。
1 Internetworking with TCP/IP Volume 1 Principles, Protocols and Architecture,第 3 版,Douglas E. Comer,ISBN 0-13-216987-8。
关于networking - tcpip 3 次握手,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3437569/
我是一名优秀的程序员,十分优秀!