May 1, 2010 - 言论自由和程序正义

Comments

(写这篇文章的初衷是因为路金波先说“杀孩子的杀了喂狗”,然后连岳评论说这是主张“放弃程序正义”。我觉得这个评价太扯淡了,所以展开来说几句。我在这里说的,都是一些基本的常识,而不是什么深奥的东西。以下所有的都是基于美国宪法)

言论自由(Freedom of speech) 这个概念是美国宪法第一修正案界定的,以前我写过很多次文章介绍了。宪法第一修正案的第一句话是“国会不得立法以:确立国教或禁止信教自由;剥夺言论自由或出版自由;或剥夺人民和平集会和向政府请愿伸冤的权利。” 我们常常说的言论自由,就是来自于此。

正当法律程序(Due process) 这个词,则是美国宪法第五,第十四修正案界定的。其中第五修正案是限制联邦政府权利的,原文如下:“非经大陪审团提起公诉,人民不应受判处死罪或会因重罪而被剥夺部分公权之审判;惟于战争或社会动乱时期中,正在服役的陆海军或民兵中发生的案件,不在此例;人民不得为同一罪行而两次被置于危及生命或肢体之处境;不得被强迫在任何刑事案件中自证其罪,不得不经过适当法律程序而被剥夺生命、自由或财产;人民私有产业,如无合理赔偿,不得被征为公用。”其中,第四款中的“适当法律程序”,就是 Due Process of law 的中文翻译。南北战争之后,国会深感如果不用同样的条文限制州,州也会违反“正当法律程序”,因此,宪法添加了第十四修正案。这个历史和判例,我以前曾经专门写过。如果我们看到第五,第十四修正案,就会很明白,一般法里面所谓的 Due Process, 仅是对联邦和州政府的执法者,如联邦和州的法官,检察官,警察等人群提出的要求。 正当法律程序的一个重要的实现手段,就是程序正义(Procedural due process)。

这可以看成是一个弱化的对正义结果的追求:因为程序正义是最可能达成事实正义的方法,而事实正义本身如何界定争议太大,我们至少先要保障程序正义。不管怎样,Due Process 以及程序正义作为法律上的术语,提的要求是仅限于对政府,而不针对公民的。这一点也很好理解,公民本身没有执法权(如果公民非要说有而执行私刑 Lynching,自然有其他法律定罪,因为这时候已经侵害了他人的基本人权。),所以不能用程序正义来要求公民。这个基本的概念如果不清楚,所有的后面关于程序正义的讨论就没有意义。

程序正义的法理学基础,来自政府应该相信,每个公民都是应该受到尊重的。 当然,这并不蕴含着每一个公民都要相信其他的公民应该受到尊重,正是因为这里面有巨大的鸿沟,所以常常成为辩论的引爆点。比如一个人冲击幼儿园,杀死了12个没有任何防卫能力的小朋友,自然地,出于人性,其他公民就不可能对其表示尊重,甚至有复仇和主持正义的心态,说出如“凌迟一百次”这样的话来。 那么,现在的问题就是,说出凌迟100次这样话的这个公民,是不是影响,或者在反对程序正义。

这里面其实有三个层面的考量。 第一,愤怒驱使下的言论受不受言论自由保护? 第二,公民的言论会不会影响程序正义? 第三,为了程序正义,是不是我们要放弃一部分言论自由。

我们先看第一个。 以前看过我写的第一修正案和相关判例的人都知道,在美国愤怒到烧国旗都是受宪法保护的。 一个言论受不受保护,不是看言论内容是不是合乎大众品味,而是看这个言论能不能导致明显而立即的危险。 如果某种言论能够立即导致危险,那么为了防备这种危险,我们要限制这个言论。 所幸的是,美国最高法院常常发现,所谓的危险常常不存在,所以判决了无数偏向于保护言论自由的判例。 以说出凌迟 100 次这个言论为例。如果这个人不是陪审团的,也不是法官,那这个言论是根本无法造成任何危险的,因为犯罪嫌疑人被严密的看管着,况且你我大家都知道,路金波和看到这句话的人都清楚,他们是不会拿把小刀去凌迟的。因此,这种言论,尽管看上去不理智,不那么深刻,但它的确的确是应该受到言论自由保护的。 这一点,相信大家异议较少,因为路金波也的确表达了,也的确没有人去限制他表达。

