zoukankan      html  css  js  c++  java
  • 错误设置子网掩码的结果

    今天上午系统联调时,本地运行Server,Client运行于其它电脑,打开Server后Client总是连接失败。netstat -ano | findstr 4444发现没问题,Server正在4444端口处于Listen状态。

    反过来,本地运行Client,Server运行于其它电脑,Client连接Server仍旧失败。

    打开网络设置,发现本地IP为172.16.29.114,子网掩码为255.255.255.0;对端IP为172.16.32.254,子网掩码为255.255.0.0。难道问题出在这里?抱着试试看的想法将本地子网掩码改为255.255.0.0,再连,果然成功。

    图一

    图一中网络设置一直都会,但各项参数具体意义是什么不甚了解。

    问题总结如下:

      1.子网掩码设置错误产生的影响

      2.网络设置中各项参数在数据传输中扮演的角色

    经人点拨加WireShark抓包,得出如下结论:

    本地主机IP172.16.29.114,子网掩码255.255.255.0,此刻要向主机172.16.32.254发送数据。本地主机会将DstIP(目标IP)与local subnet mask(本地子网掩码)作与操作,得到network number(网络号)+subnet number(子网号),然后主机将local IP与local subnet mask做与操作获取本地主机所处的network number+subnet number,两相比较:

      如果相同则本地主机认为自己与目标主机处于同一子网, 此时本地主机将含有local IP+local Mac+DstIP的ARP数据报在当前子网进行广播,子网中的所有主机均会收到此ARP数据报并查看DSTIP是否就是自己,若否则丢弃,若是则将src IP+src Mac存入ARP缓存表然后将local Mac发送给源主机。

    图二

    源主机获取到Dst Mac后进行数据传输。

      如果不同则本地主机认为自己与目标主机处于不同子网,此时本地主机将数据直接发向图一中网关指定的地址(可能是路由器),由网关进行分组转发。

    现在回到原来的问题

    1. IP172.16.29.114、子网掩码255.255.255.0,连接IP172.16.32.254、子网掩码255.255.0.0,本地主机将172.16.29.114和255.255.255.0相与得自身network number + subnet number = 172.16.29,再172.16.32.254与255.255.255.0相与得对方network number + subnet number = 172.16.32,不相等,自此本地主机获知对方处于非本地子网中,故将连接请求包发往网关172.16.29.1。网关做如下操作:

        <1>. 从收到的数据报的首部提取目的IP地址 D 。

        <2>. 先判断是否为直接交付。对路由器直接相连的网络逐个进行检查:用各网络的子网掩码和 D逐位相“与”(AND操作),看结果是否和相应的网络地址匹配。若匹配,则把分组进行直接交付(当然还要把 D 转换成物理地址,把数据报封装成帧再发送出去),转发任务结束。否则就是间接交付,执行<3>。

        <3>. 若路由表中有目的地址为 D 的特定主机路由,则把数据报传送给路由表中所指明的下一跳路由器;否则,执行<4>。

        <4>. 对路由表中的每一行(目的网络地址、子网掩码、下一跳地址),用其中的子网掩码和 D 逐位相“与”(AND操作),其结果为 N 。若 N 与该行的目的网络地址匹配,则数据报传送给指明的下一跳路由器;否则,执行<5>。

        <5>. 若路由表中有一个默认路由,则把数据报传送给路由表中所指明的默认路由器;否则,执行<6>。

        <6>. 报告转发分组出错。

    连接请求包成功到达172.16.32.254,一番处理后172.16.32.254给予接收连接应答包,过程同上,将172.16.32.254与255.255.0.0相与得自身network number + subnet number = 172.16,再172.16.29.114与255.255.0.0相与得对方network number + subnet number = 172.16,相等,主机172.16.32.254误认为对方与自己处于同一子网,故广发ARP请求包获取对方Mac。172.16.32子网中所有的机器都会收到该请求包,发现请求IP非自身IP时都会将其丢弃,最终254的ARP请求收不到任何应答,254无法获取对方Mac地址,过程在此中断。172.16.29.114长时间得不到应答,连接失败。

    用Ping代替连接请求包,结果如下

    主机172.16.32.254发送ICMP,ICMP无应答

    图三

     

    主机172.16.32.254收到ICMP后ARP,ARP无应答

    图四

     

    2. IP172.16.29.114、子网掩码255.255.0.0,连接IP172.16.32.254、子网掩码255.255.255.0,本地主机将172.16.29.114和255.255.0.0相与得自身network number + subnet number = 172.16,再172.16.32.254与255.255.0.0相与得对方network number + subnet number = 172.16,想的,本地主机误认为对方与自己处于同一子网,故广发ARP请求包获取对方Mac。172.16.29子网中所有的机器都会收到该请求包,发现请求IP非自身IP时都会将其丢弃,最终本地主机的ARP请求收不到任何应答,因而无法获取对方Mac地址,过程在此中断。而对方自始至终未收到本地主机发送的任何连接请求包。

    用Ping代替连接请求包,结果如下

    图五

    主机172.16.29.114

  • 相关阅读:
    约瑟夫问题的解法集锦
    java调用com组件将office文件转换成pdf
    hdu(1069)——Monkey and Banana(LIS变形)
    Unix网络编程之环境搭建
    atitit. java queue 队列体系and自己定义基于数据库的队列总结o7t
    怎样使Dialog像Activity一样随心所欲的使用?
    获取全部分组中某列最大的行
    Class C++
    spring mvc +Mybatis3.1 整合的时候异常
    Linux 编译C++ 与 设置 Vim
  • 原文地址:https://www.cnblogs.com/chaikefusibushiji/p/4284743.html
Copyright © 2011-2022 走看看