TCP的三次握手与四次挥手

TCP的三次握手与四次挥手


一、引言

TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。在计算机网络中,TCP协议负责在两台计算机之间建立可靠的通信连接。为了保证数据可靠传输,TCP采用了三次握手 来建立连接,采用四次挥手来断开连接。


二、TCP三次握手(连接建立)

1. 目的

  • 确认双方的接收和发送能力:确保客户端和服务器都具备发送和接收数据的能力。
  • 同步初始序列号(Sequence Number):用于后续的数据传输,确保数据顺序和可靠性。

2. 握手过程详解

三次握手涉及客户端(Client)和服务器(Server)之间的三次交互。

步骤一:客户端发送SYN
  • 客户端发送一个带有SYN(Synchronize Sequence Numbers,同步序列号)标志位的TCP报文给服务器。
  • 该报文包含客户端的初始序列号(seq=x)。
  • 此时,客户端进入"SYN_SENT"状态,等待服务器的响应。
步骤二:服务器回复SYN+ACK
  • 服务器接收到客户端的SYN报文后,发送一个同时带有SYN和ACK(Acknowledgment,确认)标志位的TCP报文给客户端。
  • 该报文包含服务器的初始序列号(seq=y)和对客户端的序列号的确认(ack=x+1)。
  • 服务器进入"SYN_RCVD"状态,等待客户端的确认。
步骤三:客户端发送ACK
  • 客户端接收到服务器的SYN+ACK报文后,发送一个带有ACK标志位的TCP报文给服务器。
  • 该报文包含对服务器序列号的确认(ack=y+1)。
  • 客户端进入"ESTABLISHED"状态,连接建立完成。
  • 服务器接收到客户端的ACK报文后,也进入"ESTABLISHED"状态。

3. 三次握手示意图

复制代码
客户端                                 服务器
   | ----------- SYN seq=x ----------> |
   |                                   |
   | <------ SYN seq=y ACK ack=x+1 ----|
   |                                   |
   | ----------- ACK ack=y+1 --------> |
   |                                   |
连接建立完成

4. 为什么需要三次握手

  • 防止历史连接的混淆:三次握手可以防止旧的重复连接初始化导致的混乱。
  • 确保双方的接收和发送能力正常:通过三次交互,确认双方的通信能力正常。

三、TCP四次挥手(连接终止)

1. 目的

  • 有序地关闭双方的连接:确保双方都知道连接正在关闭,且剩余的数据都已正确传输。
  • 释放资源:关闭连接后,双方的TCP连接相关资源可以释放。

2. 挥手过程详解

四次挥手涉及客户端和服务器之间的四次交互。

步骤一:主动关闭方发送FIN
  • 主动关闭连接的一方(假设为客户端)发送一个带有FIN(Finish)标志位的TCP报文,表示不再发送数据,但仍可接受数据。
  • 该报文包含当前的序列号(seq=u)。
  • 客户端进入"FIN_WAIT_1"状态。
步骤二:被动关闭方回复ACK
  • 服务器接收到FIN报文后,发送一个带有ACK标志位的TCP报文,确认已收到FIN。
  • 该报文的确认号为ack=u+1,表示已接受客户端的FIN。
  • 服务器进入"CLOSE_WAIT"状态,客户端收到ACK后,进入"FIN_WAIT_2"状态。
步骤三:被动关闭方发送FIN
  • 服务器在发送完剩余数据后,发送一个带有FIN标志位的TCP报文,表示同意关闭连接。
  • 该报文包含服务器的序列号(seq=v)。
  • 服务器进入"LAST_ACK"状态。
步骤四:主动关闭方回复ACK
  • 客户端接收到服务器的FIN报文后,发送一个带有ACK标志位的TCP报文,确认已收到FIN。
  • 该报文的确认号为ack=v+1。
  • 客户端进入"TIME_WAIT"状态,等待2*MSL(Maximum Segment Lifetime,报文最大生存时间)后,进入"CLOSED"状态。
  • 服务器接收到ACK后,立即进入"CLOSED"状态,连接关闭完成。

3. 四次挥手示意图