关键是第二点。上面我们说了,美国宪法的在程序正义,是用来要求联邦和州,在司法案件中对待公民(其实也包括企业)上的一般原则。 那么,假使一个人,反复的渲染和帮助法律审判中的一方,会不会破坏程序正义呢? 事实上不会。 原因有两个。第一,程序正义强调的是程序,而不是正义本身。程序包括采集证据,法庭辩论等等,是有成文的规定的。在法制健全的国家,是任何言论也没法改变的。最著名的例子就是辛普森杀妻案件了。 媒体和大部分美国人都倾向于他杀了人,可是程序正义依然毫无影响。如果司法机构被影响了,那么只能证明该司法机构不合格。公民和媒体没有任何责任(事实上也不可能)去呵护司法机构维护程序正义,因为这本身就不是公民和媒体的义务。

第三点更加深刻。 有人担心,媒体和公民如此“煽动”,恐怕有不好的结果发生,所以最好要让他们理智一点,避免影响司法公正,所以,最好要限制这种言论自由。 事实上,言论自由正是程序正义的一个保障。历史告诉我们,如果律师不能说话,如果受害人老是被雪藏,如果没有言论自由,就根本没法有程序正义所要求的公正采集证据,寻访证人,也不可能有正当的法庭辩论。 为了程序正义,我们至少不能限制言论自由。 当然有人要说了,我们可以放开这一类的自由,但是限制那些“煽动”的言论自由。 这个提议看起来很好,也符合很多“理智主义”者的想法。事实上,这是大错特错。 美国宪法的立法者早就意识到,如果你限制了一种言论自由而放开另一种言论自由,那这就不是言论自由了。 那些希望用程序正义这个光亮的果子来诱使人民相信必须要限制不理智的,煽动仇恨的,会影响司法公正的人,充满了理性优越感的想要通过正义而理智的立法限制言论自由的时候,却惊讶的发现碰到了永远越不过的石头墙:宪法第一修正案赫然写着“国会不得立法限制言论自由”。 其实这不值得惊讶,美国的开国先贤知道后来的理智的聪明人会这么干,所以早就把你要走的路堵死了!

再说一次废话:我写的这些东西,都是基本到不能再基本的,每一个美国中学生都熟悉的宪法知识。我也是只读了一些基础的书,可见要掌握这些基本概念不难。我希望我的读者能够读一些这样的关于公民权利和第一修正案的书,你读了这些书以后,就知道我在这里写的都是废话。你要是真的觉得我写的全是你已经知道的废话,我反而会很高兴,因为你已经成为一个值得我尊敬的公民了。 如果你还年轻,想成为一个正直的人,那么,了解什么是自己的自由,什么是他人的自由很重要,因为这样你就不会有意无意的侵害他人自由而不自知。其实人际关系中,正直的基本定义就是如此。哦,对了,我只和正直的人成为朋友,因为不正直的人侵害我的私利的概率比较大,请原谅我的自私。

Apr 29, 2010 - Borg

Comments

Star trek 是基本上属于 Geek 必看的科幻剧了,虽然年代久远了一点,但里面很多词和符号都成了 Geek 文化的一部分。

我甚至怀疑乔布斯老师是按照 Star trek 里面人手一个 PADD 的创意发明 iPad 的。

Startrek 剧集中塑造了一个外星种族,叫做 Borg. 我觉得很有意思,来八卦一下。

首先,Borg 这个种族常常和邪恶帝国挂上等号。如果你去翻 New Hacker’s Dictionary 的 Borg 条目, 他就会告诉你, See also: Evil Empire. 如果你是 geek 网站 slashdot 的常客,你就会发现, 上面每条微软的新闻旁边,都是比尔盖茨同学戴了一个机械状的头盔/帽子, 是的, 这就是隐喻了比尔盖茨的微软是个邪恶帝国。

