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

相关推荐
梦想画家2 小时前
Golang Gin系列-9:Gin 集成Swagger生成文档
golang·gin·swagger
{⌐■_■}2 小时前
【Validator】自定义字段、结构体补充及自定义验证,go案例讲解ReportError和errors.As在其中的使用
开发语言·golang·xcode
python算法(魔法师版)4 小时前
C++游戏开发深度解析
开发语言·c++·c
siy23335 小时前
[c语言日寄]assert函数功能详解
c语言·开发语言·笔记·学习·算法
呀2435 小时前
基于SpringBoot多数据源解决方案
java·spring boot·后端
酷爱码5 小时前
springboot 动态线程池
java·spring boot·后端
滨HI06 小时前
18. 四数之和【力扣】——两层循环后的双指针法
数据结构·c++·算法·leetcode·职场和发展
像污秽一样7 小时前
AI刷题-蛋糕工厂产能规划、优质章节的连续选择
数据结构·c++·算法·dp·队列
皮皮虾我们跑8 小时前
Java中的泛型
java·开发语言
Channing Lewis8 小时前
如何使用 Flask-Caching 提高性能?
后端·python·flask