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

相关推荐
子兮曰11 小时前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰11 小时前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
倒头就睡的小比特11 小时前
算法竞赛C++常用的STL
c++·算法
weilx123411 小时前
C++笔记-文件IO-<fcntl.h>
c++
小羊没烦恼!11 小时前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
爱勇宝11 小时前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
虎头金猫12 小时前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
胡写代码12 小时前
别再前后端各写一套表单校验了
java·后端
伞伞悦读12 小时前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
ttwuai12 小时前
Go开源后台管理系统推荐:怎么按技术栈和边界比较4个官方仓库?
golang·gin