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

2024-03-19 19:30:21 +08:00
 lysShub

是 tcp 的什么特殊功能吗?

2216 次点击
所在节点    程序员
9 条回复
momo24672
2024-03-19 19:36:08 +08:00
Delay ACK
albert990624
2024-03-19 21:29:51 +08:00
TCP 的延迟确认机制
lysShub
2024-03-19 21:57:04 +08:00
@albert990624
@momo24672 delay ack 为啥会在 ack 包中携带数据啊?或者说携带有数据的包应该把 PSH 标志也设置上
leonshaw
2024-03-19 22:29:33 +08:00
TCP 除了第一个 SYN 包以外都有 ACK
feedcode
2024-03-19 22:31:33 +08:00
vituralfuture
2024-03-19 22:31:58 +08:00
图片打不开了,不过这种情况是可以的,它叫做 ACK 捎带,不是 ACK 包捎带了数据,而是数据捎带了 ACK

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

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


开源网络测试仪 dperf https://github.com/baidu/dperf 是自研的 TCP 协议栈,就是在三部握手的 ACK 上带数据的。
lysShub
2024-03-20 11:13:29 +08:00
@vituralfuture https://img2.imgtp.com/2024/03/20/ekywTkfV.png

我知道你说的是 PSH|ACK 这种 flag ,但是我这个只有 ACK
lysShub
2024-03-20 13:35:20 +08:00
是我理解错了,我一直误以为 PSH 标识表示这个 segment 携带有数据。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1025171

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX