记一下最近遇到的网络时断时连问题 | 迟思堂工作室
A-A+

记一下最近遇到的网络时断时连问题

2015-11-14 15:23 GNU/Linux系统, 网络方面 暂无评论 阅读 1,320 次

前段时间搞完openwrt,就接着上级安排的任务:搞新CPU。但对于android我实在是新手,各种目录各种库,简单地拆分内核、文件系统,跑个helloworld程序,都搞了好久。刚刚看了几天,领导拿了一台X86的工控机给我,安排我测试其性能,要和之前搞的x86的设备对比。幕后安排事务是另外一个领导,我们老大也没发电子邮件,只是口头说。本来想具体写这个小小题外话,但想想还是算了。对于小兵来说,谁安排不是安排。
我刚刚在脑中演练了一下要进行的测试的计划,并于每天早会汇报时,老大说,某大部门有个网络问题要排查,今天下班前给结论:什么原因,能不能解决,评估什么时候可完成。于是临时中断测试计划转而投入到网络问题排查中。然,经过短短一天的排查,完全没有头绪,这个设备与其它设备在网络模块上有些不同,因此我说软件上很难解决——但我不是不去想办法解决。由于涉及较多部门,信息严重不对称,我建议助理请某大部门主导开个小会梳理梳理。但该大部门说下周才有空。于是又暂停了网络问题而继续工控机性能测试事务。该事务按我制定的计划和时间顺利完成。虽然某大部门一直没动静,但我不能干等不干事。于是又继续搞网络问题。截至现在,虽然没有真正知道解决方案,但总算有了一些眉目。
今年我基本离不开网络问题。年初遇到设备接千兆交换机再过光纤转换器到机房出现视频数据传输不实时;年中不时遇到前人维护的内核的千兆百兆自动切来切去问题;前不久又遇到某设备连千兆网络时连时断问题(领导叫我排查,但过了一天,又叫我暂停)。现在又遇到某设备直接另一设备网络时连时断问题(领导叫我排查,但过了一天,又叫我暂停)。
以上就是事件的复杂的来源及个人牢骚。下面正式进入主题。

背景

某设备MX,与某工控机“唉踢斯”网络直连,“唉踢斯”上保存的视频数据断断续续。经简单测试,在设备MX和“唉踢斯”之间用iperf工具测试网络带宽,60秒中有30秒是断开的。问题简化为网络传输而非业务程序。另外,如果两者经过一个交换机,则一切正常。当设备不使能自动协商时,对端的“唉踢斯”由于自动协商,得到半双工,这种情况下连接正常。而使用某设备JX与该工控机直连,也是正常的,视频完整。设备MX与设备JX在主板硬件上几乎一样,包括CPU和外设,因而共用一套底层内核驱动。但设备MX由于其些特性,网络用尾线引出来,速率只有百兆。(公司主张硬件问题软件解决,我不能直接说硬件不同,没法解决)

自动翻转

想到网线的直连、交叉,纯粹偶然,是在周末的一个下午。因而正好利用周末时间了解了一下这方面的知识。一般来说,现代的网络芯片都支持了自动翻转功能(Auto-Crossover)。现在的交换机或PC都支持了,所以现在很少有人注意网线的线序,直接插上就能正常通信了。在PHY寄存器中有设置,在0x10寄存器的5、6比特,硬件复位默认值为11,表示自动翻转。在0x11寄存器的第6比特有自动翻转的状态值。为1表示MDIX,为0表示MDI。写此文时,懒得翻IEEE标准了,我查了Atheros AR系列网络芯片以及Intel的几款经典网络芯片手册,都是如此的,有一定代表性。但是,不是所有的网络芯片都支持自动翻转,比如DM9000就不支持。一般在Datasheet开头的芯片特性那里会有说明,比如支持自动翻转会写:Automatic MDI/MDIX crossover。网上有资料说只有在自动协商使能(AN)情况下自动翻转功能才有效。但我看手册没发现里面强调一定要自动协商。我猜测应该是芯片厂商定义不同而不同。
在两台均支持自动翻转的的设备用直连线连接,一台显示为MDIX,一台显示为MDI。ethtool工具可以看当前的网络接口是否翻转。查看ethtool代码,发现只有在双绞线情况下才会打印此内容,也就是port的值为PORT_TP。而很多设备是MII接口的。但是,即使硬改为TP也需要驱动层的支持,否则显示Unknown。如下面是在一台X86的linux中打印的信息,MDI-X一项为on。

Settings for eth1:
        Supported ports: [ TP ]
        Supported link modes:   10baseT/Half 10baseT/Full 
                                100baseT/Half 100baseT/Full 
                                1000baseT/Full 
        Supported pause frame use: Symmetric
        Supports auto-negotiation: Yes
        Advertised link modes:  10baseT/Half 10baseT/Full 
                                100baseT/Half 100baseT/Full 
                                1000baseT/Full 
        Advertised pause frame use: Symmetric
        Advertised auto-negotiation: Yes
        Speed: 1000Mb/s
        Duplex: Full
        Port: Twisted Pair
        PHYAD: 1
        Transceiver: internal
        Auto-negotiation: on
        MDI-X: on (auto)
Cannot get wake-on-lan settings: Operation not permitted
        Current message level: 0x00000007 (7)
                               drv probe link
        Link detected: yes

回到问题上,两种设备用的网络芯片都支持自动翻转,所以问题不在这,这个方向走不通。不过从中获取到不少的知识。关于MDI和MDIX,可以参考这个文章:

网线工艺

又是一个周五,无头绪之际,打硬件同事座机聊这个问题,再次回到网线接口上,因为该设备网线变压器到RJ45上只有4根线连接(正常网线是8根)。之前就谈过,但没注意到这个细节,因为不是网工出身,没有这方面的敏感度。结果证实,还真是与这个小小细节有关。
当天我做了一根特制的网线,保留1、2、3、6线,剪掉其它的。用于上文提到的直连正常的设备上,结果发现,本来正常的设备竟然出现了时连时断的现象,也就是说,使用8芯网线正常的设备,使用4芯网线不正常了。再次利用周末的时间学习了网线制作的工艺。实际上,网线数据传输本身使用4根线的,即1、2、3、6,其它是保留给电话用的。关于到底连4芯还是8芯,论坛上有很多争论。我不掺和,我是个老实人,人家说网线是8芯的,我就是老老实实地接8根线。
使用这个特制的网线,连接2台同是千兆网卡的设备上,自动协商使用约半分钟,让我一度以为无法通信。而使用它连接交换机和设备,很快网口灯就亮了。
回到问题上,使用正常网线,如果关闭自动协商的话,另一端设备只能得到半双工,这种情况下,视频连接是正常的。而两边设备都设置为百兆全双工,也是正常的。我又不得不往自动协商方向怀疑了。

李迟 2015年11月14日 周六



如果本文对阁下有帮助,不妨赞助笔者以输出更多好文章,谢谢!
donate




给我留言