我们都晓得tcp协议须要三次握手,那为何不是两次握手呢,关于这个疑问我查了许多材料,看到许多的诠释,现归结总结以下,轻易我们明白影象
假如是两次握手,我们一起来看看下面两种场景
1.形成资本糟蹋
- Client向Server发送了一个a1的包
假如这时候由于传输链路上碰到毛病,致使a1传输到Server的时候迥殊长 假定1min
在这一分钟的时候内,由于Client没有收到Server关于a1包的确认,Client会以为上一个包发送丢了或许失利
那末Client会再发送一个a2的包
- Client又向Server发送了一个a2的包
此次Server一般收到
- 因而Server向Client发送了一个b2的确认包
- Client和Server竖立链接
而随后滞后的a1包传到了Server,Server又会返回b1包确认
然则由于Client已清除了a1包,所以Client会抛弃掉这个包,然则Server又会坚持这个相当于“僵尸”的衔接
如许就会形成白白糟蹋资本
在谢希仁著《计算机收集》第四版中讲“三次握手”的目标是“为了防备已失效的衔接要求报文段又倏忽传送到服务器,由于发生毛病”
在另一部典范的《计算机收集》(AndrewS.Tanenbaum著,第四版)一书中讲“三次握手”的目标是为了处理“收集中存在耽误的反复分组”的题目。
我们会发明这两种差别的表述实在说明的是同一个题目。
2.死锁可能发生
- Client向Server发送了一个衔接要求分组
- Server收到这个分组,并发送了确认应对分组
根据两次握手的协议,Server以为已胜利的竖立衔接,能够最先发送数据分组
而此时Server的应对分组传输丧失了,Client不晓得Server是不是已准备好,不晓得Server竖立什么样的序列号
Client以至疑心Server是不是收到了本身的衔接要求分组,在这类状况下,Client以为衔接还未竖立胜利,将疏忽Server发来的任何数据要求,只守候衔接确认影带分组。而Server在发出的分组超时后,反复发送一样的分组,资本就形成了死锁。
而上面两种状况,假如运用三次握手就能够胜利防止,三次握手完成的两个主要功用
- 既要两边做好发送数据的准备工作(两边都晓得相互已准备好)
- 许可两边就初始序列号举行协商,这个序列号在握手历程中被发送和确认