【计算机网络】彻底搞懂TCP 的三次握手和四次挥手(超详细,带案例,带图解,带面试题)

在计算机网络中,TCP(传输控制协议)是一种可靠、有序的数据传输协议。TCP 使用三次握手建立连接,四次挥手关闭连接。理解这两个过程对于网络编程和网络协议非常重要。本文将通过详细的文字解析和生动的图示,帮助你彻底搞懂 TCP 的三次握手和四次挥手。


🧑 博主简介:现任阿里巴巴嵌入式技术专家,15年工作经验,深耕嵌入式+人工智能领域,精通嵌入式领域开发、技术管理、简历招聘面试。CSDN优质创作者,提供产品测评、学习辅导、简历面试辅导、毕设辅导、项目开发、C/C++/Java/Python/Linux/AI等方面的服务,如有需要请站内私信或者联系任意文章底部的的VX名片(ID:gylzbk

💬 博主粉丝群介绍:① 群内初中生、高中生、本科生、研究生、博士生遍布,可互相学习,交流困惑。② 热榜top10的常客也在群里,也有数不清的万粉大佬,可以交流写作技巧,上榜经验,涨粉秘籍。③ 群内也有职场精英,大厂大佬,可交流技术、面试、找工作的经验。④ 进群免费赠送写作秘籍一份,助你由写作小白晋升为创作大佬。⑤ 进群赠送CSDN评论防封脚本,送真活跃粉丝,助你提升文章热度。有兴趣的加文末联系方式,备注自己的CSDN昵称,拉你进群,互相学习共同进步。

在这里插入图片描述

在这里插入图片描述

🔄 1. TCP 三次握手详解

TCP 的三次握手是用来建立客户端和服务器之间的 TCP 连接的,确保双方具备收发数据的能力。让我们通过详细的步骤解析和图示来理解这个过程。

📋 1.1 三次握手步骤

  1. 第一次握手:客户端向服务器发送 SYN 报文,表示请求建立连接,并发送初始序列号 Seq=x。
  2. 第二次握手:服务器接收到 SYN 报文,回复 SYN-ACK 报文,表示同意建立连接,并确认客户端的序列号 Seq=y,同时发送 Ack=x+1。
  3. 第三次握手:客户端接收到 SYN-ACK 报文,回复 ACK 报文,确认服务器的序列号 Ack=y+1,连接建立。

🖼️ 1.2 TCP 三次握手过程图解

客户端(Client)                      服务器(Server)
    |                                   |
    | --------- SYN, Seq=x -------->    |  第一次握手 (Client --> Server)
    |                                   |
    | <----- SYN-ACK, Seq=y, Ack=x+1 ---|  第二次握手 (Server --> Client)
    |                                   |
    | -------- ACK, Ack=y+1 -------->   |  第三次握手 (Client --> Server)
    |                                   |
连接建立成功
Client Server SYN, Seq=x SYN-ACK, Seq=y, Ack=x+1 ACK, Ack=y+1 Client Server

📘 1.3 关键点

  • 序列号(Sequence Number):用于保证数据包的有序传输。
  • 确认号(Acknowledgment Number):用于确认收到的数据包。
  • SYN 标志:同步序列号,用于建立连接。
  • ACK 标志:确认序列号,用于确认收到的数据包。

⏹️ 2. TCP 四次挥手详解

TCP 的四次挥手是用来释放客户端和服务器之间的 TCP 连接的,确保数据的完整传输和连接的有序关闭。让我们通过详细的步骤解析和图示来理解这个过程。

📋 2.1 四次挥手步骤

  1. 第一次挥手:客户端发送 FIN 报文,表示不再发送数据,准备关闭连接,Seq=u。
  2. 第二次挥手:服务器接收到 FIN 报文,回复 ACK 报文,确认收到客户端的关闭请求,Ack=u+1,进入 CLOSE-WAIT 状态。
  3. 第三次挥手:服务器在发送完所有数据后,发送 FIN 报文给客户端,表示服务器也准备关闭连接,Seq=v。
  4. 第四次挥手:客户端接收到服务器的 FIN 报文,回复 ACK 报文,确认服务器的关闭请求,Ack=v+1,进入 TIME-WAIT 状态,等待一定时间后关闭连接。

🖼️ 2.2 TCP 四次挥手过程图解

客户端(Client)                      服务器(Server)
    |                                   |
    | -------- FIN, Seq=u -------->     |  第一次挥手 (Client --> Server)
    |                                   |
    | <-------- ACK, Ack=u+1 ---------  |  第二次挥手 (Server --> Client)
    |                                   |
    |                                   |  服务器发送完所有数据
    |                                   |
    | <-------- FIN, Seq=v ----------   |  第三次挥手 (Server --> Client)
    |                                   |
    | -------- ACK, Ack=v+1 -------->   |  第四次挥手 (Client --> Server)
    |                                   |
客户端进入 TIME-WAIT 状态
Client Server FIN, Seq=u ACK, Ack=u+1 FIN, Seq=v ACK, Ack=v+1 Client Server

📘 2.3 关键点

  • FIN 标志:表示没有数据要发送了,请求关闭连接。
  • ACK 标志:确认收到的 FIN 报文。
  • CLOSE-WAIT:服务器等待关闭连接。
  • TIME-WAIT:客户端等待一段时间后关闭连接。

💼 3. 常见面试题

3.1 为什么建立TCP连接需要三次握手,而不是两次?

答案
三次握手是为了确保双方都具备收发数据的能力,并且能够确认彼此的序列号。具体来说:

  1. 第一次握手:客户端发送 SYN 报文给服务器,表示请求建立连接,并发送初始序列号 Seq=x。这时,客户端进入 SYN-SENT 状态。
  2. 第二次握手:服务器接收到 SYN 报文,回复 SYN-ACK 报文,表示同意建立连接,并确认客户端的序列号 Seq=y,同时发送 Ack=x+1。这时,服务器进入 SYN-RECEIVED 状态。
  3. 第三次握手:客户端接收到 SYN-ACK 报文,回复 ACK 报文,确认服务器的序列号 Ack=y+1,进入 ESTABLISHED 状态。服务器收到 ACK 之后,也进入 ESTABLISHED 状态,连接建立。

如果只有两次握手,无法保证客户端和服务器双方都能正常收发数据,有可能导致连接不可靠。

3.2 为什么关闭TCP连接需要四次挥手,而不是三次?

答案
在 TCP 连接中关闭连接需要四次挥手,因为 TCP 是全双工通信协议,需要双方都确认可以关闭连接。具体来说:

  1. 第一次挥手:客户端发送 FIN 报文,表示不再发送数据,准备关闭连接。
  2. 第二次挥手:服务器接收到 FIN 报文,回复 ACK 报文,确认收到客户端的关闭请求,进入 CLOSE-WAIT 状态。
  3. 第三次挥手:服务器在发送完所有数据后,发送 FIN 报文给客户端,表示服务器也准备关闭连接。
  4. 第四次挥手:客户端接收到服务器的 FIN 报文,回复 ACK 报文,确认服务器的关闭请求,进入 TIME-WAIT 状态,等待一定时间后关闭连接。

客户端和服务器需要分别进行两次挥手来保证双方都确认可以安全地关闭连接,从而确保数据传输的完整性和有序性。

3.3 为什么在第四次挥手之后,客户端需要进入 TIME-WAIT 状态,并等待2MSL 时间?

答案
TIME-WAIT 状态的作用是确保 TCP 的全双工关闭过程完全可靠。主要原因如下:

  1. 确保最后的 ACK 能被接收:客户端在发送最后一个 ACK 后,如果服务器没有接收到,就会重发 FIN 报文。如果客户端没有 TIME-WAIT 状态,撤销连接后再收到重发的 FIN,客户端无法正确识别并处理。
  2. 确保旧连接的数据包不会干扰新连接:等待2MSL时间,确保旧连接中的所有重复数据包都已过期,从而避免新连接收到旧连接中的数据包。

MSL (Maximum Segment Lifetime) 是指一个 TCP 报文段在网络中的最长存活时间。等待2MSL时间,可以确保本连接中的所有报文都已从网络中消失,从而避免干扰新连接。

3.4 什么是 SYN 洪泛攻击?如何防范这种攻击?

答案
SYN 洪泛攻击是一种常见的DDoS(分布式拒绝服务)攻击类型,利用了TCP 三次握手过程。攻击者发送大量的SYN请求,但不回复SYN-ACK,导致服务器资源耗尽,无法处理正常请求。

  • 攻击步骤
    1. 攻击者发送大量伪造的SYN报文,并且IP地址是伪造的。
    2. 服务器回复SYN-ACK,但由于IP地址是伪造的,无法收到第三次ACK,连接处于半开状态。
    3. 服务器保留了大量处于半开状态的连接,占用大量资源,导致无法处理正常请求。

防范措施

  • SYN Cookie:在服务器资源紧张(例如Half-open连接数达到阈值)时,服务器不立即分配资源,而是通过一个临时的SYN Cookie验证真正请求方在第三次握手的合法性。
  • 调整SYN Queue大小:增加TCP连接请求队列的大小,以容纳更多半开连接。
  • 缩短SYN-RECEIVED超时时间:加速处理半开连接,使得服务器能够更快地释放资源。
  • 使用防火墙和IDS/IPS设备:配置防火墙和入侵检测/防御系统,检测和过滤异常的SYN请求。

题外话:面试中,如何深入扩展自己的回答,让自己展示的更加专业?

回答方向:

  1. 描述具体的包头结构:在解释三次握手和四次挥手时,可以补充每个报文中的TCP包头字段,比如SYN、ACK的位标志,序列号和确认号等。
  2. 详细说明各个状态的含义:比如ESTABLISHED、SYN-SENT、SYN-RECEIVED、FIN-WAIT-1、FIN-WAIT-2、CLOSE-WAIT、TIME-WAIT等状态的具体含义和作用。
  3. 结合实际应用场景:比如讲述在大型分布式系统中,如何处理大量的TCP连接请求,如何通过负载均衡和连接池优化资源管理。
  4. 防范措施和优化策略:结合常见的攻击手段,讲解防范SYN洪泛攻击的措施,以及优化TCP连接性能的策略。

🌐 4. 总结

通过这些常见面试题及其详解,希望你对TCP的三次握手和四次挥手有更加深刻的理解,并能在面试中自信从容地回答相关问题。也希望这些问题能够帮助你在准备面试时,进行更有针对性的复习。

TCP 的三次握手和四次挥手是网络通信中至关重要的过程。了解它们有助于开发可靠且高效的网络应用程序。通过图解和详细步骤解析,相信你已经掌握了这两个过程的细节,希望这篇文章能够解答你在学习 TCP 三次握手和四次挥手过程中的疑惑。

  • 19
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

I'mAlex

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值