1. 为什么要三次握手
先简单介绍一下三次握手的过程
(1)客户端向服务器端发送一个SYN置位的报文,并进入SYN_SEND状态,等待服务器确认;
(2)服务器发出段2,也带有SYN位,同时ACK置位表示确认,此时服务器进入SYN_RECV状态;
(3)客户端收到服务器端的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),对服务器的连接请求进行应答,完成三次握手。
为什么要三次握手为什么不能是两次握手?
在数据传输过程中,ACK和确认序号非常重要,应用程序交给TCP协议发送的数据会暂时
存在TCP层的发送缓冲区中,只有收到对方应答的ACK段才知道该数据包确实发到了对方,可以从发送缓冲区中释放掉。
考虑计算机A和B之间的通信,假定B给A发送一个连接请求分组,A收到了这个分组,并发送了确认应答分组。如果是两次握手,A认为已经和B成功建立连接,可以开始发送数据。可是,如果A的确认应答分组在传输中如果丢失,B将不知道A是否准备好,甚至怀疑A是否受到自己的连接请求分组,这种情况下,B认为连接还未建立成功,将忽略A发来的任何数据,只等待连接确认应答分组,而A在发出的分组超时后,重复发送同样的分组,这就形成了死锁。
2. 为什么要四次挥手
四次挥手的过程
(1)客户端发送一个FIN,表示关闭连接的请求;
(2)服务器收到FIN后,向客户端发送确认包ACK,应答客户端的关闭连接请求;
(3)服务器发送FIN,向客户端发送关闭连接请求;
(4)客户端收到FIN后,发回ACK报文确认,应答服务器的关闭连接请求。
关闭连接通常需要4个段,服务器的应答和关闭连接请求通常不合并在一个段中,因为有连接半关闭的情况,这种情况下客户端关闭连接后就不能在再发送数据给服务器了,但是服务器还可以发送数据给客户端,直到服务器也关闭连接为止。
TCP连接是全双工的,因此每个方向都必须进行单独关闭,而且每一次发送关闭连接请求都必须得到确认。
3. 主动断开链接的一方为什么要进入TIME_WAIT状态
为了保证客户端发送的最后一个ACK报文能够到达服务器
断开时,如果客户端向服务器发送的最后一次ACK报文丢失了,服务器会重发它发送的FIN,接着客户端再重传一次确认,重新启动时间等待计时器,最后客户端和服务器端都能正常关闭。假设客户端不等待,而是在发送完ACK后直接释放关闭,一旦ACK丢失,服务器无法进入正常的关闭连接状态。而客户端等待的这个状态称之为TIME_WAIT状态。