TCP三次握手和四次挥手

TCP 三次握手和四次挥手

TCP(传输控制协议)是一种面向连接的协议,在建立连接和断开连接时分别需要通过 三次握手四次挥手 来确保通信的可靠性和完整性。


1. 三次握手

三次握手是 TCP 建立连接的过程,确保客户端和服务器双方都准备好进行数据传输。

步骤
  1. 第一次握手

    • 客户端向服务器发送一个 SYN(同步)包,其中 SYN=1,表示请求建立连接。
    • 客户端状态从 CLOSED 变为 SYN_SENT
  2. 第二次握手

    • 服务器收到 SYN 包后,向客户端发送一个 SYN+ACK(同步+确认)包,其中 SYN=1,ACK=1。
    • 服务器状态从 LISTEN 变为 SYN_RCVD
  3. 第三次握手

    • 客户端收到 SYN+ACK 包后,向服务器发送一个 ACK(确认)包,其中 ACK=1。
    • 客户端和服务器状态都变为 ESTABLISHED,连接建立成功。
作用
  • 确认双方的通信能力:通过三次握手,确保客户端和服务器都能正常发送和接收数据。
  • 同步初始序列号:交换初始序列号,用于后续数据传输的可靠性保证。

2. 四次挥手

四次挥手是 TCP 断开连接的过程,确保客户端和服务器双方都完成数据传输并安全关闭连接。

步骤
  1. 第一次挥手

    • 客户端向服务器发送一个 FIN(结束)包,其中 FIN=1,表示请求关闭连接。
    • 客户端状态从 ESTABLISHED 变为 FIN_WAIT_1
  2. 第二次挥手

    • 服务器收到 FIN 包后,向客户端发送一个 ACK(确认)包,其中 ACK=1。
    • 服务器状态从 ESTABLISHED 变为 CLOSE_WAIT
    • 客户端收到 ACK 包后,状态从 FIN_WAIT_1 变为 FIN_WAIT_2
  3. 第三次挥手

    • 服务器完成数据传输后,向客户端发送一个 FIN 包,其中 FIN=1,表示服务器也准备关闭连接。
    • 服务器状态从 CLOSE_WAIT 变为 LAST_ACK
  4. 第四次挥手

    • 客户端收到 FIN 包后,向服务器发送一个 ACK 包,其中 ACK=1。
    • 客户端状态从 FIN_WAIT_2 变为 TIME_WAIT,等待 2MSL(最大报文段生存时间)后进入 CLOSED 状态。
    • 服务器收到 ACK 包后,状态从 LAST_ACK 变为 CLOSED
作用
  • 确保数据完整性:通过四次挥手,确保双方都完成数据传输并安全关闭连接。
  • 防止旧连接的干扰 :通过 TIME_WAIT 状态,防止旧连接的报文干扰新连接。

三次握手

Client Server SYN=1 (SYN_SENT) SYN=1, ACK=1 (SYN_RCVD) ACK=1 (ESTABLISHED) Client Server

四次挥手

Client Server FIN=1 (FIN_WAIT_1) ACK=1 (CLOSE_WAIT) FIN=1 (LAST_ACK) ACK=1 (TIME_WAIT) Client Server

相关推荐
玖笙&1 分钟前
✨WPF编程进阶【7.1】动画基础
c++·c#·wpf·visual studio
kaikaile199514 分钟前
34节点配电网牛顿-拉夫逊潮流计算 + 分布式电源(DG)多场景分析的 MATLAB
开发语言·分布式·matlab
QT 小鲜肉14 分钟前
【C++基础与提高】第一章:走进C++的世界——从零开始的编程之旅
开发语言·c++·笔记·qt
java1234_小锋17 分钟前
MyBatis如何处理懒加载和预加载?
java·开发语言·mybatis
@木辛梓22 分钟前
模版 c++
开发语言·c++
oioihoii30 分钟前
C++中的线程同步机制浅析
开发语言·c++
Jerry25050936 分钟前
微信小程序必要要安装SSL证书吗?小程序SSL详解
网络·网络协议·网络安全·微信小程序·小程序·https·ssl
刘一说42 分钟前
Spring Boot 中的定时任务:从基础调度到高可用实践
spring boot·后端·wpf
小坏讲微服务42 分钟前
使用 Spring Cloud Gateway 实现集群
java·spring boot·分布式·后端·spring cloud·中间件·gateway
不知几秋1 小时前
配置JDK和MAVEN
java·开发语言·maven