有关TCP三次握手和四次挥手常见面试题

以下是查看博客总结出的:

一.tcp为什么要三次握手?两次不行吗?
答:1、client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。于是就向client发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送ack包。但server却以为新的运输连接已经建立,并一直等待client发来数据。这样server的很多资源就白白浪费掉了。采用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况,client不会向server的确认发出确认。server由于收不到确认,就知道client并没有要求建立连接。主要目的防止server端一直等待,浪费资源。
2、“三次握手”的目的是“为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误”。
3、两次握手可能产生死锁。作为例子,考虑计算机server和client之间的通信,假定client给server发送一个连接请求分组,server收到了这个分组,并发送了确认应答分组。按照两次握手的协定,server认为连接已经成功地建立了,可以开始发送数据分组。可是,client在server的应答分组在传输中被丢失的情况下,将不知道server是否已准备好,不知道server建立什么样的序列号,client甚至怀疑server是否收到自己的连接请求分组。在这种情况下,client认为连接还未建立成功,将忽略server发来的任何数据分组,只等待连接确认应答分组。而S在发出的分组超时后,重复发送同样的分组。这样就形成了死锁。
二.为什么需要四次挥手?
答:那可能有人会有疑问,在tcp连接握手时为何ACK是和SYN一起发送,这里ACK却没有和FIN一起发送呢。原因是因为tcp是全双工模式,接收到FIN时意味将没有数据再发来,但是还是可以继续发送数据。

原文地址:https://www.cnblogs.com/suijie/p/3983638.html