复制代码
客户端                                 服务器
   | ----------- FIN seq=u -----------> |
   |                                   |
   | <------------ ACK ack=u+1 --------|
   |                                   |
   |                                   |
   | <----------- FIN seq=v -----------|
   |                                   |
   | ----------- ACK ack=v+1 ---------> |
   |                                   |
连接关闭完成

4. 为什么需要四次挥手

  • TCP是全双工通信:发送和接收需要分别关闭。
  • 确保数据传输的完整性:双方都需要确认对方已经不再发送数据。

5. TIME_WAIT状态的意义

  • 确保确认报文能够到达:等待足够的时间,以确保最后的ACK报文被对方收到。
  • 防止历史重复报文干扰新连接:等待旧连接的报文在网络中消失,避免影响新连接。

四、状态转换图

1. TCP连接建立状态转换

复制代码
客户端状态:
[CLOSED] --SYN--> [SYN_SENT] --ACK/SYN--> [ESTABLISHED]

服务器状态:
[CLOSED] --LISTEN--> [LISTEN] --SYN--> [SYN_RCVD] --ACK--> [ESTABLISHED]

2. TCP连接终止状态转换

复制代码
客户端状态:
[ESTABLISHED] --FIN--> [FIN_WAIT_1] --ACK--> [FIN_WAIT_2] --FIN--> [TIME_WAIT] --等待2MSL--> [CLOSED]

服务器状态:
[ESTABLISHED] --FIN--> [CLOSE_WAIT] --FIN--> [LAST_ACK] --ACK--> [CLOSED]

五、总结

  • 三次握手:用于建立TCP连接,双方交换SYN和ACK报文,确认彼此的通信能力和初始序列号。
  • 四次挥手:用于终止TCP连接,双方交换FIN和ACK报文,确保数据传输完毕并有序关闭连接。
  • 重要性
    • 可靠性保证:通过序列号和确认机制,确保数据的可靠传输。
    • 资源管理:及时释放连接占用的资源,提高网络效率。
    • 防止错误:避免重复的连接或未完成的连接影响通信。

六、扩展知识

1. SYN洪泛攻击(SYN Flood)

  • 原理:攻击者伪造大量不存在的IP地址,发送SYN请求,服务器回复SYN+ACK,但无法收到ACK确认,导致服务器资源耗尽。
  • 防御措施:采用SYN Cookie技术、限制半连接数量、缩短超时时间等。

2. 为什么TIME_WAIT需要等待2MSL

  • MSL(Maximum Segment Lifetime):在网络中,任何TCP报文段所能存在的最大时间。
  • 等待2MSL:确保网络中所有重复的报文段都已消失,防止影响新的连接。

七、结语

深入理解TCP协议的三次握手和四次挥手,对于网络编程、协议分析和网络性能优化都有重要的意义。它体现了TCP协议在可靠性、连接管理和资源利用方面的设计思想。在实际应用中,正确处理连接的建立和终止,可以有效提升网络应用的稳定性和效率。


希望以上内容能帮助您深入理解TCP的三次握手和四次挥手过程。

相关推荐
blasit2 小时前
笔记:Qt C++建立子线程做一个socket TCP常连接通信
c++·qt·tcp/ip
YuMiao8 小时前
gstatic连接问题导致Google Gemini / Studio页面乱码或图标缺失问题
服务器·网络协议
Jony_3 天前
高可用移动网络连接
网络协议
chilix3 天前
Linux 跨网段路由转发配置
网络协议
DianSan_ERP5 天前
电商API接口全链路监控:构建坚不可摧的线上运维防线
大数据·运维·网络·人工智能·git·servlet
呉師傅5 天前
火狐浏览器报错配置文件缺失如何解决#操作技巧#
运维·网络·windows·电脑
gihigo19985 天前
基于TCP协议实现视频采集与通信
网络协议·tcp/ip·音视频
2501_946205525 天前
晶圆机器人双臂怎么选型?适配2-12寸晶圆的末端效应器有哪些?
服务器·网络·机器人
linux kernel5 天前
第七部分:高级IO
服务器·网络
数字护盾(和中)5 天前
BAS+ATT&CK:企业主动防御的黄金组合
服务器·网络·数据库