如何使用 ICMP 获取地址掩码

How to fetch address mask with ICMP

RFC 950,第 11 页:

A gateway receiving an address mask request should return it with the address mask field set to the 32-bit mask of the bits identifying the subnet and network, for the subnet on which the request was received.

我想获取主机地址掩码并构建一个 ICMP 地址掩码请求数据包到本地网关和其他 IP。我使用 tcpdump -i eth0 icmp 并发现 ICMP address mask request 数据包已经 sent.But 我还没有找到任何响应。有什么问题吗?主要代码为:

 struct icmp        *picmp;

 /* ICMP header */
 picmp = (icmp_t *)send_buf;
 picmp->icmp_type = ICMP_MASKREQ;    // Address Mask Request
 picmp->icmp_code = 0;
 picmp->icmp_id = pid;
 picmp->icmp_seq = npkt++;

 len = 12; // ICMP header length
 picmp->icmp_cksum = 0;
 picmp->icmp_cksum = in_cksum((u_short *)picmp, len);

 sendto(sock_fd, send_buf, len, 0, pr->p_addr, pr->addr_len);  

地址掩码已过时,因为它的主要功能(主机在网络配置期间找出其本地网络掩码)已包含在动态主机配置协议中(DHCP RFC, Wikipedia). It's probably not implemented on most consumer routers. It has been officially deprecated in RFC 6918

如果要查询路由器的配置信息,以了解拓扑结构,合适的协议是简单网络管理协议 (SNMP RFC, Wikipedia)。这是一个相当复杂的协议,所以如果你想使用它,你应该寻找预先编写的实现(有库和 CLI 接口)。但是,路由器通常需要客户端的授权,因此您无法为此查询随机的 Internet 路由器;我不确定消费者路由器是否完全实现了它,因为对家用路由器进行集中管理并不常见。