为什么说 Borg 是邪恶帝国呢? 这要从 Borg 的生存方式说起。 所有的 Borg 成员,都随时听从一个中央命令机构,叫做 Collective (集体). 这个集体, 随时能够和任何一个 Borg 成员通信, 在 Borg 成员里共享一切信息. 每一个 Borg 成员并没有名字,而是以代号相称, 比如第一联合方阵第一分队 9 人组第 7 号(著名的 Seven of nine)。 这些成员也没有任何所谓的个人意志,都是属于 Borg 集体里的一个工蜂而已。

Borg 本身只是一种社会组织方式,蜜蜂和蚂蚁基本上也是这样组织的。 Borg 的邪恶之处在于,他生存的唯一目标,就是不断的同化其他的种族,以达到自身种族的完美。 他们对其他种族的同化显然非其他种族自愿的,于是他们就不断的发动战争,其中就包括对人类的战争。 同时,他们的武器系统还很发达,能够自动适应对手的武器系统,所以基本上同化其他种族好不费力气。 Startrek 剧集放到 Voyager 的时候,他们基本上已经统治了银河系第四象限的绝大多数星球系统了。 一个种族一旦被同化,就彻底变成了 Borg 集体里面的一个零件,所以,Borg 几乎是所有其他种族的敌人。

Borg 同化的方法也很神奇,就是给你注射一种纳米级别的生物芯片,这种生物芯片一旦到了被同化的生物的体内,就开始改造这个生物。 以人类为例,Borg 认为人的视觉系统不够发达,所以同化人类为 Borg 的时候,人就会被添加一个发红光的眼睛部件。 Borg 的这个特征很显著,盖茨大叔的图就是这么回事。

Borg 这种集中的,集体的,一致对外的组织方式,是效率无比之高的。 当然,Borg 也有一个致命的弱点: 他们的技术非要通过同化其他生物才能获得,他们本身的研发技术却不见得怎么样。用句流行的话说就是 “一直在模仿,从来不创新”。 所以假如遇到不能同化的生物,他们就非常郁闷。比如说,Borg 编号为 8472 的生物的免疫系统特别强, Borg 的生化武器完全不起作用,这时候 Borg 就被打得落花流水。 最后还是靠英勇的人类船长和神奇的医生研发的技术才勉强打败了 8472 号生物的一次进攻。

Star trek 中有多次 Borg 的成员被同化后脱离了组织再次变成一个个体的例子。 最显著的就是 Seven of Nine 的去 Borg 过程了。 Seven 是一个人,很小的时候就被同化成 Borg, 一开始是作为合作来到 Voyager 船上的,但是时刻不忘和集体保持联系。因为一次事故,她和集体的连接被切断了,她立即感觉到“我再也听不到集体的声音了,我很孤独”。 的确,Borg 集体的力量和声音是非常有安全感的,一瞬间失去了之后必然会感到很孤独。 船长 Janeway 就说,你不是 Borg, 你首先是一个人,不要感到孤独,我们船上所有的人都是你的朋友。 Seven 最终摆脱了 Borg 集体的影响,成了 Startrek 系列中最性感的角色,哈哈。

最后附送一个和 Borg 有关的好玩的技术八卦。 大家都知道 GoF 的 Design Pattern 里面的 Singleton Pattern, 就是一个类只能有一个实例。 在 C++ 等标准的静态语言上,实现方法是私有化构造函数等等。 在 Python 这种藏不住构造函数又动态的语言中,

实现 Singleton 看上去是比较麻烦的。 不过,有一个叫做 Borg Pattern 的实现,优雅得实现了 Singleton。 如果你了解了 Borg 种族的特点,又知道 Python 的一些基本知识, 你看下面的这个代码肯定会赞叹到笑出来。

