我为什么要使用或不使用MSG_CONFIRM?

我熟悉BSD套接字,然后翻阅sendto的手册页,我碰到了MSG_CONFIRM标志,这对我来说是非常神秘的。

描述说:

告诉链接层转发进度:您从另一方获得了成功的回复。 如果链路层没有得到它,它将定期重新修复邻居(例如,通过单播ARP)。 仅在SOCK_DGRAM和SOCK_RAW套接字上有效,并且当前仅针对IPv4和IPv6实现。

在快速查看arp的手册页之后,我明白标记某些内容MSG_CONFIRM阻止ARP映射MAC地址↔远程计算机的IP地址被认为是陈旧的。

现在我感到困惑,因为我看不出任何我不应该提出的理由,因此,他们为什么不直接在图书馆强制执行。 为什么应用层应该处理在链路层发生的任何事情。

所以我错过了什么? 我什么时候应该设置它,还是不设置它?

如果您发送的数据报是对刚刚从同一对等方收到的数据报的直接响应,则只应设置该标志。

如果您要发送初始请求,或者发送数据报以响应某些其他事件(如用户输入或超时),则不应设置MSG_CONFIRM标志。

不发送它的原因是IP的mac地址随时间变化。 如果您经常告诉系统不要检查,即使IP地址不存在,它也会继续发送到同一MAC。

发送它似乎需要一个非常特殊的情况,你可以保证你的消息收件人的事情。 定期ARP请求的开销非常低,因此其优势非常有限。