经常有人会问tcp建立连接时为什么要三次握手,两次行不行呢?不行,那可能会死人的,不信我讲个故事。
北宋末年,统治阶级奢靡腐败,苛捐杂税压得人们喘不过气来。一时间盗贼四起,纷纷占山为王。盗贼们时不时打家劫舍,骚扰村民,连官府都不敢轻举妄动。
后来上任了一位较有作为的县官,不忍看到百姓受苦,决心围剿盗贼。但是盗贼在山头,易守难攻,他们决定兵分两路,分为东边军和西边军,从东边和西边夹击盗贼,一举拿下匪巢。
可是山头太大了,县武装力量也不是太强,必须做到东边军和西边军两边同时进攻才有很大胜算,任何一方贸然进攻都会有全军覆没的危险。可是如何让驻扎在山头东边和西边的军队同时进攻呢?
这时军中一名高个小将杜乾说道,“这还不容易,到了某个时刻,让东头发一封飞鸽传书给西头,告知他们,东头已经准备好了,要发起进攻请求。大约半个时辰后,东头就可以发起进攻。”
另一名矮胖小将王颖急忙道,“你怎么知道这封请求进攻的飞鸽传书会安全到达西头,万一途中飞鸽迷路了或被贼寇拦截了怎么办,又或者安全达到,但是西头军队压根还没有准备好进攻,总之单方面发起进攻会失败的。”
杜乾眨了眨眼,又说道,“那就等到西头给东头的确认信之后再发起进攻,不等到西头的确认信绝不发起进攻。”
矮胖小将王颖,顿了顿,又道,“如此,东头军队是准备好进攻了,西头军队却未必敢发起进攻。”
杜乾一脸疑惑:”为何?“
此时军师吴亮摇着鹅毛扇,哈哈大笑道,“这位王颖将军果然心思缜密。东头发起飞鸽传书,告知西头一切准备就绪,可以发起进攻了。如果东头收到了西头的回复,东头发起了进攻,西头正好一起响应,准能打得贼寇落花流水。万一西头的回复信丢失,东头的军队等不到西头的回复,不知道是请求信根本没有送达到西头,还是送达到了西头后,西头给他们的回复信在路上丢失了,总之他们是不会单方面发起进攻的。而西头军队对他们的回复信是否安全到达东头,他们是不知道的。如果真的不幸丢失了,西头单方面发起了进攻,而东头又不知道,岂不失败了。所以他们怎敢轻举妄动呢?”
大家听后,纷纷对军师点头赞同。那杜乾又道,“究竟如何能让西头放心地发起进攻,确保万无一失?”
军师吴亮又接着说,“收到西头回复信之后,可以再写一封确认信知会西头那边。西头收到这封确认的确认信之后,就知道东头已经知道西头作好进攻准备了。这时候西头就可以放心发起进攻了。”
“是否需要再次收到西头的信,东头才发起进攻呢?” 杜乾又说道。
只见王颖微微一笑,说道,“这个担心是多余的了。西头第二次收到东头的消息,证明东头也已经知道西头那边准备好了,而东头是主动发起进攻请求的,肯定是准备好了的。也就是说,东头准备好了,西头知道东头准备好了,最重要的是西头也知道东头知道西头准备好了,所以双方可以放心发起进攻了。” 如下图所示:
军师会心的点了点头,说道,“如此,你们开始部署吧,誓要做到夹击成功,则贼寇可破矣。”
故事讲完了。可是TCP三次握手和上面的故事有区别:TCP发起建立连接的一方不会一直等待对方的回复,如果超时,他再次发起这个请求直至放弃,然后释放资源。假设最后一次的请求送达到了对方B,而此时请求方A已经释放连接,而B是不知道的。本来这是一个早已失效的报文段。但B收到此失效的连接请求报文段后,就误认为A发出了一次新的连接请求。于是又向A发出确认报文段,同意建立连接。假定不采用三次握手,那么只要B发出确认,新的连接就建立了。 由于现在A已经释放连接,因此不会理会B的确认,也不会向B发送数据。 但B却以为新的运输连接已经建立了,并一直等待A发来数据。 B的许多资源就这样浪费了。采用三次握手的方法可以防止上述异常现象的发生。
喜欢本文的朋友们,欢迎长按下图关注订阅漫话互联网技术,收看更多精彩内容
网友评论