当前位置: 首页 > 科技观察

六张图带你明白为什么TCP是三次握手,而不是两次、四次?

时间:2023-03-13 02:55:20 科技观察

1三次握手2二次握手(case1)3二次握手(case2)好了,我们认真回答这个问题。要理解这个问题,首先要理解TCP是如何保证可靠传输的。PS:在TCP协议中,主动发起请求的一端称为“客户端”,被动连接的一端称为“服务器”。不管是客户端还是服务端,建立TCP连接后就可以收发数据了。最初,服务器和客户端都处于CLOSED状态。在开始通信之前,双方必须创建自己的传输控制块(TCB)。服务器创建好TCB后,进入LISTEN状态,准备接收客户端的连接请求。对于第一次握手,客户端向服务器发送一个连接请求段。在报文段的头部,SYN=1,ACK=0,seq=x。请求发送后,客户端进入SYN-SENT状态。PS1:SYN=1,ACK=0表示该报文段为连接请求报文。PS2:x是本次TCP通信的字节流的起始序号。TCP规定SYN=1的报文段不能有数据部分,但必须消耗一个序号。第二次握手服务器收到连接请求报文后,如果同意连接,则发送响应:SYN=1,ACK=1,seq=y,ack=x+1。响应发送后,进入SYN-RCVD状态。PS1:SYN=1,ACK=1表示该报文段是连接同意的响应报文。PS2:seq=y表示服务器作为发送方发送的字节流的初始序号。PS3:ack=x+1表示服务器期望下一个数据报从x+1开始发送字节。第三次握手后,客户端在收到连接认可响应时,也会向服务器发送确认报文段,表示已成功收到服务器的连接认可响应。报文段的头部为:ACK=1,seq=x+1,ack=y+1。客户端发送完这个报文段后,进入ESTABLISHED状态,服务端收到这个响应后也进入ESTABLISHED状态,此时连接建立!4为什么连接建立需要三次握手而不是两次握手?防止服务器接收到无效的连接请求段,从而导致错误。PS:Invalidconnectionrequest:如果客户端向服务端发送的连接请求丢失,客户端会等待响应超时后重新发送连接请求。此时,最后的连接请求是“无效的”。如果建立连接只需要两次握手,客户端变化不大,进入ESTABLISHED状态前仍然需要得到服务器的响应,服务器收到连接请求后进入ESTABLISHED状态。此时如果网络拥塞,客户端发送的连接请求无法到达服务器,客户端会在超时后重新发送请求。如果服务器正确接收并确认响应,双方将开始通信并在通信结束后释放连接。此时如果无效连接请求到达服务器,由于只有两次握手,服务器收到请求后会进入ESTABLISHED状态,等待发送数据或者主动发送数据。但是此时客户端已经进入了CLOSED状态,服务端会一直等待下去,浪费了服务端的连接资源。5TCP四次挥手TCP连接的释放一共需要四步,故称为“四次挥手”。我们知道TCP连接是双向的,所以在四次挥手中,前两次挥手用于断开一个方向的连接,后两次挥手用于断开另一个方向的连接。如果A认为第一波数据传输完成,需要向B发送连接释放请求,该请求只有一个消息头,头中携带的主要参数为:FIN=1,seq=u.此时A会进入FIN-WAIT-1状态。PS1:FIN=1表示该段是连接释放请求。PS2:seq=u,u-1是A发送给B的最后一个字节的序号,B收到第二波连接释放请求后,会通知对应的应用,告诉它A到B的连接已经建立已被释放。此时B进入CLOSE-WAIT状态,向A发送连接释放响应,其头部包含:ACK=1,seq=v,ack=u+1。PS1:ACK=1:除TCP连接请求段外,TCP通信过程中所有数据报的ACK均为1,表示响应。PS2:seq=v,v-1是B发送给A的最后一个字节的序号。PS3:ack=u+1表示期望收到从第u+1个字节开始的报文段,而前u个字节已成功接收。A收到响应,进入FIN-WAIT-2状态,等待B发送连接释放请求。第二次挥手完成后,A到B的连接已经释放,B不再接收数据,A也不再发送数据。但是B到A的连接仍然存在,B可以继续向A发送数据。第三次挥手后,B将所有数据发送给A后,向A发送连接释放请求,请求头:FIN=1,ACK=1,seq=w,ack=u+1。B进入LAST-ACK状态。第四次挥手后,A收到释放请求,向B发送确认响应,此时A进入TIME-WAIT状态。该状态将持续2MSL时间。如果B在这段时间内没有重传请求,则进入CLOSED状态,取消TCB。B收到确认响应后,进入CLOSED状态,取消TCB。6为什么A先进入TIME-WAIT状态,等待2MSL后再进入CLOSED状态,保证B能收到A的确认响应。如果A发送确认响应后直接进入CLOSED状态,那么如果响应丢失,B会等待超时后重新发送连接释放请求,但是此时A已经关闭,不会做任何响应,所以B永远无法正常关闭。