c - Linux 上的 TCP 发送语义

标签 c linux tcp

我对 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/

相关文章:

linux - Net-SNMP 在系统日志中显示错误版本?

linux - 如何从命令行发出 dbus 信号

tcp - 当 tcp/ip 已经有校验和时,应用程序协议(protocol)中还需要校验和吗?

tcp - 远程服务器推送通知到 arduino(以太网)

c++ - Winsock 端口监听器

linux - 更改配置后 statsinfo 扩展未激活

c - 如何获取va_arg的地址?

c - 是否有任何加扰单词的算法?

c - 在 C 中使用 getopt 作为命令行参数

使用 boolean 值的条件表达式产生意外结果