因为 TCP 握手第三步的 ACK 可以丢包,所以客户端无法知晓 TCP 连接是否真正建立。只知道如果服务端重发第二步的包,连接建立失败。然而,服务端的第二步包重发也是可以丢包的。所以 TCP 连接是否真正建立,对于客户端来说是薛定谔问题。
那么,真正让客户端知道 TCP 是否连接正常,客户端必须发一个正常的数据包,并且得到服务端的确认,即最关键的第四步确认,客户端才知道 TCP 连接建立是成功的。
在这种情况下,客户端省掉第三步 ACK,直接发一个或多个正常的数据包,并且服务端的连接成功确认机制修改为接收到客户端第一个数据包,那么 TCP 连接也是可以正常建立的。
那么,是不是说,第三步 ACK 真的可以省略呢?或者说,真正建立连接的过程其实是至少四步 ?
那么,真正让客户端知道 TCP 是否连接正常,客户端必须发一个正常的数据包,并且得到服务端的确认,即最关键的第四步确认,客户端才知道 TCP 连接建立是成功的。
在这种情况下,客户端省掉第三步 ACK,直接发一个或多个正常的数据包,并且服务端的连接成功确认机制修改为接收到客户端第一个数据包,那么 TCP 连接也是可以正常建立的。
那么,是不是说,第三步 ACK 真的可以省略呢?或者说,真正建立连接的过程其实是至少四步 ?