为什么是三次握手,两次or四次为什么不行?
两次握手:客户端发,服务收到后发,两方即可建立连接
存在的问题:这个过程确认了客户端发送能力正常,服务端发送,接受能力正常,但是没能确认客户端的接收能力是否正常
三次握手
目的一(有争议):防止已失效的连接请求又传送到服务器端,因而产生错误
若建立连接只需两次握手,客户端并没有太大的变化,仍然需要获得服务端的应答后才进入ESTABLISHED状态,而服务端在收到连接请求后就进入ESTABLISHED状态。此时如果网络拥塞,客户端发送的连接请求迟迟到不了服务端,客户端便超时重发请求,如果服务端正确接收并确认应答,双方便开始通信,通信结束后释放连接。此时,如果那个失效的连接请求抵达了服务端,由于只有两次握手,服务端收到请求就会进入ESTABLISHED状态,等待发送数据或主动发送数据。但此时的客户端早已进入CLOSED状态,服务端将会一直等待下去,这样浪费服务端连接资源。
目的二:(38条消息) TCP 为什么三次握手而不是两次握手(正解版)_tcp三次握手为什么不能两次_贺二公子的博客-CSDN博客
- 为了实现可靠数据传输, TCP 协议的通信双方, 都必须维护一个序列号, 以标识发送出去的数据包中, 哪些是已经被对方收到的。三次握手的过程即是通信双方相互告知序列号起始值, 并确认对方已经收到了序列号起始值的必经步骤
- 如果只是两次握手,至多只有连接发起方的起始序列号能被确认, 另一方选择的序列号则得不到确认
为什么 A 要先进入TIME-WAIT状态,等待2MSL时间后才进入CLOSED状态
为了保证B能收到A的确认应答。若A发完确认应答后直接进入CLOSED状态,那么如果该应答丢失,B等待超时后就会重新发送连接释放请求,但此时A已经关闭了,不会作出任何响应,因此B永远无法正常关闭。
为什么是四次挥手,三次是否可以?
因为 TCP 是全双工通信,由于TCP的半关闭(half-close)特性,TCP提供了连接的一端在结束它的发送后还能接收来自另—端数据的能力。
任何一方都可以在数据传送结束后发出连接释放的通知,待对方确认后进入半关闭状态。当另一方也没有数据再发送的时候,则发出连接释放通知,对方确认后就完全关闭了TCP连接
第一次挥手 : 主动方 发送断开连接的请求(FIN 报文)给被动方, 仅仅代表 主动方不会发送 数据报文了,但仍然可以接受数据报文。
第二次挥手: 被动方可能还有一些数据报文需要发送,因此会先发送 ACK 报文,告知 主动方 “我知道了你不想发送数据了”。这样主动方 便不会因为没有收到应答 而继续向被动方继续发送断开连接的请求(FIN 报文)。
第三次挥手: 被动方处理完数据报文后,便主动发送 FIN 报文;(这样可以保证数据通信正常可靠的完成), 被动方进入 LAST_ACK 阶段(超时等待)。
第四次挥手: 如果主动方及时发送 ACK 报文 进行 连接中断的确认,这是被动方就直接释放连接,进入可用状态。