1. TCP的三次握手最主要是防止已过期的连接再次传到被连接的主机。
如果采用两次的话,会出现下面这种情况。
比如是A机要连到B机,结果发送的连接信息由于某种原因没有到达B机;
于是,A机又发了一次,结果这次B收到了,于是就发信息回来,两机就连接。
传完东西后,断开。
结果这时候,原先没有到达的连接信息突然又传到了B机,于是B机发信息给A,然后B机就以为和A连上了,这个时候B机就在等待A传东西过去。
2. 三次握手改成仅需要两次握手,死锁是可能发生
考虑计算机A和B之间的通信,假定B给A发送一个连接请求分组,A收到了这个分组,并发送了确认应答分组。按照两次握手的协定,A认为连接已经成功地建立了,可以开始发送数据分组。可是,B在A的应答分组在传输中被丢失的情况下,将不知道A是否已准备好,不知道A建议什么样的序列号,B甚至怀疑A是否收到自己的连接请求分组。在这种情况下,B认为连接还未建立成功,将忽略A发来的任何数据分组,只等待连接确认应答分组。而A在发出的分组超时后,重复发送同样的分组。这样就形成了死锁
第三次握手——革命斗争中的通信故事
在革命战争影片中,经常会看到英勇的解放军战士背着步话机在喊“长江长江,我是黄河,听到请回答。”很明显,这是呼号为黄河的一方想找呼号为长江的另一方说事,为了保证影片的节奏,导演往往把后面的联络过程省略了,其实后面还有两步,长江听到黄河的呼叫后要回答“黄河黄河,我是长江,我听到了你,请回答。”这叫做第二次握手。黄河听到长江的呼叫后还要回答“长江长江,我是黄河,我听到了你,现在请你收报”,这是第三次握手,三次握手成功后,才能在电台里传送工作报文。为什么必须三次握手后才能工作呢?听我慢慢道来。
《英雄儿女》 第一次握手:黄河发起呼叫,长江收到了。这时长江可以确认的是,黄河的发信机和自己的收信机是好的,否则的话他收不到黄河的呼叫;黄河能确认什么呢?他什么也不能确认,有可能自己的电台除了指示灯是好的,其它都是坏的,他在对着一台铁疙瘩发功。 第二次握手:长江回应,黄河收到了。这时黄河可以确认的是,自己和长江的收发信机都是好的,否则的话他收不到长江的回应信号。这时黄河可以说正事了吗?还不能,虽然长江发出了回应,但他并不能确认自己的发信机和黄河的收信机都是好的。 第三次握手:黄河对长江的回应进行回应。这时黄河很清楚,双方收发信机都是好的,自己的这次回应长江肯定能收到,这个回应的目的只是消除长江对黄河的收信机和长江自己的发信机的担心。然后,黄河不必等长江的再次回应就可以说正事了。 有些读者看到这里,心里会想“且慢,你凭什么说第三次握手后,长江肯定会收到?长江刚才的状态好,不代表后来的状态好,俗话说人算不如天算,我看再多握几次手会更可靠些。”这种想法有道理,几句话还真说不清,那么不妨先讲一个与此有关的战斗小故事。 战场态势是这样的: 驻扎在两个山头上的红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份报文,该部全部收到,并按指示顺利地完成了任务,该电台台长因此荣立了二等功。 |