首页 >> 计算机科学 >> 文章

在革命战争影片中,经常会看到英勇的解放军战士背着步话机在喊“长江长江,我是黄河,听到请回答。”很明显,这是呼号为黄河的一方想找呼号为长江的另一方说事,为了保证影片的节奏,导演往往把后面的联络过程省略了,其实后面还有两步,长江听到黄河的呼叫后要回答“黄河黄河,我是长江,我听到了你,请回答。”这叫做第二次握手。黄河听到长江的呼叫后还要回答“长江长江,我是黄河,我听到了你,现在请你收报”,这是第三次握手,三次握手成功后,才能在电台里传送工作报文。为什么必须三次握手后才能工作呢?听我慢慢道来。

《英雄儿女》

第一次握手:黄河发起呼叫,长江收到了。这时长江可以确认的是,黄河的发信机和自己的收信机是好的,否则的话他收不到黄河的呼叫;黄河能确认什么呢?他什么也不能确认,有可能自己的电台除了指示灯是好的,其它都是坏的,他在对着一台铁疙瘩发功。

第二次握手:长江回应,黄河收到了。这时黄河可以确认的是,自己和长江的收发信机都是好的,否则的话他收不到长江的回应信号。这时黄河可以说正事了吗?还不能,虽然长江发出了回应,但他并不能确认自己的发信机和黄河的收信机都是好的。

第三次握手:黄河对长江的回应进行回应。这时黄河很清楚,双方收发信机都是好的,自己的这次回应长江肯定能收到,这个回应的目的只是消除长江对黄河的收信机和长江自己的发信机的担心。然后,黄河不必等长江的再次回应就可以说正事了。

有些读者看到这里,心里会想“且慢,你凭什么说第三次握手后,长江肯定会收到?长江刚才的状态好,不代表后来的状态好,俗话说人算不如天算,我看再多握几次手会更可靠些。”这种想法有道理,几句话还真说不清,那么不妨先讲一个与此有关的战斗小故事。

战场态势是这样的:

驻扎在两个山头上的红1团和红2团分别有两个营,而在山谷的蓝团有三个营,若红1团和红2团孤军下山作战会失败,而两个团同时进攻就会胜利,对于红方来说,问题的关键是要同时发起进攻。

战斗前的准备过程是这样的:

红1团团长找了个传令兵,命令他跑到红2团,告诉红2团团长明早9时发起进攻。传令兵没有被蓝团俘虏,成功地跑到了红2团的山头,告诉红2团团长明早9时两个团同时进攻。红2团团长一边握着传令兵的手激动地说“太好了!我早就等着这个消息呢!”,一边心里暗自核计“虽然我知道了这个消息,但是红1团的团长并不知道我已经知道了,谁都知道传令兵有可能被俘,消息很有可能传不过来,若明天总攻前,红1团团长不知道我已经得到了消息,他一定不会贸然进攻的,换成我也不会”。于是,红2团团长对传令兵说“兄弟,你辛苦了,先抽袋烟吧,抽完后再辛苦你跑回去,告诉你们团长,说我已经得到消息了,明天按时总攻。”

传令兵又跑回到红1团,侥幸又没被蓝团俘获,他告诉红1团团长有关红2团团长已经获知明早进攻的消息,但红1团团长明早敢发起攻击吗?他不敢,因为他心里清楚,红2团团长并不知道他(红1团团长)已经知道了“红2团团长已获知明早9时发起攻击”这个消息,红1团团长继续想,如果是他本人是红2团团长,就不会贸然攻击,因为自己已经获知明早9时发起攻击这件事,对方未必知道,而有可能因为传令兵回团时被抓,敌人反而知道了,自己贸然攻击,有可能就会失败。于是,红1团团长对传令兵说“兄弟,你辛苦了,先抽袋烟吧,抽完后再辛苦你跑一趟红2团,告诉他们团长,就说我已经知道他已经知道了明早9点进攻这件事,让他放心地打吧。”

写到这里,聪明的读者已经猜到了,即使传令兵再次来到红2团,红2团团长也不敢开战,还是要传令兵再次回红1团报信,因为红2团团长担心红1团团长不知道他(红2团团长)已经知道了红1团团长知道他(红2团团长)知道明早9点发生攻击的事。(此句53个字,想到松鼠们多用短句的建议,心里严重疚结中......)

