当前位置: 首页 > article >正文

到底什么是 TCP 连接:从三次握手到四次挥手,从数据结构到状态机

到底什么是 TCP 连接从三次握手到四次挥手从数据结构到状态机01. 前言每天都在用却说不清它是什么02. 一句话定义03. TCP 连接不是物理的而是逻辑的04. TCP 连接的核心标识四元组05. TCP 连接在内核中的数据结构06. TCP 连接的生命周期状态机6.1 状态迁移图文字版6.2 各状态含义速查表07. 三次握手连接的建立08. 四次挥手连接的关闭09. Socket 编程视角连接就是文件描述符10. 连接的“可靠性”是如何实现的11. 常见面试问题与深入理解Q1一个服务器最多能支持多少个 TCP 连接Q2TIME_WAIT 状态是干什么的为什么要等 2MSLQ3连接断开后端口多久可以复用Q4如何查看系统当前的 TCP 连接12. 类比打电话更容易理解13. 总结The Begin点点关注收藏不迷路01. 前言每天都在用却说不清它是什么当你打开浏览器访问网页、用微信发消息、通过 SSH 登录服务器底层都在使用TCP 连接。我们天天说“建立 TCP 连接”“关闭 TCP 连接”但到底什么是 TCP 连接它是一个物理线路是一段内存是一个 IP 端口对还是一个状态机答案是TCP 连接是通信双方操作系统内核中维护的一段数据结构 一个状态机。它不是物理实体而是一个逻辑上的、双向的、可靠的字节流通道。本文从定义、数据结构、状态机、三次握手、四次挥手、Socket 编程等角度彻底讲清“什么是 TCP 连接”。02. 一句话定义TCP 连接是指两台主机之间通过 TCP 协议建立的一个虚拟的、全双工的、可靠的字节流通道。它在双方内核中由一组数据结构Socket、连接表项、发送/接收缓冲区表示并由一个有限状态机管理生命周期。核心特征面向连接通信前必须先建立连接全双工双方可以同时发送和接收数据可靠确认重传、排序、流量控制、拥塞控制字节流没有消息边界像水管里的水流03. TCP 连接不是物理的而是逻辑的物理视角 客户端 ──────────── 网线 ──────────── 路由器 ──────────── 服务器 没有一条“专线”留给 TCP 连接所有数据包都在共享网络上传输 逻辑视角TCP 连接抽象 客户端 ═══════════════════════════════════════════════════ 服务器 一个虚拟的、可靠的、有序的字节流通道TCP 连接并不独占任何物理链路而是通过 IP 地址 端口号 序列号 状态机在无连接的 IP 网络上模拟出一个“可靠的连接”。04. TCP 连接的核心标识四元组一个 TCP 连接由四个值唯一确定┌─────────────────────────────────────────────────────────┐ │ 源IP地址 192.168.1.100 │ │ 源端口 54321 │ │ 目标IP地址 93.184.216.34 │ │ 目标端口 80 │ └─────────────────────────────────────────────────────────┘ 合称四元组 (src_ip, src_port, dst_ip, dst_port)这意味着同一个客户端 IP 同一端口可以连接同一个服务器的不同端口 → 不同连接同一个客户端 IP 不同端口连接同一个服务器的同一个端口 → 不同连接不同客户端 IP即使端口相同也是不同连接示例 连接A: (192.168.1.100, 12345, 93.184.216.34, 80) 连接B: (192.168.1.100, 12346, 93.184.216.34, 80) ← 不同源端口不同连接 连接C: (192.168.1.101, 12345, 93.184.216.34, 80) ← 不同源IP不同连接05. TCP 连接在内核中的数据结构当建立一个 TCP 连接后操作系统内核会为它分配以下数据结构┌─────────────────────────────────────────────────────────────────┐ │ TCP 控制块TCB │ ├─────────────────────────────────────────────────────────────────┤ │ 四元组 : (src_ip, src_port, dst_ip, dst_port) │ │ 状态 : ESTABLISHED / CLOSE_WAIT / ... │ │ 发送序列号 : 下一个要发送的字节序号 │ │ 接收序列号 : 期望收到的下一个字节序号 │ │ 发送窗口 : 还能发多少字节流量控制 │ │ 接收窗口 : 还能收多少字节 │ │ 发送缓冲区 : 待确认的数据 │ │ 接收缓冲区 : 已收到但未读给应用的数据 │ │ 重传定时器 : 超时未确认则重传 │ │ 保活定时器 : Keep-Alive 探测 │ └─────────────────────────────────────────────────────────────────┘简单理解连接就是一个“档案”记录了双方通信的当前进度发送/接收缓冲区是内核为这个连接分配的内存区域应用程序通过 Socket 句柄访问这个连接06. TCP 连接的生命周期状态机TCP 连接的核心是一个有限状态机共有 11 种状态。6.1 状态迁移图文字版客户端 服务器 │ │ CLOSED ──────────────┼────────────────────────────────────┤ CLOSED │ │ │ │ 主动打开 │ │ 被动打开 ▼ │ ▼ SYN_SENT ────────────┼─────────────────────────────────► LISTEN │ │ │ │ │ 收到 SYN发 SYNACK │ │ │◄───────────────────────────────────┤ │ │ │ ▼ ▼ ▼ ESTABLISHED ◄─────────────────────────────────────── SYN_RCVD │ │ │ │ │ 三次握手完成 │ │ │ │ 数据传输阶段 │ │ │ │ │ │ 主动关闭 │ │ 被动关闭 ▼ │ ▼ FIN_WAIT_1 ──────────┼─────────────────────────────────► CLOSE_WAIT │ │ │ ▼ │ ▼ FIN_WAIT_2 │ LAST_ACK │ │ │ │ │◄───────────────────────────────────┤ ▼ ▼ ▼ TIME_WAIT ────────────────────────────────────────────► CLOSED 等待 2MSL │ │ │ ▼ │ CLOSED ──────────────┘6.2 各状态含义速查表状态含义CLOSED没有连接初始状态LISTEN服务器等待客户端连接SYN_SENT客户端已发 SYN等待 SYNACKSYN_RCVD服务器收到 SYN已发 SYNACK等待 ACKESTABLISHED连接已建立可以传输数据FIN_WAIT_1主动关闭方发了 FIN等待 ACKFIN_WAIT_2主动关闭方收到对 FIN 的 ACK等待对方 FINCLOSE_WAIT被动关闭方收到 FIN等待应用调用 closeLAST_ACK被动关闭方发了 FIN等待最后的 ACKTIME_WAIT主动关闭方收到 FINACK等待 2MSL 确保对方收到 ACKCLOSING双方同时关闭罕见07. 三次握手连接的建立三次握手的目的确认双方的收发能力正常并同步初始序列号ISN。客户端主动打开 服务器被动打开LISTEN │ │ │────── 1. SYN (seqx) ──────────────→│ (客户端我要连接我的序列号是x) │ │ │←──── 2. SYNACK (seqy, ackx1) ────│ (服务器收到我也要连接我的序列号是y) │ │ │────── 3. ACK (acky1) ────────────→│ (客户端收到你的确认连接建立) │ │ ▼ ▼ ESTABLISHED ESTABLISHED为什么是三次不是两次两次无法区分“旧连接的历史延迟包”和“新连接的有效包”第三次 ACK 是为了让服务器确认客户端的接收能力正常同时双方同步了初始序列号08. 四次挥手连接的关闭TCP 连接是全双工的每一端都需要单独关闭自己的发送通道。主动关闭方客户端 被动关闭方服务器 │ │ │────── 1. FIN (sequ) ──────────────→│ (客户端我发完了不再发数据) │ │ │←──── 2. ACK (acku1) ──────────────│ (服务器收到你的 FIN) │ │ (此时客户端→服务器方向关闭) │ │ (服务器还可以继续发数据) │ │ │ (可能还有数据要发) │ │ │ │←──── 3. FIN (seqv) ────────────────│ (服务器我也发完了) │ │ │────── 4. ACK (ackv1) ────────────→│ (客户端收到关闭) │ │ ▼ ▼ TIME_WAIT CLOSED (等待 2MSL) │ ▼ CLOSED为什么是四次不能合并成三次因为当主动方发 FIN 时被动方可能还有数据要发ACK 和 FIN 必须分开先 ACK 确认收到 FIN等数据发完再发 FIN09. Socket 编程视角连接就是文件描述符在编程层面TCP 连接被抽象为一个Socket 文件描述符fd。// 伪代码流程以 Linux C 为例 // 服务器端 fd socket(AF_INET, SOCK_STREAM, 0); // 创建 socket bind(fd, ...); // 绑定端口 listen(fd, 128); // 进入 LISTEN 状态 conn_fd accept(fd, ...); // 接受连接返回新 fd read(conn_fd, buffer, size); // 从连接读数据 write(conn_fd, data, len); // 向连接写数据 close(conn_fd); // 关闭连接 // 客户端 fd socket(AF_INET, SOCK_STREAM, 0); connect(fd, server_addr, ...); // 发起三次握手 write(fd, request, len); read(fd, response, size); close(fd);关键点accept()成功后内核为该连接创建新的 socket fd对 fd 的read()/write()就是对连接的收发操作关闭 fd 会触发 FIN 包的发送四次挥手10. 连接的“可靠性”是如何实现的TCP 连接被称为“可靠”连接靠的是以下机制机制作用确认应答每个收到的数据包都要回复 ACK超时重传发送后一段时间没收到 ACK就重传序列号给每个字节编号用于排序和去重累积确认ACK n 表示 n 之前的所有字节都已收到流量控制通过窗口字段告知对方“还能发多少”防止接收方被淹没拥塞控制慢启动、拥塞避免、快重传、快恢复防止网络崩溃11. 常见面试问题与深入理解Q1一个服务器最多能支持多少个 TCP 连接理论上限由文件描述符限制 内存决定但有个关键点客户端连接数上限受限于(本地IP数 × 本地端口数)约 4 万个因为端口只有 16 位服务端连接数上限受限于内存每个连接占用 TCB约几 KB和 fd 限制理论上可达数百万服务端用同一个端口如 80可以接受无数个连接因为四元组中的客户端 IP端口区分了它们。Q2TIME_WAIT 状态是干什么的为什么要等 2MSL确保最后一个 ACK 能到达对方如果丢失对方重发 FINTIME_WAIT 可以重发 ACK防止“延迟的旧数据包”误入新连接2MSL 后所有包都会在网络中消失Q3连接断开后端口多久可以复用TIME_WAIT 默认 60 秒Linux 的 2MSL 通常是 60 秒。可以调整net.ipv4.tcp_tw_reuse允许复用。Q4如何查看系统当前的 TCP 连接# Linux 查看所有 TCP 连接netstat-antpss-antp# 示例输出Proto Recv-Q Send-Q Local Address Foreign Address State tcp000.0.0.0:800.0.0.0:* LISTEN tcp00127.0.0.1:5432193.184.216.34:80 ESTABLISHED12. 类比打电话更容易理解┌─────────────────────────────────────────────────────────────────┐ │ TCP 连接 vs 打电话 │ ├─────────────────────────────────────────────────────────────────┤ │ 拨号 → TCP 三次握手 │ │ 对方接听 → 连接建立ESTABLISHED │ │ 说话你来我往→ 数据传输全双工 │ │ 一方说“我说完了”→ FIN主动关闭发送通道 │ │ 另一方说“知道了”→ ACK │ │ 另一方也说完了 → 另一个 FIN │ │ 挂断 → 连接关闭 │ └─────────────────────────────────────────────────────────────────┘不同的是打电话独占一条物理线路而 TCP 连接是逻辑共享的。13. 总结┌─────────────────────────────────────────────────────────────────┐ │ 什么是 TCP 连接 │ ├─────────────────────────────────────────────────────────────────┤ │ 1. 它是逻辑的不是物理的——没有专属电线 │ │ 2. 它由四元组唯一标识(src_ip, src_port, dst_ip, dst_port) │ │ 3. 它是内核中的数据结构TCB 状态机 │ │ 4. 它是可靠的、全双工的、面向字节流的通道 │ │ 5. 生命周期CLOSED → 三次握手 → ESTABLISHED → 四次挥手 → CLOSED│ │ 6. 编程视角它就是你能 read/write 的 Socket 文件描述符 │ └─────────────────────────────────────────────────────────────────┘一句话记住TCP 连接是操作系统内核中由四元组标识的、一个带有状态机、缓冲区、序列号的数据结构它向应用程序提供了一个可靠的、双向的字节流传输服务。The End点点关注收藏不迷路

