13

我熟悉BSD套接字,翻阅手册页sendto,我碰到了MSG_CONFIRMflag,这对我来说很神秘。

描述说:

告诉链路层发生了前向进展:你得到了对方的成功回复。如果链路层没有得到这个,它将定期重新探测邻居(例如,通过单播 ARP)。仅对 SOCK_DGRAM 和 SOCK_RAW 套接字有效,目前仅对 IPv4 和 IPv6 实施。

快速查看手册页后arp,我了解到标记某些内容MSG_CONFIRM可以防止 ARP 映射 MAC 地址 ↔ 远程机器的 IP 地址被认为是陈旧的。

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

所以我错过了什么吗?我应该什么时候设置它,或者不设置它?

4

2 回答 2

10

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

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

于 2017-02-08T05:36:15.827 回答
3

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

似乎发送它的情况需要一个非常特殊的情况,您可以保证有关您的消息收件人的事情。周期性 ARP 请求的开销非常低,因此收益非常有限。

于 2013-05-16T18:18:33.200 回答