class Borg:
    __collective_mind = {}
    def __init__(self):
        self.__dict__ = self.__collective_mind

    # and whatever else you want in your class -- that's all!

Borg Pattern 就这么简单。对于小项目中顺手写一些控制资源访问的 Singleton 来说,这个 Borg Pattern 实在是不能再好了。

Mar 28, 2010 - 思维和语言随笔 2

Comments

设计新语 (new speak) 这种语言的目的,不仅仅是一种适合表达 Ingsoc 的世界观和思维习惯的媒介,更加要紧的是,其他的思维方式根本无法在新语下表达。 — George Orwell  “1984

语言是能够影响思维的,这一点基本上对语言和思维有认识的人都能够体会到。

一、

亚马逊丛林里面有个部落,语言中没有数字的概念,因此,当地说这个语言的人只能够分辨两框苹果哪个多哪个少,却不能数出这框苹果比那框苹果多多少。非洲也有一个部落,语言里面没有左和右的概念,只有东南西北。他们也就没有“右手”这个词,只能根据身体的朝向说你“东边的手”或者“西边的手”等等。因此当地人方向感特别强,到什么地方先要分清楚东南西北,否则没法表达一些意思。

阿拉伯人常常和骆驼打交道,因此有几十个关于大骆驼小骆驼公骆驼母骆驼等等的不同的词。 爱斯基摩人天天出门见雪,因此有地上蓬松的雪,结了冰的雪,刚下的雪,屋子上的雪等等十几个不同的词。假如他们看到一副画,就要先思考这个画里面的骆驼或者雪是什么属性的,如果不知道属性(比如卡通画里面的骆驼或者雪),他们就不知道怎么说才好。这些都是语言对思维的限制的例子。

语言对思维还有一种误导的作用。比如我们小时候常常听说的一个词叫做“早恋”。这个词在中文里面包含了偏见,好像是本来不应该的,提早了的恋情。这个词本身表达的概念应该是中性的(英文里这个词叫做 puppy love, 小猫小狗之间的恋情,媒体和大众对这种现象都是中性态度),但是中文表达出来,却包含了一种价值判断(“早”字包含了不应该的意思)。 中文中有无数这样不科学的,包含了偏见和价值判断的词(这些词被李笑来老师称为恶词)。任何一个想要独立思考的人都应该避免使用这些恶词。

**

二、**

我们说了语言能够影响思维,那么语言是不是决定了思维呢? 这就是著名的 Sapir-Whorf 猜想。 这个猜想是说,语言对思维是有决定性影响的,即存在这样的一个语言,使得某种意思能够在这个语言中得到表达,但不见得在另外的一个语言中得到表达。 假如说 Sapir-Whorf 真的能够成立的话,那么 1984 和新语真的不是痴人说梦。

**

三、**

所幸的是,很简单可以证明 Sapir-Whorf 猜想不正确。 大家都知道,计算机语言是一种非常受限的语言,然而只要这个语言是“图灵完全“的,他们在最根本的表达能力上都是没有区别的。乔姆斯基更加猜想,人的语言的生成机制,就是一个图灵机。 这个猜想其实和丘奇-图灵论题是等价的。 我在之前一些文章中提到的,人工智能的符号学派假设人的思维完全来自于对符号的处理,根据丘奇图灵论题,那么只要一种语言能够容纳图灵机,就能容纳其他语言了。 我们常用的自然语言是显然能容纳图灵机的, 因此,理论上来说,只要语言足够复杂,就不大可能完全决定我们的思维,使得一种语言能表达的意思完全不能由另一种语言表达。当然,不同的表达有效率的问题,因此即使本质等价,从效用上看也不等价。

**

四、**

中文中唐诗宋词的结构之美,是其他基于字母的语言难以企及的,所以,审美是和语言息息相关的。 Python 编程中的美,函数式编程中的美,也是 FORTRAN 所未能得见的。 中文的美一定程度上来自于其搭配的模糊性和意象类比,读多了唐诗,宋词的人就知道,几乎没有一个没有类比的。 这种意象类比在文学作品中出现是一种优美的事情,但在非文学作品中,在评论,科学写作和日常交流中,这往往是正确思维的敌人。 这在一本叫做 The Alphabet Effect 的书中讲得很仔细。

