Networking 错误设置网络掩码会产生什么影响?

Networking 错误设置网络掩码会产生什么影响?,networking,network-programming,Networking,Network Programming,错误设置网络掩码会产生什么影响?我有一个C++应用程序,它设置设备的网络掩码。如果网络掩码设置不正确,tftp似乎无法正常工作。为什么会发生这种情况?当设备/PC的网络掩码设置不正确时,还会出现哪些其他问题 网络掩码确定哪些IP地址是本地的(非路由的);超出该范围的IP地址通过路由器。如果网络掩码错误,程序将尝试直接访问必须通过路由器的站点,反之亦然。网络掩码定义IP地址的哪一部分用作网络地址,哪一部分用于工作站 第一个例子: IP1: 192.168.20.4 IP2: 192.168.192

错误设置网络掩码会产生什么影响?我有一个C++应用程序,它设置设备的网络掩码。如果网络掩码设置不正确,tftp似乎无法正常工作。为什么会发生这种情况?当设备/PC的网络掩码设置不正确时,还会出现哪些其他问题

网络掩码确定哪些IP地址是本地的(非路由的);超出该范围的IP地址通过路由器。如果网络掩码错误,程序将尝试直接访问必须通过路由器的站点,反之亦然。

网络掩码定义IP地址的哪一部分用作网络地址,哪一部分用于工作站

第一个例子:

IP1: 192.168.20.4
IP2: 192.168.192.4
NM:  255.255.0.0
两个IP都在同一个网络中。它们可以相互通信,而不需要路由器。这是因为使用网络掩码时,IP地址将产生相同的位掩码

第二个例子:

IP1: 192.168.20.4
IP2: 192.168.192.4
NM:  255.255.128.0
现在,两个IP都位于不同的网络中,因为当您使用网络掩码或IP地址时,生成的位掩码将不同,如果没有在两个网络之间路由的路由器,它们将无法相互通信


您可以自己测试。

虽然这个问题可能更多地是关于IP网络,而不是编程,但对于许多开发人员来说,这是一个具有挑战性的课题

网络掩码界定主机地址(您的PC或服务器)和网络地址(系统所在的逻辑网络基础结构的一部分)。这两部分用于将数据包传送到正确的设备。网络地址是通过将网络掩码与IP地址进行ANDing来获得的。考虑下面的场景:

IP Address: 10.0.1.1
Netmask: 255.255.0.0
我们电脑的IP地址的主机地址部分是1.1,因此电脑知道从10.0开始的任何主机地址。都是本地的。然后启动10.1等的任何地址都不是“本地”地址,需要转发到路由器。如果您有另一台设备打算位于同一网络上,则:

IP Address: 10.0.2.1
Netmask: 255.255.255.0
这里的网络掩码对于我们的示例设置是错误的,该设备现在将看到网络地址为10.0.2,主机地址为1,如果它尝试与10.0.1.1通信,它将看到网络地址为10.0.1!不是本地的,因此会将其引用到默认路由器进行转发。如果网络掩码设置正确(即与第一个示例相同,假设这是您网络的正确设置),则第二个设备将第一个设备视为本地设备,即在10.0网络上,并且不会尝试将数据包转发到路由器

许多协议都能很好地解决这一问题,但tftp计划在单个网络中运行,因此会失败,因为有人认为目标位于不同的网络上


这可能无法描述您的确切情况,但我希望该示例演示配置很重要的重要原则,您不能有一个配置不准确的环境,并期望它正常工作。

将解释不匹配的网络掩码可能带来的影响。简言之:

  • 主机可能会错误地构造路由表
  • 主机将丢失一些广播数据包,无法正确发送广播
  • TFTP的错误功能几乎可以肯定是由第一个原因造成的。它以同样的方式影响任何其他IP协议


    其他答案只提到第一个问题(这是可以的,因为第二个问题相当边缘化)。请注意,决定IP数据包路由方式的不是接口本身的网络掩码,而是主机的路由子系统;但网络掩码通常用于构建路由表。

    无论谁被否决,请留下评论供否决。我想纠正/解释导致否决票的原因。谢谢。@zooropa:不幸的是,在这附近有“开车经过投票站”是一种常见的做法……我保证我不会开枪/报复。如果你把downpoite评论作为下面的答案,我甚至会投上一票!我认为投反对票的评论和其他评论和答案一样重要。也可以从他们身上学到东西!我在meta.stackoverflow.com上看到了一个关于downvote评论的问题。杰夫·阿特伍德对此发表了评论。也许否决票是因为这不是一个真正的编程问题,因此可能被认为是这个网站的主题之外。(我认为它足够接近,但不是我)!没有投票,但是我删除了C/C++标签,因为这个问题不是针对这些语言的。另外,请注意,在过去7年的某个时候删除了否决票(这可能只是意味着删除了用户帐户)。我怀疑是因为C和C++标签很少属于同一个,所以这个站点的社区喜欢不断提醒人们他们是完全不同的语言(有点)。