TCP为什么要三次握手

经常有人会问tcp建立连接时为什么要三次握手,两次行不行呢?不行,那可能会死人的,不信我讲个故事。

北宋末年,统治阶级奢靡腐败,苛捐杂税压得人们喘不过气来。一时间盗贼四起,纷纷占山为王。盗贼们时不时打家劫舍,骚扰村民,连官府都不敢轻举妄动。

后来上任了一位较有作为的县官,不忍看到百姓受苦,决心围剿盗贼。但是盗贼在山头,易守难攻,他们决定兵分两路,分为东边军和西边军,从东边和西边夹击盗贼,一举拿下匪巢。

可是山头太大了,县武装力量也不是太强,必须做到东边军和西边军两边同时进攻才有很大胜算,任何一方贸然进攻都会有全军覆没的危险。可是如何让驻扎在山头东边和西边的军队同时进攻呢?

这时军中一名高个小将杜乾说道,“这还不容易,到了某个时刻,让东头发一封飞鸽传书给西头,告知他们,东头已经准备好了,要发起进攻请求。大约半个时辰后,东头就可以发起进攻。”

另一名矮胖小将王颖急忙道,“你怎么知道这封请求进攻的飞鸽传书会安全到达西头,万一途中飞鸽迷路了或被贼寇拦截了怎么办,又或者安全达到,但是西头军队压根还没有准备好进攻,总之单方面发起进攻会失败的。”

杜乾眨了眨眼,又说道,“那就等到西头给东头的确认信之后再发起进攻,不等到西头的确认信绝不发起进攻。”

矮胖小将王颖,顿了顿,又道,“如此,东头军队是准备好进攻了,西头军队却未必敢发起进攻。”

杜乾一脸疑惑:”为何?“

此时军师吴亮摇着鹅毛扇,哈哈大笑道,“这位王颖将军果然心思缜密。东头发起飞鸽传书,告知西头一切准备就绪,可以发起进攻了。如果东头收到了西头的回复,东头发起了进攻,西头正好一起响应,准能打得贼寇落花流水。万一西头的回复信丢失,东头的军队等不到西头的回复,不知道是请求信根本没有送达到西头,还是送达到了西头后,西头给他们的回复信在路上丢失了,总之他们是不会单方面发起进攻的。而西头军队对他们的回复信是否安全到达东头,他们是不知道的。如果真的不幸丢失了,西头单方面发起了进攻,而东头又不知道,岂不失败了。所以他们怎敢轻举妄动呢?”

大家听后,纷纷对军师点头赞同。那杜乾又道,“究竟如何能让西头放心地发起进攻,确保万无一失?”

军师吴亮又接着说,“收到西头回复信之后,可以再写一封确认信知会西头那边。西头收到这封确认的确认信之后,就知道东头已经知道西头作好进攻准备了。这时候西头就可以放心发起进攻了。”

“是否需要再次收到西头的信,东头才发起进攻呢?” 杜乾又说道。

只见王颖微微一笑,说道,“这个担心是多余的了。西头第二次收到东头的消息,证明东头也已经知道西头那边准备好了,而东头是主动发起进攻请求的,肯定是准备好了的。也就是说,东头准备好了,西头知道东头准备好了,最重要的是西头也知道东头知道西头准备好了所以双方可以放心发起进攻了。” 如下图所示:

TCP为什么要三次握手_第1张图片

军师会心的点了点头,说道,“如此,你们开始部署吧,誓要做到夹击成功,则贼寇可破矣。”

故事讲完了。可是TCP三次握手和上面的故事有区别:TCP发起建立连接的一方不会一直等待对方的回复,如果超时,他再次发起这个请求直至放弃,然后释放资源。假设最后一次的请求送达到了对方B,而此时请求方A已经释放连接,而B是不知道的。本来这是一个早已失效的报文段。但B收到此失效的连接请求报文段后,就误认为A发出了一次新的连接请求。于是又向A发出确认报文段,同意建立连接。假定不采用三次握手,那么只要B发出确认,新的连接就建立了。 由于现在A已经释放连接,因此不会理会B的确认,也不会向B发送数据。 但B却以为新的运输连接已经建立了,并一直等待A发来数据。 B的许多资源就这样浪费了。采用三次握手的方法可以防止上述异常现象的发生。

 

欢迎加入QQ群 858791125 讨论skynet,游戏后台开发,lua脚本语言等问题。

 

你可能感兴趣的:(白话经典算法,linux网络编程,网络编程)