英国科学家李约瑟毕生研究中国科技史,他很好奇,古代中国拥有世界上最先进的技术和生产水平,为什么却没有发展出现代科学呢? 到底是中国古代社会哪一方面出了问题呢? 这个“李约瑟问题”的答案有很多种,其中 The Alphabet Effect 这本书就提出了一种解释: 中国的书写系统不是字母化的,而是方块字。 或者简单的说,就是全怪仓颉这个人,怎么不造出拼写文字?

大体说来,此书认为,第一,中文读,写系统分离(看到,听到一个字不知道怎么写)使得阅读中文的时候较多的采用非线性(右脑)思维,而人在进行逻辑思考的时候较多的是左脑思维。两脑并用不是优势,所以中文书写系统影响了左脑的发展。 这一点我不知道对错。 第二点说,中文的字,都是从具体的图画而来,而中文的词,都是单字组合而来,这些单字组合,又必须要尊重原来具体单字的含义;加上单字又是抽象了具体的,可以画出来的事物,所以中文的抽象程度不高,且一词多义现象非常严重。 而现代科学需要的是高度抽象的词,和高度精确的概念。这一点我是同意的。现代汉语里很多词,在新文化运动前是没有的,比如“科学”,“哲学”,“政府” 等等。古希腊的拼写文字组合灵活,很早就形成了如“质”,“量”,“比率”,“几何学”,“心理学”等等和现代科学相关的,抽象程度很高的词,而这些概念则是古代汉语中从来没见到过的。第三,活字印刷术虽然号称是中国发明的,但其实一直没有大规模使用,在清代还是雕版为主。而普遍采用字母的欧洲则迅速采用了活字技术,使得雕版技术只在高档场合有所保留。 这一来更加拉大了信息传播的差距。

**

五、**

俗话说,人穷不能怪父母,用批评中文本身的方法来掩饰在科学上的落后只是一种学说而已。 如果现代汉语和其他语言处于同一起跑线的话,本应当有足够的机会弥补这个缺口。 不过,英语已经成为一种事实上的语言了,所有的新的概念和新的学说,基本上都是以英语发表。作科研的人做到后来也知道,有些概念不知道怎么翻译成中文(而且一翻译就是错的,比如俄狄浦斯情节,翻译成中文叫做恋母情节,其实完全是把一个好词翻译成了恶词,抽象程度大大降低)。 我一直鼓吹,如果要学习计算机科学的话, 会英语的人能看英文就少看中文,因为中文中,对计算机科学中相关概念的精确程度的确比不上英文,而且一翻译就错。

英文 wikipedia 有几百万个词,而中文只有十万个,撇去因为审查制度造成的不便外,英文比中文的复杂度是在高太多了。(从这个意义上来说,审查制度是不是在扼杀中文?)

**六、

**

语言是一种媒介,不光是语言能影响人的思维方式,物理媒介本身也能影响人的思维方式。 你是否曾经觉得在多媒体计算机屏幕前看书怎么也看不下去,一换到纸质的书就能看下去? 是否觉得小时候爱看电视的人长大了思维不连续,没逻辑? 是的,媒介会构建和摧毁你的思维方式。 多媒体计算机有很多的视觉元素,会抑制你的左脑的线性思维,激化你右脑的模式识别能力,所以,在多媒体计算机前看书的你,会自觉不自觉的被转换到右脑的思维方式,看电视也一样。 这是无法避免的事情。 科学研究发现,儿童看很多电视会影响后天的智商和持续思维能力,因为电视屏幕平均每隔90秒就要换一次场景,儿童的大脑就会发展为适应这样的持续激励的右脑思维方式,而左脑得不到必要的训练。

