为什么你家的路由器需要定期重启?今天仔细说说
2022-9-23
最近某项目采用以太网通信,实践起来有些奇怪,好像设计成只能应答某类计算机的ICMP(ping)命令, 某类计算机指的是Windows特定系统,其他系统发送ping都不能正确识别。
白蔡:“吴哥,江湖救急!甲方爸爸的电路板寄过来好几天了,我一直搞不定它的以太网。”
甲方爸爸干系统集成的,要把我们两家产品打包售卖,甲方设计FPGA,我方设计嵌入式Linux,两块电路板采用以太网直连 方式通信。桌面上摆放的是双方的成熟产品,一根网线连接,简单到不能再简单了。
白蔡:“他们的产品很奇葩,FPGA的IP固定为192.168.1.6,我方的IP必须是192.168.1.7,以太网也必须千兆不协商。”
吴解两手撑着脸坐在白蔡工位:“有什么奇怪的,已发表论文都是怎么干的,FPGA–以太网–处理器,班内通信才这么搞定。没有省去路由协议,FPGA没必要设计复杂的协议栈应答模式,IP什么的仅为了填充协议栈,写死就写死,” 上挑眉毛,“说说你遇到的具体问题。”
白蔡:“奇怪的是我做如下三组实验,嵌入式Linux和FPGA好像没有应答, 当然,实验前桌面电脑和嵌入式Linux都已经设置成千兆不协商
三组对照实验如下:
吴解:“3个步骤,你再演示一遍给我看。”怀疑白蔡没有正确描述现象。
白蔡在桌面电脑设置固定千兆速率:本地连接->属性->配置->高级->速度和双工->1.0 Gbps全双工。嵌入式也用ethtool设置固定千兆速率,重复3个步骤与所述一致。
吴解扛来示波器,验证嵌入式Linux和FPGA通信速率是不是都真的工作在千兆模式。ethtool也不是所有网卡驱动都支持,虽然/sys/class/net/eth0/speed显示着1000,有可能显示和实际不一致。
FPGA的板子毕竟不是自己画的,不太好找。
示波器测试MAC和PHY之间的通信速率,如果是125MHz表明工作在千兆模式,结果显示均为125MHz。
白蔡:“会不会是网线的问题呢?嵌入式Linux莫非不能同时兼容交叉线、直通线?嵌入式Linux和桌面电脑连接后,桌面电脑完成收发自动翻转,于是通信成功。”
吴解:“不能自动翻转线序的网卡我只在2010年前见过一次,负责线序翻转是网卡PHY的附加功能,目前市面上的PHY都具备。”
两人去库房借来另一块同型号的嵌入式Linux板卡,确认两块嵌入式Linux板卡所用的PHY是同型号的,毕竟近些年芯片之间的Pin to Pin替换解决方案挺多。并准备两根交叉线和直连线。
如果两块嵌入式Linux板卡接入任何一根网线都能ping通,则表明板载PHY支持自动翻转线序。实验证明与网线无关。
吴解:“是挺邪门,光猜是猜不出来的,试试tcpdump能呈现些什么东西。”
打开tcpdump后更邪门的事情发生了,FPGA居然有回应ICMP包!不会是FPGA设计的协议栈阉割得太多了吧。
疑点1、两网卡连接后首先交互的是ARP协议,在没有完成ARP协议前不可能发送ICMP协议,既然嵌入式Linux能发送ICMP表明ARP协议已经交互完成;
疑点2、嵌入式Linux ping FPGA和桌面电脑的效果不一样,首先注意到ID值,正常情况下ID值应该与发送的一致;
吴解以前移植过ICMP协议,映像里ICMP协议实现起来很简单,ID用于表征对端回应的ICMP reply是哪一个,毕竟两机器之间间隔若干路由器,每个数据包可能选择两条不通的链路返回,后发送的ICMP reply可能比先发送的先被终端收到。
busybox源码的把ID号作为判断依据。
不过奇怪的是,为什么桌面电脑ping却能正常响应呢?
吴解用tcpdump把抓包的内容保存成通用格式pcap,在自己的电脑上用wireshark打开。文件保存了两份,一份是桌面电脑与FPGA的数据,一份是嵌入式Linux与FPGA的数据。
FPGA返回给桌面电脑的ICMP replay数据里ID项是跟着request变化的,不是固定的1。
猛然间发现,request和reply的长度是不一样的,分别是98字节和74字节,点开数据区域观察到数据填充内容完全不同。FPGA返回的数据区域是“abcd”开头。
看着数据区的内容吴解预感找到现象原因了,随即用自己的桌面Linux系统ping FPGA板卡也没通。 跑到白蔡的工位:“你有没有桌面电脑Ubuntu系统上测试过ping FPGA板卡?”
白蔡:“没有,现在没兴趣,emo了。”
白蔡有两台桌面电脑,一台Windows一台Ubuntu,演示时仅演示Windows系统,下意识的认为白蔡之前也在Ubuntu上测试过。
吴解:“问题找到了,甲方提供的FPGA板卡ICMP reply模仿Windows格式,Windows的request就是以abcd开头的。我猜测你如果用windows设置ping包大小,FPGA同样不会正确返回。”
白蔡来了精神,抓取Windows上的ICMP request数据,果真是“abcd”开头:“也就是说后续可以正常开发应用层协议,不必管ping吗?”
吴解:“是的。”
后来白蔡找甲方爸爸确认,他们的确是模仿Windows的reply包做的。
顺便提一下,Win7和Win10发送的ICMP数据区域也是不同的,Linux下可以用 -p 参数修改数据区域内容。
以太网供电电源3大模式原来差别这么大,你必须知道!
酷玩实验室作品
首发于微信号 酷玩实验室
微信ID:coollabs
终究没能在区块链上找到摆脱贫困的出路。
打金
四成来自菲律宾
十四个月的Web3.0奇幻漂流
有一些甚至被坑得倾家荡产
简单过一下1.0和2.0。
构成互联网的基础技术。
往往越是废话的东西就越基础越关键。
让网页上新出现的内容不用刷新就可以显示
也就是可读可写互联网
现在我们几乎是一睁开眼睛就上网一直上到闭眼睡觉,这种模式完全重构了我们的社会,是我们大部分人有生以来经历过的最大的技术革命。
可读可写可拥有!
去中心化自治组织。
当然啦,这一切都纯属放屁。
问题是它根本就不成立。
问题就在于,他们没有理解区块链这个技术的作用范围,没有理解像比特币这样成功的区块链项目和那些空气项目的本质不同。
你想超发也超发不了。
但是有一个条件,就是它必须是可交易的。
它的收藏价值就是一种可交易的共识啊。
所谓Web3.0项目用来发币的那个由头,它根本就不是一个可交易的东西
类似这样的东西肯定是不行的。
而随着游戏一版一版的推出DLC,道具的强度必然会膨胀,光凭它的收藏价值发一个NFT,根本就不值这个钱。
而所谓的去中心化自组织DAO,就更是扯淡中的扯淡了。
这个东西的价值怎么反应到你发的币上呢?
不知道我说明白了没有,简而言之就是,目前这些Web3.0项目发币,就是在扯淡。
除此之外,一定要擦亮你的眼睛。
很遗憾,改变不了。
只要我们能把其中5%利用起来,就会为人类提供相当于现在几百倍的廉价能源。
那就得靠元宇宙。
2021年比特币挖矿用掉的电力超过泰国的电力消耗,
那大家也能看出来,这不又变回中心化了吗?
这就是所谓的区块链不可能三角,
但是当我们要做出类似投资、跳槽之类的人生重大决定的时候,必须要真的理解一项科技才可以,不然的话还是要保守一些,宁可错过不要犯错,真的太容易嗝儿屁了。
酷玩实验室整理编辑
首发于微信公众号:酷玩实验室(ID:coollabs)
如需转载,请后台留言。
分享给朋友或朋友圈请随意