TCP 的三次握手和四次挥手

TCP 的三次握手和四次挥手

引言

传输控制协议(TCP)是互联网协议套件中的核心协议之一,它为应用程序提供可靠的、有序的、错误检查的数据传输。TCP 连接的建立(三次握手)和终止(四次挥手)是其工作机制中最基本也是最重要的概念。

TCP 三次握手

三次握手是 TCP 用来建立连接的过程。它能确保双方都准备好进行数据传输,并同步双方的序列号和确认号。

过程详解

  1. 第一次握手(SYN)

    • 客户端发送一个 SYN(同步)包到服务器
    • 包含客户端的初始序列号(ISN)
    • 进入 SYN_SENT 状态
  2. 第二次握手(SYN + ACK)

    • 服务器收到 SYN 包后,发送一个 SYN+ACK 包作为响应
    • ACK 的值为客户端的 ISN + 1
    • 包含服务器自己的 ISN
    • 服务器进入 SYN_RECEIVED 状态
  3. 第三次握手(ACK)

    • 客户端收到 SYN+ACK 包后,发送一个 ACK 包
    • ACK 的值为服务器的 ISN + 1
    • 客户端进入 ESTABLISHED 状态
    • 服务器收到 ACK 后也进入 ESTABLISHED 状态

图示

客户端 服务器
| |
|----------SYN(seq=x)----------->|
| |
|<---SYN+ACK(seq=y,ack=x+1)-------|
| |
|----------ACK(ack=y+1)--------->|
| |

为什么需要三次握手?

  • 确保双方都有发送和接收的能力
  • 同步双方的初始序列号
  • 防止已失效的连接请求突然又传到服务器,造成错误

TCP 四次挥手

四次挥手是 TCP 用来终止连接的过程。它能确保双方都完成了数据的发送和接收。

过程详解

  1. 第一次挥手(FIN)

    • 客户端发送一个 FIN 包,表示没有数据要发送了
    • 进入 FIN_WAIT_1 状态
  2. 第二次挥手(ACK)

    • 服务器收到 FIN 包后,发送一个 ACK 确认
    • 进入 CLOSE_WAIT 状态
    • 客户端收到 ACK 后,进入 FIN_WAIT_2 状态
  3. 第三次挥手(FIN)

    • 服务器确保数据发送完毕后,发送一个 FIN 包
    • 进入 LAST_ACK 状态
  4. 第四次挥手(ACK)

    • 客户端收到 FIN 后,发送一个 ACK 确认
    • 进入 TIME_WAIT 状态
    • 等待 2MSL(最大报文生存时间)后,进入 CLOSED 状态
    • 服务器收到 ACK 后,立即进入 CLOSED 状态

图示

客户端 服务器
| |
|------FIN------> |
| |
|<-----ACK ------|
| |
|<-----FIN------- |
| |
|------ACK ----->|
| |

为什么需要四次挥手?

  • 全双工通信,每个方向都需要单独关闭
  • 服务器收到 FIN 后,可能还有数据需要发送
  • TIME_WAIT 状态确保最后一个 ACK 能到达服务器

常见问题

  1. 为什么建立连接是三次握手,而关闭连接是四次挥手?

    • 建立连接时,服务器的 SYN 和 ACK 可以一起发送
    • 关闭连接时,服务器的 ACK 和 FIN 一般不会一起发送,因为收到 FIN 后可能还有数据要发送
  2. 什么是 SYN 攻击?

    • 攻击者发送大量 SYN 包但不完成三次握手
    • 耗尽服务器资源,导致正常连接无法建立
  3. 为什么需要 TIME_WAIT 状态?

    • 确保最后一个 ACK 能到达服务器
    • 防止旧连接的数据包被新连接接收

结论

理解 TCP 的三次握手和四次挥手过程对于网络编程和故障排查至关重要。这些机制保证了 TCP 连接的可靠性和有序性,是现代互联网通信的基础。

参考资料

posted @   KenWan  阅读(21)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示