想买 iPad 看书的同志们,可要想好了你买了 iPad 之后大脑是不是会和你作对不让你看书哦 :) 如果你常常用 iPad 看电影上网的话,看书可能是一件让大脑感到困难的事情 :)

Mar 24, 2010 - 博客遭受不知名的木马攻击

Comments

我的 wordpress 的 index.php 文件总是在最后莫名其妙的出现 一个 iframe, 里面有 http://www.kmsjwg.*\*com****/x******x.htm 昨天晚上我检查的时候还没有,今天就已经被举报成恶意站点了。

我怀疑是博客哪个地方有漏洞,目前正在修复。 哪位有线索也可提供。

谢谢阅读

Mar 14, 2010 - “西厢计划”原理小解

Comments

待月西厢下,迎风户半开。隔墙花影动,疑是玉人来。

最近 twitter 上最流行的一个关键词是”西厢计划”. 这个计划名字取得很浪漫,客户端叫做张生,对,就是西厢记里面那个翻墙去见崔莺莺小姐的张生;显然,服务器端必然叫做崔莺莺。客户端的张生是最重要的部件,可以不依赖于服务端工作。

我是个特别好奇的人,遇到好玩的总要学习一下看看是怎么弄的。因为西厢计划的作者只是简要的介绍了一下原理,其他报道又语焉不详,我当时就觉得很好奇,花了昨天一个晚上详细读了一下源代码,终于知道怎么回事了,觉得原理非常漂亮,所以写篇文章介绍总结一下。

先说大方向。大家都知道,连接被重置的本质,是因为收到了破坏连接的一个 TCP Reset 包。以前剑桥大学有人实验过,客户端和服务器都忽略 Reset, 则通信可以不受影响。但是这个方法其实只有理论价值,因为绝大多数服务器都不可能忽略 Reset 的 (比如 Linux, 需要 root 权限配置iptables, 而且这本身也把正常的 Reset 给忽略了)。只要服务器不忽略 Reset, 客户端再怎么弄都没用,因为服务器会停止发送数据,Reset 这条连接。所以,很多报道说西厢计划是忽略 Reset, 我从源代码来看应该不是这样。在我看来,西厢计划是利用了墙的一个可能的弱点–墙只在连接发起的时候把一个 TCP 连接加入监听序列,如果墙认为这个连接终止了,就会从监听序列中去掉这条记录,这样,这条连接上后续的包就不会被监听。西厢计划就是让墙“认为”这个连接终止的一个绝妙的方法。只要墙认为这个连接两端都是死老虎,墙就不会触发关键词检测,其后所有的数据,都不存在连接被重置的问题了。

如何让一个连接置之死地而后生,就是西厢计划那帮黑客神奇的地方了。这也不是一日之功。 首先,这帮牛人发现,墙的是一个入侵检测系统,把含有关键字的包当成一种“入侵”来对待。采取这种设计有很多好处,但缺点是入侵检测系统可能具有的问题,墙都可能有。西厢计划主页上那篇著名的论文就是讲这些七七八八的漏洞的。可以说处理这些七七八八的漏洞是非常困难的,迫使墙的设计者“拆东墙,补西墙”。这样补来补去,外表看起来好像很牛逼的墙,其实有很多本质上无法简单修补的漏洞,其中有一个致命的,就是 TCP 连接状态的判定问题。 出于入侵检测系统这种设计的局限,墙没有,也没办法准确判定一条 TCP 连接的状态,而只是根据两边收到的数据来“推测”连接的状态。而所有的关键词检测功能,都是基于“连接还活着”的这个推测的结果的。因为墙的规则是在连接发起的时候开始对这条连接的检测,在连接终止的时候停止对这条连接的检测,所以,一旦对连接的状态推测错误,把还活着的连接当成已经关闭的连接,墙就会放弃对这条连接上随后所有的包的检测,他们都会都透明的穿过墙的入侵检测。

