NAT

先罗列下我的需求,有两台机器,一台windows 7,另一台mac,现在想在这两个机器间自动同步文件。两台机器位于不同的私有子网段,也就是说,躲在两个不同的路由器后面接入公网。

因为nat的存在,使得两台机器间直接建立tcp连接成为不可能,想了几个方案:

第一,通过一台有公网ip的机器中转,两台机器同时跟这台服务器建立tcp连接,定时交换文件时间戳并相应的更新。这种方案存在巨大的弊端,我的服务器在美国,两台挨在一起的机器,传送数据居然需要绕过层层路由跨过海底光缆传送到大洋彼端然后再传回来,速度慢,占带宽,太折腾。

第二种就是udp打洞了,假设两台机器分别为A和B,中转机器为S,这样A和B都可以向S发送UDP数据包了,S可以得到NAT转换后的ip和端口号,由于UDP不是面向连接的,任何主机都可以向这个ip和端口号发送数据。理论上讲,只要S把这些信息告诉A和B,这两台机器就可以直接通信了。但是因为安全性的考虑,如果这个数据包的ip和端口号不是先前发给S的那个地址,就会被路由器丢弃。如何取得路由器的信任,是打洞最需要解决的问题。一个简单的想法是,A向B的NAT转换后的地址发送一个udp包,这样A的NAT对于B的这个地址就是敞开的了,如果B能发出具有这样地址的包,二者之间的连接就能建立起来。

今天花了一个下午编写调试相应的代码,A和B之间的数据包始终不能成功接收,后来才意识到,A向B再次发送数据包的时候,NAT路由器会重新生成不同的端口号,换了个端口向S发包测试打印地址印证了这个想法,这个端口号似乎是随机生成的。

google了下,有些路由器确实是这样实现的,这种情况下UDP打洞基本不可行。

总之,问题没那么圆满的解决,最终还是使用方案一中转,先只同步小文件吧,至少比手动拷方便些。

客观评价下NAT对互联网的影响吧,好的方面:解决了ip地址快速耗尽的问题,估计延缓了一二十年。也提高了安全性,某种程度把病毒隔离在一个个子网范围内。

另一方面,把端口号扩展为ip地址的一部分,本身就是一种很踅脚的做法,增加了软件的复杂度。一个好的设计应该简单统一,不应该让人在实现的时候感到头疼。

在已有系统上缝缝补补,用最简单的改变来适应环境,是生物的进化的基本特征。互联网在遇到问题时的解决方案似乎也在重复着大自然的脚步。

还是希望ipv6早日普及吧。

汽车

最近想买辆车,相关的东西大致都看或者了解了下,以前对机械相关的专业了解的不多,甚至有些偏见。机械是个成熟复杂的领域,积累了很多研究理论,大量的极具巧思的器件。单单是对这些相关的器件的理解,足以对大脑的思考模式产生重大影响。

举一个简单的例子,汽车在行进当中进行转弯的话,内侧和外侧的轮子的速度是不同的,这时候发动机的输出就要对不同的轮子进行适当调整,如何动态的做到?方法有很多种,最简单的方法,只用一个轮子作为驱动轮,这样其他轮子就只在地上滚动了,早期汽车用的就是这种方法,这种方法其实是在逃避问题,一个轮子驱动有很多弊端。现在的汽车都使用一种叫做差速器的简单装置,可以巧妙的处理这个问题,具体细节用文字解释起来比较麻烦,感兴趣的话可以到youtube上看相关的视频解说。

现代的发动机是个复杂的装置,通过厂商鼓吹的一些技术特点,比如涡轮增压,可变气门正时,缸内直喷等,我们就可以猜测它里面的复杂性了,要通过经年累月的技术积累,不断的调整演化,才能成为一项成熟的产品技术,这也是国产发动机跟国外有很大的技术差距的原因。

