V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
lysShub
V2EX  ›  程序员

为什么我的 ACK 包会携带有数据?

  •  
  •   lysShub · 277 天前 · 1726 次点击
    这是一个创建于 277 天前的主题,其中的信息可能已经有所发展或是发生改变。

    pFWZmqI.png

    是 tcp 的什么特殊功能吗?

    9 条回复    2024-03-20 13:35:20 +08:00
    momo24672
        1
    momo24672  
       277 天前
    Delay ACK
    albert990624
        2
    albert990624  
       277 天前
    TCP 的延迟确认机制
    lysShub
        3
    lysShub  
    OP
       277 天前
    @albert990624
    @momo24672 delay ack 为啥会在 ack 包中携带数据啊?或者说携带有数据的包应该把 PSH 标志也设置上
    leonshaw
        4
    leonshaw  
       277 天前 via Android
    TCP 除了第一个 SYN 包以外都有 ACK
    vituralfuture
        6
    vituralfuture  
       277 天前 via Android   ❤️ 3
    图片打不开了,不过这种情况是可以的,它叫做 ACK 捎带,不是 ACK 包捎带了数据,而是数据捎带了 ACK

    TCP 协议是全双工的,允许双方互相收发数据,当接受方有数据需要发送时,它既需要发出 ACK 向发送方确认之前收到的包已经到达,又需要把它想要发送的数据发送给发送方,这时没必要分开进行,只需要数据捎带 ACK 即可,这时发送的包就有两重含义
    1. 接收方想要发送的数据
    2. 接收方对收到的包的确认
    ben666
        7
    ben666  
       277 天前
    ACK 是可以带数据的,只是 socket 编程接口不提供这种特性,如果是自己写的协议栈就可以这样。
    可以理解为丢失了一个纯 ACK:

    SYN ->
    <-SYN+ACK
    [->ACK] 丢失了
    ->ACK + DATA


    开源网络测试仪 dperf https://github.com/baidu/dperf 是自研的 TCP 协议栈,就是在三部握手的 ACK 上带数据的。
    lysShub
        8
    lysShub  
    OP
       277 天前
    @vituralfuture https://img2.imgtp.com/2024/03/20/ekywTkfV.png

    我知道你说的是 PSH|ACK 这种 flag ,但是我这个只有 ACK
    lysShub
        9
    lysShub  
    OP
       277 天前
    是我理解错了,我一直误以为 PSH 标识表示这个 segment 携带有数据。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2739 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 08:08 · PVG 16:08 · LAX 00:08 · JFK 03:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.