彻底理解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,表示不再发送数据,但还能接收数据。这要求挥手过程分为两步,先有一方完成发送任务,然后等待对方完成发送,再进行最终的关闭。

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

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

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

相关推荐

07-25 11:26
清华大学 Java
打开电脑,思绪又回到了7月份刚开始的时候,感觉这个月过的如梦如幻,发生了太多事,也算是丰富了我本就是平淡的人生吧太早独立的我习惯了一切都是自己做决定,拥有绝对的决定权,而且永远不会听取别人的建议。我就是那个恋爱四年出轨的男主啦,感觉既然在牛客开了这个头,那我就要做个有始有终的人。从我出轨到结束再到和女朋友和好如初真的太像一场梦了,短短的一个月我经历了太多,也成长了很多,放下了那些本就不属于我的,找回了那些我不该放弃的。我的人生丰富且多彩,但人不能一直顺,上天总会让你的生活中出点乱子,有好有坏,让你学会一些东西,让你有成长。我和女朋友的恋爱四年太过于平淡,日常除了会制造一些小浪漫之外,我们的生活...
段哥亡命职场:不得不说,我是理解你的,你能发出来足见你是个坦诚的人,至少敢于直面自己的内心和过往的过错。 这个世界没有想象中那样非黑即白,无论是农村还是城市,在看不见的阴影里,多的是这样的事。 更多的人选择站在制高点去谩骂,一方面是社会的道德是需要制高点的,另一方面,很多人不经他人苦,却劝他人善。 大部分的我们,连自己生命的意义尚且不能明晰,道德、法律、困境,众多因果交织,人会迷失在其中,只有真的走出来之后才能看明白,可是没走出来的时候呢?谁又能保证自己能走的好,走的对呢? 可是这种问题有些人是遇不到的,不去追寻,不去探寻,也就没了这些烦恼,我总说人生的意义在过程里,没了目标也就没了过程。 限于篇幅,没法完全言明,总之,这世界是个巨大的草台班子,没什么过不去了,勇敢面对,革故鼎新才是正确,祝你早日走出来。查看图片
点赞 评论 收藏
分享
码砖:求职岗位要突出,一眼就能看到,教育背景放到最后,学校经历没那么重要,项目要重点突出
点赞 评论 收藏
分享
评论
6
19
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务