上面只是想法,具体到 TCP 协议实现这一层,就要只迷惑墙,还不能触及我要通信的服务器。最理想的情况下,在任何有效通信之前,就能让墙出现错误判断,这些,就需要对 TCP 协议有深刻理解了。西厢计划的那帮黑客,居然真的去读 TCP 几百页的 RFC,还居然就发现了方法(这里我假设读者都知道 TCP 的三次握手过程和序列号每次加一的规则)。 我们都知道,三次握手的时候,在收到服务器的 SYN/ACK 的时候,客户端如果发送 ACK 并且序列号+1 就算建立连接了,但是客户端如果发送一个序列号没 +1 的 FIN (表示连接终止,但是服务器知道,这时候连接还没建立呢, FIN 这个包状态是错的,加上序列号也是错的,服务器自己一判断,就知道这个包是坏包,按照标准协议,服务器随手丢弃了这个包), 但这个包,过墙的时候,在墙看来,是表示连接终止的(墙是 ma de in china, 是比较山寨的,不维护连接状态,并且,墙并没有记下刚才服务器出去的 SYN/ACK 的序列号,所以墙不知道序列号错了)。所以,墙很高兴的理解为连接终止,舒了一口气去重置其他连接了, 而这个连接,就成了僵尸,墙不管你客户端了,而这时候,好戏才刚刚开始。

事实上,墙是双向检测的(或者说对每个包都检测的),因此,对服务器和客户端实现相同的对待方法,所以,墙不管客户端还不行,假如服务端有关键词传给客户端,墙还是有可能要发飙的(这里说有可能,因为我也不知道)。所以,最好的办法就是,让服务端也给墙一个终止连接的标志就好了。可是这个说起来简单,做起来难,怎么能让不受自己控制的服务器发一个自己想要的包呢? 西厢计划的那帮黑客,再次去读几百页的 RFC, 令人惊讶的发现,他们居然在 RFC 上发现了一个可以用的特性。我们上面说了,三次握手的时候,在收到 SYN/ACK 后,客户端要给服务器发送一个序列号+1 的ACK,可是,假如我不+1呢,直接发 ACK 包给服务器。 墙已经认为你客户端是死老虎了,不理你了,不知道你搞什么飞机,让这个 ACK 过了。可是服务器一看,不对啊,你给我的不是我期待的那个序列号, RFC 上说了,TCP 包如果序列号错了的话,就回复一个 Reset. 所以,服务器就回复了一个 Reset。这个 Reset 过墙的时候,墙一看乐了,服务器也终止连接了,好吧,两边都是死老虎了,我就不监听这条连接了。而至于客户端,这个服务器过来的 Reset 非常好识别,忽略就是。随后,客户端开始正确的发送 ACK, 至此,三次握手成功,真正的好戏开始,而墙则认为客户端和服务器都是死老虎,直接放过。所以,张生就这样透明的过了墙。 至于过墙以后所有的事情,《西厢记》里面都有记载,各位读者自行买书学习。

现在的西厢计划客户端,即“张生”模块的防连接重置的原理就是这样,服务器端,即莺莺模块的实现也是类似的。防DNS那个,不懂 DNS 协议,所以看不懂。我猜想,因为开发人员都是黑客,所以自然喜欢用最经得起折腾和高度定制的 Linux 开发。 现在看西厢计划的实现,因为依赖于 Linux 内核模块 netfilter, 在 Linux 上如鱼得水,但往其他平台的移植可能是个亟待解决的问题。 我觉得,在其他平台上,可以通过 libpcap 和 libnet ,在用户态实现相同的功能,就是有点麻烦而已,有兴趣的懂网络的可以照西厢计划原理,在家自行做出此功能;当然,全中国人民都用 Linux 最好 :)

PS 1: 据说是西厢计划一个作者画的原理图:http://img.ly/DIi

PS 2: 我对 TCP 的理解仅限于课本,如果上面的对技术的理解有错,请大家指出。

PS 3: 有些漏洞,可能是设计上本质缺陷,不是那么容易修复的。

PS 4: 除了最后一个图,本文没有其他相关链接,如需相关资料,自行 Google。