今天上午系统联调时,本地运行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
图三
主机172.16.32.254
图四
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