TCP 三次握手与四次挥手

TCP 三次握手与四次挥手

介绍

TCP 是一种面向连接的、可靠的、基于字节流的传输层协议。它在建立连接时使用三次握手建立连接,在断开连接时使用四次挥手断开连接。

三次握手

目的

确保客户端和服务端双方都具有 ​​ 发送和接收数据​​ 的能力。

流程

  1. 第一次握手:

客户端向服务端发送 SYN=1 的同步序列号,并随机生成一个序列号 seq发送给服务端。此时,客户端进入 SYN_SEND 状态。

  1. 第二次握手:

服务端收到 SYN=1 的同步序列号,向客户端发送 SYN=1 的同步序列号和 ACK=1 的确认,同时会生成一个服务端的的序列号 seq, 并确认客户端的序列号 ack= 客户端seq + 1一起发送给客户端。此时,服务端进入 SYN_RECV 状态。

  1. 第三次握手:

客户端收到 SYN=1 的同步序列号和 ACK=1 的确认,向服务端发送 ACK=1 的确认,并将自己的序列号 seq 加 1,同时将确认服务端的序列号 ack = 服务端seq + 1 发送给服务端。此时,客户端进入 ESTABLISHED 状态,服务端收到后也进入 ESTABLISHED 状态。

四次挥手

目的

确保双方都能 ​ 安全关闭连接 ​,避免数据丢失。

流程

  1. 第一次挥手:

客户端发送 FIN=1 的结束序列号,并随机生成一个序列号 seq发送给服务端,通知服务端准备关闭连接。此时,客户端进入 FIN_WAIT_1 状态。

  1. 第二次挥手:

服务端收到 FIN=1 的结束序列号,向客户端发送 ACK=1 的确认,同时确认客户端的序列号 ack = 客户端seq + 1 发送给客户端。此时,服务端进入 CLOSE_WAIT 状态。客户端收到后进入 FIN_WAIT_2 状态。这时服务端并不会立即关闭连接,因为还有处理未完成的请求,因此,在这个阶段,服务端会处理完所有未完成的请求,并把相应的数据发送给客户端。

  1. 第三次挥手:

客户端发送 FIN=1 的结束序列号和 ACK=1 的确认,并随机生成一个序列号 seq和确认客户端的序列号 ack = 客户端seq + 1发送给客户端。 通知服务端准备关闭连接。此时,服务端进入 LAST_ACK 状态,等待客户端的确认。

  1. 第四次挥手:

客户端向服务端发送 ACK=1 的确认,并将自己的序列号 seq 加 1,确认服务端的序列号 ack = 服务端seq + 1发送给服务端。此时,客户端收到后进入 TIME_WAIT 状态,等待服务端的确认,在这个状态下,客户端会进行一个超时等待,通常为 1-4 分钟,如果超时还没有收到服务端的确认,则客户端会重发 ACK 报文

服务端收到后,关闭连接,客户端和服务端同时进入 CLOSED 状态。

相关推荐
整點薯條3 分钟前
Vue3+vite创建项目架构文件说明总结
前端·javascript·vue.js
掘金一周23 分钟前
想问问掘友们:AI 时代,资深开发的核心价值到底在哪里?| 沸点周刊 7.23
前端·人工智能·后端
橘子星32 分钟前
🚀 手把手带你写一个端侧 AI 应用的"加载进度条"与"聊天对话框"
前端·人工智能
37.2℃9951 小时前
专业的Claude Design解决方案
前端·算法
Jolyne_1 小时前
ng-zorro-table列宽resize后宽度是NaN的源码调试记录
前端
liwulin05061 小时前
【ollama】自定义结构化输出
linux·前端·数据库·ollama
前端甜糖1 小时前
记录We码开发者工具的一个bug
前端·javascript
程序员黑豆2 小时前
鸿蒙应用开发教程:以红绿灯切换为例,掌握条件渲染的核心用法
前端·harmonyos
猫3282 小时前
echarts 日常问题解决
前端·javascript·echarts
新中地GIS开发老师2 小时前
地信职业百科④:GIS开发工程师
前端·数据库·gis·webgis·三维gis开发