相关文章:

到底什么是 TCP 连接:从三次握手到四次挥手,从数据结构到状态机

到底什么是 TCP 连接:从三次握手到四次挥手,从数据结构到状态机01. 前言:每天都在用,却说不清它是什么02. 一句话定义03. TCP 连接不是物理的,而是逻辑的04. TCP 连接的核心标识:四元组05. TCP 连接在内核中…...

Python @contextmanager 装饰器完全指南

在Python编程实践中,资源管理是一个永恒的话题。无论是文件句柄、数据库连接还是临时状态变更,我们都需要确保资源被正确分配并在使用后得到妥善清理。虽然传统的try...finally语句可以解决这个问题,但Python提供了更加优雅的解决方案——上下…...

EC数据下载和可视化产品python实现

欧洲中期天气预报中心(ECMWF,European Centre for Medium-Range Weather Forecasts)是全球顶尖的气象研究和业务预报中心之一。其发布的数据,常被业内简称为“EC数据”,因高精度与高稳定性,是全球气象预报、…...

数据集成与 ETL 实践:从设计到优化

数据集成与 ETL 实践:从设计到优化 前言 作为一个在数据深渊里捞了十几年 Bug 的女码农,我深知数据集成和 ETL(Extract, Transform, Load)在企业数据管理中的重要性。随着数据量的爆炸式增长和数据来源的多样化,数据集…...

