gpt4 book ai didi

c - Linux 上的 TCP 发送语义

转载 作者:太空宇宙 更新时间:2023-11-04 07:31:08 26 4
gpt4 key购买 nike

我对 linux 上的 send() 的理解是,如果发送进程的数据可以成功复制到内核缓冲区中,send() 就会返回。然后应用程序可以自由地继续前进。

  1. 如果这是真的,并且说 TCP 无法传送该数据包,TCP 如何报告错误?

  2. 如果在多次 send() 后收到错误(开始时 Rwnd 很大),应用程序如何知道哪个特定的 send() 失败或者换句话说,哪个消息未能到达?

最佳答案

If this is true, and say TCP is unable to deliver that packet, how does TCP report an error?

TCP 将静默重试/重新发送,直到连接结束或异常终止。

如果想知道是否收到,则需要接收应用发送确认(应用级消息)。


编辑:

TCP 协议(protocol)收到一个端到端的 ACK ……但是该 ACK 被 TCP 堆栈吞没了:我认为它不会通过普通的“套接字”API 暴露给应用程序。

数据包嗅探器 Hook 到网络/TCP 堆栈中,使其能够看到 ACK:例如参见 How can I verify that a TCP packet has received an ACK in C#? 的答案。 ...我不知道 Linux 的等效项是什么,但肯定有一个。

备注this answer它警告说,即使远程 TCP 堆栈接收到消息,也不能保证它已被接收应用程序处理(即从堆栈中检索)。

关于c - Linux 上的 TCP 发送语义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13708048/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com