彻底理解TCP三次握手和四次挥手



### 三次握手的原因

1. **防止历史包重放攻击**:如果只有两次握手,服务器无法确认客户端是否真的收到了它的响应。假设有延迟的旧的连接请求到达服务器,服务器误以为是新的连接请求并回复SYN+ACK,而实际上客户端并未请求,这可能导致服务器资源被无效占用。三次握手通过客户端的最终ACK确认,确保了请求的新鲜性和双方的同步。

2. **确保双方都具备发送和接收能力**:第一次握手(客户端发SYN),服务器知道了客户端的发送能力;第二次握手(服务器回SYN+ACK),客户端知道了服务器的接收能力和发送能力;第三次握手(客户端回ACK),服务器确认了客户端的接收能力。这样,双方都确认了对方的发送和接收能力,为数据传输打下了可靠的基础。

### 为什么不采用二次握手

- 二次握手中,客户端发送SYN请求建立连接,服务器回应SYN+ACK,此时服务器认为连接已建立并可能分配资源准备接收数据。但若客户端的SYN请求或服务器的SYN+ACK响应在网络中丢失,将导致一方认为连接已建立而另一方则不然,造成误解和资源浪费。三次握手通过客户端的最后确认,消除了这种不确定性。

### 四次挥手的原因

1. **确保数据完全传输**:四次挥手的第一次,客户端发送FIN表示没有更多数据要发送;第二次,服务器回复ACK确认收到FIN;此时,服务器可能还有数据需要发送给客户端,所以连接不能立即关闭。当服务器完成数据发送后,进行第三次挥手,发送自己的FIN;最后,客户端回复ACK,确认收到服务器的FIN,至此连接彻底关闭。

2. **半关闭状态**:TCP支持半关闭状态,即一方向另一方发送了FIN,表示不再发送数据,但还能接收数据。这要求挥手过程分为两步,先有一方完成发送任务,然后等待对方完成发送,再进行最终的关闭。

### 为什么不采用三次挥手

- 在考虑半关闭的情况下,如果尝试用三次挥手关闭连接,可能会在服务器仍有数据需要发送给客户端时就错误地关闭了连接,导致数据丢失。因此,四次挥手确保了在任何一方准备好关闭连接之前,数据传输可以完全结束,保证了数据的完整性。

总之,三次握手和四次挥手的设计都是为了在复杂多变的网络环境中提供一种可靠且高效的连接管理机制,确保数据的准确无误传输和连接的有序建立与关闭。
全部评论

相关推荐

6 14 评论
分享
牛客网
牛客企业服务