数据治理与数据质量:从策略到实践

数据治理与数据质量:从策略到实践 前言 作为一个在数据深渊里捞了十几年 Bug 的女码农,我深知数据治理和数据质量在企业数据管理中的重要性。随着数据量的爆炸式增长和数据类型的多样化,数据治理和数据质量已经成为企业数据管理的核心挑战。今…...

云原生数据库的设计与实践:从架构到部署

云原生数据库的设计与实践:从架构到部署 前言 作为一个在数据深渊里捞了十几年 Bug 的女码农,我深知云原生技术对数据库的影响。随着云计算的快速发展,云原生数据库已经成为数据库技术的重要发展方向。今天,我就来聊聊云原生数据库…...

网络协议封神考点:TCP协议是如何保证可靠传输的?原理+流程图+硬核详解

网络协议封神考点:TCP协议是如何保证可靠传输的?原理流程图硬核详解一、前言二、基础定义:什么是TCP可靠传输?三、TCP保证可靠传输的6大核心机制(必考)3.1 机制1:面向连接(三次握手 …...

Spring-AI 第 13 章 - 多模态消息处理详解

📚 理论基础 什么是多模态 AI? 多模态 AI(Multimodal AI) 是能够同时处理和生成多种类型数据(文本、图像、音频等)的人工智能系统。 多模态模型架构 ┌──────────────┐ ┌──────────────┐ │ 图像输入 │ │ 文本输入 …...

**发散创新:基于Go语言实现的Raft共识算法实战解析**在分布式系统中,**一

发散创新:基于Go语言实现的Raft共识算法实战解析 在分布式系统中,一致性是核心挑战之一。而Raft共识算法因其简洁性和可理解性,已成为当前主流的分布式一致性协议(如etcd、Consul均采用Raft)。本文将带你深入用Go语言从…...

# 发散创新:基于Python与Stable Diffusion的AI绘画自动化流程设计与实践

发散创新:基于Python与Stable Diffusion的AI绘画自动化流程设计与实践 在人工智能技术飞速发展的今天,AI绘画已从实验室走向大众创作场景。如何将这一前沿能力融入开发者工作流?本文以 Python Stable Diffusion API(如InvokeAI或…...

**发散创新:基于 Rust的微服务生态构建与性能优化实战**在现代云原生架构中,**Rust语言正迅速成为构建高并发、低延迟微服

发散创新:基于 Rust 的微服务生态构建与性能优化实战 在现代云原生架构中,Rust 语言正迅速成为构建高并发、低延迟微服务的首选工具之一。它不仅提供了媲美 C/C 的性能,还通过所有权机制彻底避免了内存安全问题。本文将围绕 Rust 在微服务生态…...

2026届最火的六大降重复率神器实际效果

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 目前人工智能生成内容大范围运用的情形下,致使 AIGC 检测识别率降低的工具适时出…...

场效应管MOS

场效应管 场效应管又称场效应晶体管(Field Effect Transistor,缩写为FET),它与三极管一样,具有放大能力。场效应管有漏极(D极)、栅极(G极)和源极(S极&#xf…...

5个突破边界技巧:OpenSpeedy游戏变速工具深度优化指南

5个突破边界技巧:OpenSpeedy游戏变速工具深度优化指南 【免费下载链接】OpenSpeedy 🎮 An open-source game speed modifier. 项目地址: https://gitcode.com/gh_mirrors/op/OpenSpeedy 副标题:如何通过用户态Hook技术实现游戏帧率自由…...

新手福音:在快马平台用AI生成openclaw命令实操案例,轻松入门运维自动化

作为一个刚接触运维的新手,第一次看到openclaw这个命令时确实有点懵。不过最近在InsCode(快马)平台上发现了一个超实用的功能,可以通过AI直接生成可运行的openclaw示例代码,还能实时测试效果,简直是新手福利!下面我就用…...

保姆级教程:在Quartus Prime 18.0中手把手配置NCO IP核并完成Modelsim仿真

保姆级教程:在Quartus Prime 18.0中手把手配置NCO IP核并完成Modelsim仿真 数字信号处理是FPGA开发中的核心技能之一,而数控振荡器(NCO)作为生成精确频率信号的关键IP核,在通信系统、雷达信号处理等领域有着广泛应用。…...

C语言三大控制结构:零基础学循环与选择

C语言编程里,控制结构用以构架程序逻辑,是新手入门的关键要点,掌握顺序、选择、循环这三大基本控制结构,可使你脱离单纯顺序代码编写,达成更复杂、更灵活的程序逻辑,本文会将C语言控制结构的核心知识点讲解…...

【深度解析】Hermes Agent:具备学习循环的开源 AI 代理如何落地到你的开发工作流?

摘要 Hermes Agent 是 News Research 推出的开源 AI Agent 系统,不只是“聊天包装器”,而是带有持久化记忆、自我技能学习与多通道接入的完整代理运行环境。本文从架构原理到落地实践,系统解析 Hermes 的学习循环、模型接入方式(云…...

CEEMDAN-VMD-Transformer-GRU二次分解+编码器+门控循环单元多元时间序列预测

一、研究背景 实际工程与科学数据(如振动信号、电力负荷、金融时序)常呈现非线性、非平稳特征,单一预测模型难以充分提取多尺度信息。为此,结合自适应信号分解(CEEMDAN、VMD)与深度学习(Transfo…...

针对波动计算复杂性的吸收边界条件(PML 用于一般波动方程)附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室🍊个人信条:格物致知,完整Matlab代码及仿真咨询…...

【LeetCode 刷题日】19.删除链表的倒数第n个节点

🔥个人主页:北极的代码(欢迎来访) 🎬作者简介:java后端学习者评论和 ❄️个人专栏:苍穹外卖日记,SSM框架深入,JavaWeb ✨命运的结局尽可永在,不屈的挑战却不可…...

【AI实战项目】项目六:知识图谱构建与应用实战

分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请轻击人工智能教程https://www.captainai.net/troubleshooter 项目背景: 在当今信息爆炸的时代,精准理解和应…...

人流后多久干净才算正常?行业洞察与科学修护指南

人工流产后,出血排净时间是判断身体恢复状态的核心指标,也是女性关注的首要问题。结合行业研究与临床实践,本文将深入解析人流后出血的正常范围、异常信号,同时结合行业修护标准,为女性提供科学、实用的恢复指引&#…...

宫外孕打掉需要住院吗?术后修护核心指南

宫外孕作为妇科高发急腹症,不少女性存在认知误区,疑惑“宫外孕打掉是否需要住院”。事实上,宫外孕绝非普通流产,其处理必须住院,且术后修护直接影响女性后续生殖健康。本文结合行业洞察,围绕宫外孕住院必要…...

告别繁琐手工操作:工资条生成器使用指南

对于许多财务人员来说,每月制作工资条都是一项让人头疼的工作。 手工制作不仅要花费大量时间,还容易出现各种错误,影响工作效率和准确性。 今天,我们就来详细介绍一款能够彻底改变这种状况的工具——工资条生成器。 工资条生成…...

工资条生成器:财务人员的高效办公利器

在企业财务管理工作中,工资条的制作与发放是一项既繁琐又重要的任务。 传统的手工制作方式不仅耗时耗力,还容易出现数据错误和格式不统一的问题。 工资条生成器的出现,为财务人员带来了全新的解决方案。 这款软件专门针对财务工作场景设计…...

龙迅LT9211D芯片解析:如何实现MIPI与双端口LVDS的高效转换

1. 龙迅LT9211D芯片的核心价值 第一次接触龙迅LT9211D芯片是在一个车载显示项目上,当时客户要求实现4K视频从主控芯片到双屏显示的无损传输。这个看似简单的需求背后,其实隐藏着MIPI和LVDS两种信号标准的转换难题。LT9211D的出现完美解决了这个问题&…...

Ubuntu 22.04下Milvus集群部署实战:从Docker提取二进制文件的完整指南

Ubuntu 22.04下Milvus集群部署实战:从Docker提取二进制文件的完整指南 在向量数据库领域,Milvus凭借其出色的性能和可扩展性已成为众多AI应用的首选存储引擎。虽然官方推荐使用Docker或Kubernetes进行部署,但在某些生产环境中,直接…...

W5500 TCP客户端实战 | 02 - 从寄存器配置到数据收发的完整流程解析

1. W5500网络寄存器配置详解 第一次接触W5500芯片时,我被它密密麻麻的寄存器地址搞得头晕眼花。后来发现只要抓住几个核心寄存器,配置起来就像填快递单一样简单。先说说最关键的四个本地网络寄存器,它们相当于设备的"身份证"&#…...

小米笔记本Pro双固态硬盘实战:Win11与Ubuntu22.04双系统完美共存指南

1. 为什么选择双固态硬盘装双系统? 最近给小米笔记本Pro加装第二块NVMe固态硬盘的朋友越来越多,我自己也刚在2023款小米Pro上实现了Win11和Ubuntu22.04的双系统共存。相比传统单硬盘分区方案,双物理硬盘隔离安装有几个明显优势: 首…...