2013-06-22

今天去北京Open Party贡献了一个topic,介绍Flash的RTMFP协议,这是Adobe发明的一种P2P协议,2010年才发布的,非常新,也非常复杂。我准备了一个40-50页的PPT,但遗憾的是对这个topic感兴趣的人并不多,只有12个人举手表示想听,这其中有5-6个都是专程来给我捧场的朋友。最终实际去听的只有7-8个,有一个还睡着了,鼾声微作。全程认真听完的也就3-4个,有一个坐我旁边的非常认真,在不断的做笔记。

我当时选这个话题是因为,我上大学是03、04年那会儿在课堂上学的网络知识,而现在又过去了近10年。发生了很多新的变化。Google这样的公司一直在蠢蠢欲动的试图改变internet的基础部件,做一些疯狂的事情。而我们的知识一直停留在10年前,像那些上学时被我们嘲笑的老头子一样。每次在微博上看见有人对Google的GFS、Map-Reduce推崇备至我就想问:“哥!您穿越来吧?”

Flash做了一件很激动人心的事情,花4年的时间,设计一套新的传输层协议,替代TCP,并成功的部署到几十亿台电脑上。假如让你重新设计TCP和internet,你会怎么做?由于RTMFP的设计和产生都比较近代,对于一个在大学里受过良好的计算机科学教育的人来说,它真是很难得的研究对象。

比如,在我blog中之前提到过一个问题:在不安全的信道上传输数据,有两点很重要:加密和完整性校验。那我是先加密后计算校验值呢,还是先计算校验值再加密呢? 我通过反汇编,发现RTMFP把这两种方式都做了。它给了一个非常标准的答案: AES_CBC_ENC(seq + body) + HMAC。 通过在body前加seq,并采用CBC加密,使得相同的原文不会产生相同的密文。先加密后HMAC,从密码学上来说也是最安全的,在这一点上,它比SSH和SSL做的都好。同时,它又给出了一个不这么安全,但是又更容易实现的方案,并在交换密钥时协商具体如何加密。

上面这些,都是你在RFC中看不到,从网上搜不到的。我想拿出来一起分享,讨论。学习网络协议的设计思想。但是遗憾的是,很难找到具有相同技术背景的人。今天现场问了一下,没有一个人具体了解TCP的内部工作原理,slow start 、fast open这些也讨论不起来。比如我想讨论,为什么tcp要用三次握手,再比如我把某些应用层数据放在第一个SYN包就发出去,会有什么问题?把RTMFP和TCP这么对比着看,就会对无论是TCP还是RTMFP都有更深都认识。恐怕大多数人都不关心怎么设计网络协议吧… 也罢。

最近又找到一个消磨时间的好东西。Online judge。过去我学算法,主要靠自己手写测试用例,于是进展很慢。于是现在我就找网站,做ACM题。不依赖于Debugger和程序输出,反复阅读程序,更强调它在逻辑上是正确的。因为我看不到input data,只能看到1-2个sample。在做ACM的过程中,我觉得这几年的工作经验也不是白搭了。学生时代,刚学C/C++的时候,为了追求效率,会把数组换成指针。而现在写,哪怕只有40-50行,也会完全按照面向对象的方式写。我会尽力的用vector.at()方法,而不是raw array。让程序快速以正确的算法实现出来最重要,不要写会暗含陷阱的程序。

此博客中的热门博文

少写代码,多读别人写的代码

在windows下使用llvm+clang

tensorflow distributed runtime初窥