V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
lhx2008
V2EX  ›  问与答

TCP 三次握手第三步的 ACK 是否可以省略?

  •  
  •   lhx2008 · 2019-03-16 23:34:23 +08:00 via Android · 2212 次点击
    这是一个创建于 1839 天前的主题,其中的信息可能已经有所发展或是发生改变。
    因为 TCP 握手第三步的 ACK 可以丢包,所以客户端无法知晓 TCP 连接是否真正建立。只知道如果服务端重发第二步的包,连接建立失败。然而,服务端的第二步包重发也是可以丢包的。所以 TCP 连接是否真正建立,对于客户端来说是薛定谔问题。

    那么,真正让客户端知道 TCP 是否连接正常,客户端必须发一个正常的数据包,并且得到服务端的确认,即最关键的第四步确认,客户端才知道 TCP 连接建立是成功的。

    在这种情况下,客户端省掉第三步 ACK,直接发一个或多个正常的数据包,并且服务端的连接成功确认机制修改为接收到客户端第一个数据包,那么 TCP 连接也是可以正常建立的。

    那么,是不是说,第三步 ACK 真的可以省略呢?或者说,真正建立连接的过程其实是至少四步 ?
    11 条回复    2019-03-18 07:03:46 +08:00
    huangzhe8263
        1
    huangzhe8263  
       2019-03-16 23:54:17 +08:00 via Android   ❤️ 1
    第三步如果没记错是为了防止第二步的包在网络中滞留之后重发导致会开启多个连接吧
    kyuuseiryuu
        2
    kyuuseiryuu  
       2019-03-17 00:00:37 +08:00   ❤️ 1
    客户端第三步发的 ACK 是让服务端知道能够连接

    服务端第二步发的就是让客户端知道能够连接并且想让客户端告诉服务端能不能连接

    原文的第二段,TCP 的第一步和第二步就已经做掉了。

    最后,这个发在胡思乱想节点比较好。
    mondeo
        3
    mondeo  
       2019-03-17 00:01:29 +08:00 via iPhone   ❤️ 1
    第三部就是 ack+data 了啊
    mimzy
        4
    mimzy  
       2019-03-17 00:04:20 +08:00 via Android   ❤️ 3
    lhx2008
        5
    lhx2008  
    OP
       2019-03-17 00:17:35 +08:00 via Android
    @mondeo 虽然说语意上是需要 ACK,但是 ACK+DATA 这种设计更说明了我直接发 DATA,起到的效果可以是一样的
    lyog
        6
    lyog  
       2019-03-17 00:50:48 +08:00 via iPhone   ❤️ 1
    回楼上疑问:tcp 是累加 ack,单纯的丢失一次纯 ask 不会影响通讯。回帖子疑问:第二步一直丢包的话,会触发超时,然后发送 RST 包强制关闭连接,并没有薛定谔
    vansl
        7
    vansl  
       2019-03-17 00:58:42 +08:00 via iPhone   ❤️ 1
    感觉还是一楼说的那个最基本的滞留问题。第一个包是滞留包,导致第二个包不是有效的,那么何谈可以省略第三个包而直接发数据?
    lqs
        8
    lqs  
       2019-03-17 01:02:42 +08:00 via iPhone   ❤️ 1
    有些协议(如 ftp ssh mysql 等)是服务端先发数据,服务端需要等到第三个包确认客户端有效后才能开始发数据。
    vansl
        9
    vansl  
       2019-03-17 01:19:08 +08:00 via iPhone
    @vansl 收回发言同意八楼。
    lhx2008
        10
    lhx2008  
    OP
       2019-03-17 08:00:49 +08:00 via Android
    @lyog 第三步 ACK 发出去之后,如果不再进行发包,那么这个时候拔网线,客户端是认为 TCP 连接已经建立了还是没建立?
    julyclyde
        11
    julyclyde  
       2019-03-18 07:03:46 +08:00
    @lhx2008 你不要自己添加干扰项。四层是否建立,和二层通不通一点关系都没有
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2017 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 16:17 · PVG 00:17 · LAX 09:17 · JFK 12:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.