我们创造的任何事物和技术都处在不断的长期演变进化当中,其中有一些已经趋于稳定,比如剪刀,钳子,它们拥有简单的结构,材料结构的调整已基本最优,更多的变化空间已不大,但是我们仍然有各种针对特殊需求的剪刀设计出来,他们并没有停滞,只是稳定下来了而已。另一些还处于剧烈的变革当中,比如电视机,手机,一方面由于它们本身的复杂度导致更多的可能,另一方面因为它们还不是很完备,需要不断的技术改进,电视机经历了黑白,彩色,阴极射线管,液晶等一代又一代的技术演进,现在仍然不能说成熟稳定,还有很多调整空间。手机同样也经过的很多代,他们都仍处于演化当中。

汽车的发动机也是在不断的进化,一个很好的类比是人类的心脏,经过了亿万年的进化,现在的人类心脏是个复杂而且高效的器官,它在历史当中必定有过不同的形式,通过自然选择的不断调整,最终趋于稳定。作为一种用金属构造的充满各种孔洞机构的燃烧装置,发动机经历了若干代的调整变革,不断的提升燃油利用效率,提高输出功率,跟大自然的进化类似.

如果我们仔细的考察一些就会发现,生物的进化跟技术的演进是何等的相似!生物通过调整改变以适应自然环境,我们创造改进技术来迎合市场需求。抽去形式概念,二者本质没有差别。

在各项技术产品中,汽车是跟生物最为类似且我认为最有进化潜力的一项东西。因为它可以在地球表面移动,这正是动物最重要的特性。

如果远古的地表拥有我们现在道路的形式,我想会有生物进化出轮子的结构,这样的行进方式最节省能量。但是崎岖不平的地表,导致腿成为现今动物界的主导。

我们认为动物之所以为动物,最主要的特征就是动物可以自由的行走移动,避开障碍,而不是具有高级思维能力。

汽车必须靠人来驾驶,但是为了便利,我们逐渐开发除了各种技术减轻人的疲劳。手动档变成自动档,简化了操作流程,定速巡航可以把脚从油门移开,自动泊车系统可以以检测周围空间把车自动倒进狭小的空间里,自适应巡航甚至可以根据前面车的距离自动调整车速跟车。这些辅助性的装置似乎都朝着一个目标,那就是自动驾驶。

想象一下,一辆汽车可以在无人的状态下自动前进,检测避开障碍,自动去加油。我们可以通过无线网络远程把车召唤到眼前,这不是不可企及的想象,未来几年极有可能实现。比如google对自动驾驶投入了很多资金进行研发,并且它的自动驾驶汽车已经安全无事故的行驶了几十万公里。

我们尝试去构造机器人,只是作为兴趣和研究,并没有强大的市场需求。同样也不会为了百分之几的性能优势去花大量时间精力去改进它的某一个部件,但是对于成熟且庞大的汽车市场就是很不同的景象了。就像语音识别随着智能手机的兴盛突然变得炙手可热起来一样,人们愿意为此去投入大量财力精力去研发。

当汽车的自动驾驶成为可能,我们就会考虑如何添加更多的自主性进去了。模式识别(比如现在一些高档车配备的交通路牌识别技术),语音识别,更高级的智能等,都会随之而来。

我可以大胆的预测,将来机器人和人工智能等技术,一定是因为汽车而发展起来,汽车本来就是一个很好的机器人。

为什么是汽车而不是手机或者电视机呢?在我们可以预见的未来,以及事物发展的趋势,我们可以清晰的看到他们各自朝前发展的脉络,以及人们对这些事物功能的期望。电视机被赋予了更轻薄便利色彩真实的期许,手机也是操作反应的功能性需求,而汽车,人类更希望下放更多的权利和自主性过去,通过自动化为生活提供便利。可以说,汽车已经被选定了一条自动化的道路,一条导致智能化自动机器的前进途径。

动物和汽车,器官和部件,形成绝佳的对应类比:心脏和发动机,轮子和脚,关节和离合器差速器,食物和燃油……零件的不断调整改进就是进化。也许有一天,就像变形金刚里,我们会引入汽车人这个称谓。