当前位置: 首页 > Web前端 > HTML

为什么tcp协议是三次握手而不是二次握手?

时间:2023-04-03 01:05:26 HTML

我们都知道tcp协议需要三次握手,那为什么不用两次握手呢?这个问题查了很多资料,看了很多解释。总结如下,方便大家理解和记忆,如果是两次握手,我们来看看下面两种场景:1.资源浪费。客户端向服务器发送a1数据包。如果传输链路出现故障,a1需要很长时间才能传输到服务器。假设这一分钟是1min。由于客户端还没有收到服务端对a1包的确认,客户端会认为之前的包丢失或者失败了,然后客户端再发送一个a2包。client再发一个a2包给server,server正常收到后,server再发一个b2确认包给client。客户端与服务器建立链接,然后将延迟的a1包发送给服务器,服务器会返回b1包进行确认,但是由于客户端已经清除了a1包,所以客户端会丢弃这个包,但是Server会维护这个相当于“僵尸”的连接,会造成资源的浪费。段突然因为错误再次发送到服务器。”在另一个经典的《计算机网络》(AndrewS.Tanenbaum,第4版)中,“三次握手”的目的是解决“延迟重复在网络。grouping”的问题。我们会发现,这两种不同的表达方式其实说明的是同一个问题。2.可能会出现死锁,Client向Server发送一个连接请求包,Server接收到这个包并发送一个确认响应包。根据两种方式握手协议,Server认为连接建立成功,可以开始发送数据包,此时Server的响应包传输丢失,client不知道server是否准备好,server建立的序号是多少,客户端甚至怀疑服务器是否收到了自己的连接请求包。如果建立成功,服务器发送的任何数据请求都将被忽略,只等待连接确认视频包。但是,发送包后超时,服务器重复发送相同的数据包,资源形成死锁。如果使用三次握手,可以成功避免以上两种情况。三次握手完成的两个重要功能需要双方准备发送数据(双方都知道对方已经准备好了),并让双方协商初始序列号,此序列号在握手期间发送并确认