回到三次握手问题上,红1团和红2团其实就是通信的双方,这场永远也达不成协议的战斗,说明了一个重要的通信道理:世界上不存在完全可靠的通信协议

“三次握手”是电台点对点通信的一般规则,但即使三次握手成功后,以后的通信就能保证正常吗?当然不能,握手成功后的设备故障、干扰、话务员的伤亡等,无数种可能性会导致通信失败。三次握手成功只说明了之前的通信条件和环境,而不能决定和预测之后的通信条件和环境。根据经验,两个电台之间的通信失败,最大的可能性是两个电台本身的故障,三次握手的成功排除了这种可能。以后的情况很难预测的,通信协议只能做到尽可能的可靠,而不能做到理论上的完全可靠。

电台通信一定要三次握手吗?当然不一定。潜伏者为了不暴露自己,可以只使用收信机而不发信,回应总部时可以采用其它手段,例如在指定电线杆上贴个寻人启示。如果电台的发信机出了故障,也可能不经过三次握手而达成通信,在对越自卫反击战中,某部的电台发信机坏了,指挥所在没有收到对方握手信号的情况下,连续盲发14份报文,该部全部收到,并按指示顺利地完成了任务,该电台台长因此荣立了二等功。

0
为您推荐

71 Responses to “第三次握手——革命斗争中的通信故事”

  1. cary说道:

    红1团和红2团
    难道这就是传说中的
    猜疑链?

  2. bk201说道:

    说到猜疑链,我至今没看懂“你不知道我怎么想你怎么想我怎么想你”

    • sun说道:

      很简单,从最后往前推,即从“我怎么想你”开始,你就知道了,否则你还是不知道

  3. 天边的云说道:

    GFW工作原理,破坏握手

  4. atpking说道:

    TCP协议路过

  5. 四月说道:

    这让我想到两个老太太煲电话粥,她们应该从来不care到底有木有握手……

  6. 乙展说道:

    精炼》》》》

  7. Sheldon说道:

    打电话时...

  8. Jonathan说道:

    “第一次握手:黄河发起呼叫,长江收到了。这时长江可以确认的是,黄河的发信机和自己的收信机是好的,否则的话他收不到长江的呼叫;黄河能确认什么呢?他什么也不能确认,有可能自己的电台除了指示灯是好的,其它都是坏的,他在对着一台铁疙瘩发功。”这一段中应该是“否则的话他收不到黄河的呼叫”吧。

    • 奥卡姆剃刀说道:

      您看得真仔细,说实话我发出来前也检查过了,楞是没看出来这个笔误,谢谢您了。

  9. SARS虫虫说道:

    TCP和UDP的故事?

  10. Bo Zhao说道:

    就这文章……里面的内容基本都是别人的原话转述,不加引用,不写参考文献,还好意思说“转载请注明出处”。

    你作者还是高校教师,平时就是这么搞研究,写文章的么?

    • 打破的管道说道:

      我觉得这篇文章写得很棒,把教科书上一个说不清道不明的三次握手原理讲得清晰透彻,还饶有趣味。
      另外,我觉得没必要去关心作者的真实身份,在网上任何人都只是个ID而已,如果把现实中的背景也带上,怕是会破坏掉这份得来不易的平等。

      我有一个想法,是关于第三次握手的。
      文中对第三次握手的解释是“这个回应的目的只是消除长江对黄河的收信机和长江自己的发信机的担心。”这句话给了我很大启发。但仔细一想,竟又产生了一些不解,那就是第三次握手究竟在什么场合下才真正有意义。我觉得这取决于是谁先发消息正文。下面是我的理解:

      1. 在黄河先发消息正文给长江的情况下,如果没有第三次握手也是可以的,因为黄河已经知道两方设备均正常,所以可以完全放心地给长江发送消息正文。而长江在收到第一条消息正文后也就打消了对黄河的收信机和长江自己的发信机的担心。由此看来,第三次握手有些多余。

      2. 在长江先发消息正文给黄河的情况下(也就是黄河主动请求让长江先发消息),第三次握手才有意义。

      不知道我这样理解对不对?

      • 奥卡姆剃刀说道:

        第三次握手还是有必要的,它适合是双工和半双工通信,即长江也有给黄河发信的可能。这能帮助长江确信他的信息能传给黄河。

        • 打破的管道说道:

          嘿嘿,我知道长江也有给黄河发信的可能,也明白文章中提到的场景最低配置也要是个半双工。只是觉得对于第三次握手,可以再优化一下。
          因为握手毕竟是要耗费时间的嘛,如果黄河有话着急要对长江讲,就不防不发第三次握手而直接发正文看,因为黄河已经从前两次成功的握手中得知所有设备均正常。
          我觉得一个可行的做法是在消息里加一个特殊标志,来告诉长江这是正文还是第三次握手。
          对于长江来说,收到黄河发来的第二条消息之后(此时长江也足以知道所有设备均正常了),检查刚才说的那个标志,如果标志上说这是第三次握手,则忽略这条消息。如果这不是握手消息,就直接当正文来解读。
          我觉得在大多数情况下,都是由会话的发起者(也就是第一次握手的发起人)先发送第一条正文。
          那么这样做的好处就是:在大部分情况下,把握手次数从三次减少到两次,减少了建立连接所需的时间。

          以上纯属个人想法,无参考无依据,呵呵。

          • sun说道:

            你还是承认了第三次握手的必要性,只不过实现的方式不一样,

          • shell说道:

            这个是第三次握手携带数据,TCP上就是一个携带数据的ACK包。

    • 奥卡姆剃刀说道:

      原话转述?这个帽子有点大,拜托你把原话引述出来,看看我是如何转述的,呵呵。

    • 奥卡姆剃刀说道:

      再回:我平时搞的研究当然不会这样浅显,写的科研文章也只投专业的核心期刊和国外三大检索的刊物。

      但科普文章就是像这样写的,用尽可能通俗有趣的语言来讲述一个科学道理,我不觉得这有什么不对,难道你不这样认为吗?

  11. wealk说道:

    世界上不存在完全可靠的通信协议,这句话有问题
    实时上你只是证明了, 在不可信的通道上 不可能建立可信、可靠的通道,而不是不存在完全可靠的通信协议。

    • 奥卡姆剃刀说道:

      事实上我也并没有证明,而只是说明了这个道理。信道没有什么“可信”和“不可信”之分,实际信道绝对是有扰的,可以说通信技术就是跟干扰做斗争的技术,并不存在完全可靠的通信协议,我们能做到的只是足够可靠。

    • 说道:

      这句话没有问题,可证伪。
      反之,倒是“世界上存在完全可靠的通信协议”是个没法证伪的东西,说出来就麻烦了。

  12. TT说道:

    依稀记得很久之前《计算机网络》课上,老师的课件上就有这个红几团的小故事。
    好像是TCP的协议……

    • shell说道:

      通讯上很有名的“两军问题”,可以看AST的那本《计算机网络》。

  13. windameister说道:

    战斗小故事在《计算机网络》一书中有……
    不过尚不知是否是该书引用了另有出处的

  14. zy说道:

    呃,遇到本专业人士了,这个就是TCP3次握手撒

  15. 错杂谈说道:

    关于第三次握手,多说一句。

    如文中所讲,其实,黄河方确实不用进行第三次握手,直接发送数据即可,但这只是对于智能接收方才有效,因为长江方知道黄河方发送过来的是有用的数据还是用来连接的信令。

    但是对于实际TCP/IP连接来说,如果第三次握手既可以发数据、又可以发信令,那么对于连接状态和数据发送状态就很难分清楚,所以,对于TCP/IP,连接状态,必须完成三次握手。

  16. williamjen说道:

    看着这个无穷嵌套的段子,我想起了某人说过,我们知道事件A,大脑必须知道自己知道事件A,还必须知道自己知道自己知道A,还必须知道自己知道自己知道自己知道A。。。。。。。。。。。。于是,只要1件事情,我们的大脑内存就产生溢出错误了。。。。。。
    哈哈。。。。。
    读书时花了两个星期研究TCP和UDP,现在已经忘光了的童鞋飘过~~~

    • 打破的管道说道:

      说到无穷嵌套,想起一个很精辟的笑话,说在某本计算机字典上对死循环的定义是:
      死循环:n.参见“无限循环”
      无限循环:n.参见“死循环”

  17. biohu说道:

    可怜的通信兵。。。

  18. norma说道:

    通俗易懂。。。

  19. 八爪鱼说道:

    押题图是不是压的不准。。。。。。

    • 奥卡姆剃刀说道:

      嗯,如果用《英雄儿女》中王成用电台喊“向我开炮”的那张就好些了。地址:http://www.douban.com/photos/photo/429774663/

  20. 伊藤博文说道:

    啊,本帖有这么多前辈…我代表我与群博的TCP连接握手兼路过…

  21. www.26kg.cn说道:

    咦,长江长江,我是黄河,听到请回答。这不是暗号么|,

    • 奥卡姆剃刀说道:

      严格说来,这不是暗号,而是呼号。不过,你认为是暗号也没什么大错。

  22. 小松鼠说道:

    上过计算机网络的都知道,lz的例子都是原书里的= =!

  23. Jan说道:

    恩,一开始的问题是http://en.wikipedia.org/wiki/Two_Generals%27_Problem

    对于小于3个参与者的系统,握手以后出现问题是无法纠正的,对于有大于3个参与者的系统则有解决方案 参考http://en.wikipedia.org/wiki/Byzantine_fault_tolerance

  24. 扳手说道:

    在对越自卫反击战中,某部的电台发信机坏了,指挥所在没有收到对方握手信号的情况下,连续盲发14份报文,该部全部收到,并按指示顺利地完成了任务,该电台台长因此荣立了二等功

    如果电台不坏,这个台长能不能得二等功?

  25. lechter说道:

    又见握手,邮电大学毕业的偶内牛满面

  26. 阮宗光说道:

    我在新语丝泡得久,对这位“方士”的”“方术”越看越熟悉,也对他越来越不满,常常会发些异声,也预料有一天方术会用到我身上。我的自知之明还可以,觉得那些“方法"罪名 - 造假,利益冲突,索求不得,不懂科学,投靠敌营。。都不合用,“方批”“方言”再厉害,也不过是兵来将挡而已。

    我说了一句“美国有州政府强迫教智慧设计,比中国落后”,不精确的轻松话而已,他却以为有机会给我一个教训,问我哪一州,希望我会狡辩,把自己夹进死胡同,我在那里拖,每次回答加句尖刺“方针”。练太极拳的人不够太极,沉不住气开口骂人,结果也不过是引出“要批评不要屁评,小事大作,群起围攻,文革手段,领导方批,粉丝跟批”等 等回答:这些就是我的“大方”对策

    我以前只是旁观者,新语丝在我看不过是一个舞台,“方庙”“方阵”;以前不是支持者,现在也不是反对者。但“死罪虽免活罪难逃”,捣捣蛋开开玩笑是必须的;所以我把刘华杰谈他去北大演讲的旧文重新发一次进入google,现在用“方舟子,北大” “方舟子,访问”“方舟子,刘华杰”“刘华杰,访问”搜索,这文都出现在前面,让它多多流传。

    听了太多马屁容易糊涂,吃帖我的“方药”清醒一下

  27. 阮宗光说道:

    又和他捣蛋发了这张帖子在他那里;现在用“方舟子,北大”“方舟子,访问“”方舟子,绿色和平““绿色和平 北大“等等,在谷歌搜索都在前面出现

    http://www.xys.org/forum/db/6/159/204.html

    绿色和平邀请方舟子访问北大

    送交者: 阮2 于 2010-04-10, 12:54:57:

    这次他们同老方闹,有备而来,不但派人动口动手,还有有识之士供给理论;这些幕后人是谁,同方有什么仇恨,以后怎样,大家自由想象
    对方不是乌合之众那么简单,这里却一团散沙;为什么,也留给各位思考

  28. 若飞说道:

    真的有道理,通俗易懂,上课时,都没听明白,不过今天看过先生的文章,有醍醐灌顶之感。

  29. 阮宗光说道:

    不知道为什么“相关和因果”引起大闹

    http://xys.org/forum/db/6/174/88.html
    http://xys.org/forum/db/6/174/29.html
    http://xys.org/forum/db/6/174/9.html
    http://xys.org/forum/db/6/173/72.html
    http://xys.org/forum/db/6/171/112.html
    http://xys.org/forum/db/6/170/178.html

    其实说不清楚的原因是没先搞清这点:

    如果1。是因,2。是果,我们可以用来
    预测:1。发生了,2。也会发生
    避免:没有1。,也就减少(部分或完全)2。

    如果1。和2。相关但不是因果,我们还是可以预测,却不能避免

  30. Vampire说道:

    从经济学里面的博弈论理论来说,这个就是共同知识(common knowlege)
    "I know you know I know you know I know......"
    ^_^

  31. 春歌的猫说道:

    http://v.youku.com/v_show/id_XNzI5NjIxMTY=.html
    《假如明天来临》 第3集 里面就有2个棋王在油轮上被主人公愚弄了

  32. 晓雪说道:

    上过计算机网络的都知道,lz的例子都是原书里的= =!

    顶这个,的确是原书里的原例....

  33. 爱丽茉莉说道:

    挺好的。

    起码对我这个逻辑和数学的白痴来说,楼主的好几篇文章都很有趣

    PS:貌似总能看到几个文人相轻的发言,无聊的很

    就算楼主的文章是原文引用又如何?发稿费还是算发论文赢得什么好处了?

    起码我看了,觉得有趣,还有用不就好了~~~~~~最烦这种唧唧歪歪的人了

  34. crazy_piggy说道:

    哇哈哈,TCP的三次握手!

  35. lanling1231说道:

    偶然,在互联网上发现了这个Blog地址,简直太幸运了!
    博主的科普文章太有意思了!
    博主劳烦有空就多多地写哟!

  36. lanling1231说道:

    一激动,讲都不会话了!
    应该是:“劳烦博主,有空就多多地写”。

  37. beyond0071说道:

    想起了刘慈欣的《黑暗森林》
    猜疑链和技术爆炸。。。。。。。。

  38. Deng2说道:

    奥卡姆剃刀,写得好!!!继续加油!!!

  39. radiogalaxy说道:

    三次握手,好熟悉的MAC层协议!那个红蓝军的例子是个计算机网络的经典例子,想要深入了解的松鼠请看:Computer Networks ——Andrew S Tanenbaum 4th edition

  40. taotao说道:

    三次握手协议里面这个红军团的故事,很早就有了,不是作者原创,这么写没问题么?……

  41. hanxingruo说道:

    解释得很好,一直不明白的问题,现在懂了

  42. Edward说道:

    老师上课时就是给我们讲的这个例子

  43. 高言说道:

    剃刀哥 ,在第二自然段中不是有:“这时黄河可以确认的是,自己和长江的收发信机都是好的,否则的话他收不到长江的回应信号”,然后紧接着就出现了:“这时黄河可以说正事了吗?还不能,虽然长江发出了回应,但他并不能确认自己的发信机和黄河的收信机都是好的”。这矛盾啊
    哥 ,您解释一把吧

  44. 高言说道:

    剃刀哥,您在第二段中有:“这时黄河可以确认的是,自己和长江的收发信机都是好的,否则的话他收不到长江的回应信号”,然后紧接着就有:“这时黄河可以说正事了吗?还不能,虽然长江发出了回应,但他并不能确认自己的发信机和黄河的收信机都是好的”。这个矛盾啊,跪求剃刀哥赐教,实在是没明白

  45. workdoctor说道:

    好文 不过我最讨厌的就是嵌套 一来两来我的大脑就栈溢出了

  46. togofree说道:

    写的不错。顺便鄙视一下文章最后不经意流露的政治色彩,那是事实上的“对越侵略战争”!

  47. 老友记的例子说道:

    其实还有个更有趣的例子:Friends season 5 episode 14 "The One Where Everyone Finds Out":Rachel& Phoebe 和Monica &Chandler 的那段精彩的 They don't know that we know they know we know........

  48. 魂断香销说道:

    你们忽视了TCP 3-way handshaking还有一个重要的组成,就是sequence number
    其实你可以这样看:
    1.黄河:SYN 长江啊咱们开始对话可以吗?我先initialize一下 -- SEQ:0,ACK:0
    2.长江:SYN,ACK 收到你的SEQ啦!我的SEQ也set为0啦!
    3.黄河:ACK 收到你的SEQ啦!我的正文就用这个SEQ开始哦

    然后黄河开始说正事儿
    SEQ/ACK会随着payload而increase
    这样有丢包或是重发或是错序才会被发现
    so called reliable!

  49. 匿名说道:

    我有些不太明白,就明天早上九点进攻这个事,那个人来来回回在那里跑,来来回回就在说明天早上九点进攻,一次不敢确认,两次不敢确认,来来回回很多次都在说明天九点进攻,为什么还不能确认呢?

  50. 匿名说道:

    我有些不太明白,就明天早上九点进攻这个事,那个人来来回回在那里跑,来来回回就在说明天早上九点进攻,一次不敢确认,两次不敢确认,来来回回很多次都在说明天九点进攻,为什么还不能确认呢?
    即使在之后中有一次传信员被虏了,双方也能保证在之前某一次中是接受到明天九点进攻的消息的。

Leave a Reply