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

Linux TCP 协议深度解析:从状态机到拥塞控制

引言TCP传输控制协议是互联网的基石协议之一。它提供了面向连接、可靠、基于字节流的传输服务。与UDP的简单封装不同TCP通过复杂的机制保证了数据在网络中传输的可靠性。本文将从TCP的核心特性出发深入讲解连接状态机、三次握手与四次挥手、TIME_WAIT状态的意义以及拥塞控制算法等高级主题。第一部分TCP 协议核心特性一、协议特点特性说明面向连接通信前必须建立连接三次握手结束后断开连接四次挥手可靠传输通过确认应答、超时重传、去重、乱序重排保证可靠性流式服务数据以字节流形式传输无固定边界全双工通信双方可同时发送和接收数据二、可靠性实现机制确认应答ACK接收方收到数据后发送确认信息告知发送方数据已到达。超时重传发送方发送数据后启动定时器若未收到确认则重发数据包。// 超时重传示意 发送端: 发送 seq1 → 启动定时器 接收端: 收到数据 → 发送 ACK2 发送端: 收到 ACK → 取消定时器 // 如果 ACK 丢失 发送端: 发送 seq1 → 启动定时器 接收端: 收到数据 → 发送 ACK2 (丢失) 发送端: 定时器超时 → 重传 seq1去重处理通过报文序号识别并丢弃重复数据包。乱序重排根据序号重新排列到达顺序错乱的数据包。三、滑动窗口机制滑动窗口是TCP的流量控制机制用于调节发送速率防止接收方缓冲区溢出。工作原理窗口内数据可一次性发送无需等待单个确认收到确认后窗口沿数据流方向滑动窗口大小决定允许发送的未确认数据量四、TCP 与 UDP 协议对比对比维度TCPUDP连接性面向连接三次握手无连接可靠性可靠确认重传不可靠尽最大努力数据边界流式无边界数据报有边界传输效率较低较高适用场景文件传输、网页访问实时视频、DNS查询选择依据需要数据完整性 → TCP如文件下载容忍丢包、要求低延迟 → UDP如视频通话第二部分TCP 连接状态机一、状态总览TCP连接从创建到关闭会经历多个状态变化监控连接状态对排查网络问题至关重要。状态说明CLOSED假想的起始状态实际代码中不可见LISTEN服务器监听状态等待客户端连接SYN_SENT客户端发送SYN后进入的状态SYN_RCVD服务器收到SYN后进入的状态ESTABLISHED三次握手完成后进入的连接状态FIN_WAIT_1主动关闭方发送FIN后进入的状态FIN_WAIT_2收到ACK后进入的状态CLOSE_WAIT被动关闭方收到FIN后进入的状态LAST_ACK被动关闭方发送FIN后进入的状态TIME_WAIT主动关闭方完成四次挥手后进入的状态二、状态观察方法# 查看TCP连接状态netstat -natp# 输出示例# Proto Recv-Q Send-Q Local Address Foreign Address State# tcp 0 0 0.0.0.0:6000 0.0.0.0:* LISTEN# tcp 0 0 192.168.1.146:6000 192.168.1.100:54321 ESTABLISHED# tcp 0 0 192.168.1.146:6000 192.168.1.100:54322 TIME_WAIT第三部分TCP 三次握手一、握手流程详细说明步骤方向报文内容状态变化1客户端 → 服务器SYN1, seqx客户端进入 SYN_SENT2服务器 → 客户端SYN1, ACK1, seqy, ackx1服务器进入 SYN_RCVD3客户端 → 服务器ACK1, acky1双方进入 ESTABLISHED二、为什么不能是两次握手两次握手的缺陷无法确认客户端存活状态。// 攻击场景客户端发送SYN → 立即退出服务端回复SYNACK → 等待客户端ACK永远不会到来服务端资源被占用造成资源浪费三次握手的必要性第三次ACK确认双方状态同步防止半开连接。三、SYN Flood 攻击攻击原理攻击者发送大量伪造SYN包占满服务器的未完成握手队列。防御措施SYN Cookie 技术识别异常IP进行限流防火墙检测同一IP的异常SYN报文频率第四部分TCP 四次挥手一、挥手流程二、为什么是四次挥手TCP是全双工通信双方需要独立关闭自己的发送通道次数发送方报文含义1主动方FIN主动方不再发送数据2被动方ACK确认收到关闭请求3被动方FIN被动方不再发送数据4主动方ACK确认关闭进入TIME_WAIT能否简化为三次当被动方收到FIN后立即关闭连接时可将FIN与ACK合并发送协议设计为四次是因为无法预知程序员何时调用close()需要保持ACK的即时性三、TIME_WAIT 状态详解持续时间2MSLMaximum Segment Lifetime通常约2分钟。出现场景仅出现在主动关闭连接的一端。存在原因原因说明可靠终止连接确保最后一次ACK丢失时能处理重传的FIN报文。若直接关闭对方重发FIN将收到RST响应导致错误处理延迟报文等待2MSL时间确保所有报文在网络中消失防止旧连接的延迟报文被新连接误接收实际影响端口处于被占用状态无法立即重启相同端口的服务可通过设置SO_REUSEADDR套接字选项重用端口// 解决 TIME_WAIT 导致的端口占用问题 int opt 1; setsockopt(listen_fd, SOL_SOCKET, SO_REUSEADDR, opt, sizeof(opt));第五部分TCP 头部结构TCP报文头部可同时携带序号和确认号字段这是实现可靠传输的关键技术基础。0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 -------------------------------- | 源端口16位 | 目的端口16位 | -------------------------------- | 序列号32位 | -------------------------------- | 确认号32位 | -------------------------------- | 数据偏移 | 保留 | 标志位 | 窗口大小16位 | -------------------------------- | 校验和16位 | 紧急指针16位 | -------------------------------- | 选项最多40字节 | --------------------------------关键标志位标志位含义SYN同步序列号用于建立连接ACK确认号有效FIN发送方已无数据请求关闭连接RST重置连接PSH立即推送数据第六部分拥塞控制一、核心目标提高网络利用率降低丢包率保证网络资源对每条数据流的公平性。二、四个核心机制机制作用触发条件慢启动指数增长发送窗口探测网络容量连接建立或检测到丢包拥塞避免线性增长窗口防止网络过载窗口达到慢启动阈值快速重传立即重传丢失报文段收到3个重复ACK快速恢复温和降速避免立即进入慢启动快速重传后三、慢启动机制工作原理初始cwnd2-4SMSS每RTT时间窗口大小翻倍。发送轮次 拥塞窗口cwnd1 12 23 44 85 16 ← 达到慢启动阈值转为拥塞避免类比说明如同高速公路车流控制逐步增加避免瞬间拥堵。四、拥塞避免达到慢启动阈值(ssthresh)后采用加法增大策略每收到一个ACKcwnd增加1/cwnd每个RTT周期cwnd增加1五、快速重传与快速恢复触发条件收到3个重复ACK表明有报文段丢失。快速重传立即重传丢失报文段不必等待超时计时器。快速恢复将ssthresh设为当前cwnd的一半cwnd设置为新的ssthresh或ssthresh3进入拥塞避免阶段检测到丢包 │ ▼ ssthresh cwnd ÷ 2 │ ▼ cwnd ssthresh 3快速恢复 │ ▼ 进入拥塞避免阶段线性增长六、AIMD 原则策略说明阶段加法增大拥塞避免阶段的线性增长拥塞避免乘法减小拥塞发生时窗口减半快速恢复第七部分HTTP 协议基础一、HTTP 请求方法方法含义安全性幂等性GET请求获取资源是是POST提交数据否否HEAD仅获取头部信息是是PUT上传资源否是DELETE删除资源否是OPTIONS查看支持的请求方法是是二、HTTP 状态码分类分类含义典型状态码1xx信息类100 Continue2xx成功类200 OK3xx重定向类301 Moved, 302 Found, 304 Not Modified4xx客户端错误400 Bad, 401 Unauthorized, 403 Forbidden, 404 Not Found5xx服务器错误500 Internal, 503 Unavailable三、HTTP 通信流程浏览器访问网页的过程 1. DNS解析将域名解析为IP地址 2. TCP三次握手与服务器建立连接默认端口80 3. 发送HTTP请求GET /index.html HTTP/1.1 4. 服务器响应HTTP/1.1 200 OK 5. 浏览器渲染呈现页面内容 6. TCP四次挥手关闭连接或保持持久连接知识小结知识点核心内容难度TCP协议特点面向连接、可靠传输、流式服务⭐⭐⭐⭐UDP协议特点无连接、不可靠、数据包服务⭐⭐三次握手SYN→SYNACK→ACK⭐⭐⭐四次挥手FIN→ACK→FIN→ACK⭐⭐⭐⭐TIME_WAIT主动关闭方状态持续2MSL⭐⭐⭐⭐滑动窗口流量控制机制⭐⭐⭐⭐拥塞控制慢启动→拥塞避免→快速重传→快速恢复⭐⭐⭐⭐⭐HTTP基础GET/POST方法状态码分类⭐⭐本文详细讲解了TCP协议的核心机制可靠性实现确认应答、超时重传、去重、乱序重排状态机从LISTEN到ESTABLISHED再到TIME_WAIT的完整状态转换三次握手与四次挥手连接建立与关闭的完整流程TIME_WAIT状态存在的两个原因及实际影响拥塞控制慢启动、拥塞避免、快速重传、快速恢复四大机制这些知识点不仅是网络编程的基础更是面试中的高频考点。理解TCP协议的底层工作原理能够帮助你在实际开发中更好地排查网络问题、优化传输性能。

相关文章:

Linux TCP 协议深度解析:从状态机到拥塞控制

引言TCP(传输控制协议)是互联网的基石协议之一。它提供了面向连接、可靠、基于字节流的传输服务。与UDP的简单封装不同,TCP通过复杂的机制保证了数据在网络中传输的可靠性。本文将从TCP的核心特性出发,深入讲解连接状态机、三次握…...

Translumo:免费实时屏幕翻译的终极指南,3分钟快速上手

Translumo:免费实时屏幕翻译的终极指南,3分钟快速上手 【免费下载链接】Translumo Advanced real-time screen translator for games, hardcoded subtitles in videos, static text and etc. 项目地址: https://gitcode.com/gh_mirrors/tr/Translumo …...

JiYuTrainer实用指南:3步轻松解除极域电子教室控制限制

JiYuTrainer实用指南:3步轻松解除极域电子教室控制限制 【免费下载链接】JiYuTrainer 极域电子教室防控制软件, StudenMain.exe 破解 项目地址: https://gitcode.com/gh_mirrors/ji/JiYuTrainer JiYuTrainer是一款专为极域电子教室环境设计的开源防控制软件&…...

Agentic RAG:智能体化检索增强生成系统的架构演进与Golang实战

引言:从"被动应答"到"主动办事" 2026年,检索增强生成(RAG)技术正经历一场从"静态管道"到"动态智能体"的范式革命。传统RAG系统本质上是"一问一答"的线性模式——用户提问、向量检索、召回文档、大模型生成、返回结果。…...

手把手教你:用三相220V变频器驱动380V电机,改个接线就搞定(附接线图)

手把手教你:用三相220V变频器驱动380V电机,改个接线就搞定(附接线图) 在工业现场和自动化项目中,经常会遇到设备电压不匹配的尴尬情况。比如手头有一台输出三相220V的变频器,却需要驱动一台额定电压380V的三…...

从零开始使用 Taotoken 在本地运行 AI 辅助编程工作流

从零开始使用 Taotoken 在本地运行 AI 辅助编程工作流 1. 准备工作 在开始配置之前,请确保您已经完成以下准备工作。首先,访问 Taotoken 平台并注册账号,在控制台中创建 API Key。其次,在模型广场查看并记录您希望使用的模型 ID…...

如何高效使用FlicFlac:Windows免费音频转换工具完全指南

如何高效使用FlicFlac:Windows免费音频转换工具完全指南 【免费下载链接】FlicFlac Tiny portable audio converter for Windows (WAV FLAC MP3 OGG APE M4A AAC) 项目地址: https://gitcode.com/gh_mirrors/fl/FlicFlac 还在为不同设备需要不同音频格式而烦…...

STM32F103ZE标准库SPI驱动PMW3901光流模块:从硬件连接到数据读取的保姆级教程

STM32F103ZE标准库SPI驱动PMW3901光流模块实战指南 第一次接触STM32和光流模块时,面对密密麻麻的引脚和寄存器配置,确实容易让人望而生畏。但别担心,这篇教程会带你从零开始,一步步完成硬件连接、SPI配置、寄存器初始化到最终数据…...

GEOvsSEO|做GEO的我,说实话不吹不黑

经常被问:GEO到底是什么?和SEO到底有啥区别? 一句话说清楚:SEO是让你被搜索引擎(百度、谷歌这些)搜到,而GEO,是让你被AI(豆包、deepseek、文心一言这些)选中&…...

Spring Boot项目在IDEA里调试,如何优雅地管理多套环境配置(开发/测试/生产)?

Spring Boot多环境配置管理的终极实践指南 当你在IDEA中调试Spring Boot项目时,是否经常为不同环境的配置切换而烦恼?开发环境用8080端口,测试环境用8081,生产环境又是另一套数据库连接?每次手动修改application.prope…...

鸣潮工具箱:3步解锁120FPS与抽卡数据分析的终极指南

鸣潮工具箱:3步解锁120FPS与抽卡数据分析的终极指南 【免费下载链接】WaveTools 🧰鸣潮工具箱 项目地址: https://gitcode.com/gh_mirrors/wa/WaveTools WaveTools是一款专为《鸣潮》玩家设计的开源工具箱,通过智能配置管理、画质优化…...

macOS日历智能助手:基于OpenClaw与幂等设计的对话式日程管理

1. 项目概述:一个让日程管理融入对话的智能助手如果你和我一样,每天在即时通讯软件(比如 Telegram、飞书、Discord)和日历应用之间反复横跳,只为把聊天里提到的一个会议、一个灵感或一张截图变成日历上的一个事件&…...

Cloud-Claw:基于Go与插件化架构的多云资源统一管理工具实践

1. 项目概述:一个轻量级云资源抓取与管理的利器最近在整理个人云上资产时,发现了一个挺有意思的开源项目,叫cloud-claw。这名字起得挺形象,“云爪”,一听就知道是跟云资源抓取和管理相关的工具。作为一个经常在多云环境…...

别再报错‘PowerSI executable not found’了!手把手教你搞定Cadence 2017.4与Sigrity 2019的完整安装与联调

彻底解决Cadence与Sigrity联调报错:从安装到仿真的全流程指南 每次打开Allegro Sigrity SI准备大展拳脚时,突然跳出的"PowerSI executable not found"报错对话框,就像一盆冷水浇灭了所有热情。这个看似简单的路径配置问题&#xff…...

Allegro 17.4 铺铜避坑指南:从动态铜皮参数到孤岛删除,一次讲清所有细节

Allegro 17.4 铺铜避坑指南:从动态铜皮参数到孤岛删除,一次讲清所有细节 刚接触Allegro进行PCB设计的硬件工程师,往往会在铺铜环节遇到各种"坑"。从动态铜皮参数设置不当导致的DRC错误,到孤岛铜皮处理不及时引发的生产隐…...

3分钟搞定Obsidian笔记内B站视频播放:终极解决方案

3分钟搞定Obsidian笔记内B站视频播放:终极解决方案 【免费下载链接】mx-bili-plugin 项目地址: https://gitcode.com/gh_mirrors/mx/mx-bili-plugin 还在为Obsidian笔记中无法直接播放B站视频而烦恼吗?Media Extended B站插件为你提供了一套完整…...

VGG19模型实战:用Python和TensorFlow从零搭建图像分类器(附完整代码)

VGG19模型实战:用Python和TensorFlow从零搭建图像分类器(附完整代码) 在计算机视觉领域,卷积神经网络(CNN)已经成为图像分类任务的标准解决方案。牛津大学视觉几何组(Visual Geometry Group&…...

CF冰火遗迹挂机避坑指南:为什么你的脚本总掉线?管理员权限和WeGame窗口是关键

CF冰火遗迹脚本稳定运行实战手册:从权限管理到图像识别的深度优化 1. 为什么你的CF脚本总在关键时刻掉链子? 深夜两点,你第15次检查脚本运行日志,发现它又在进入房间前一刻停止了响应。这不是个例——90%的CF自动化脚本失效案例都…...

5分钟上手:如何用M9A自动化你的《重返未来:1999》日常

5分钟上手:如何用M9A自动化你的《重返未来:1999》日常 【免费下载链接】M9A 重返未来:1999 小助手 | Assistant For Reverse: 1999 项目地址: https://gitcode.com/gh_mirrors/m9/M9A 厌倦了每天重复的游戏日常操作?想让《…...

D2R Pixel Bot终极指南:5步实现暗黑破坏神2重制版全自动运行

D2R Pixel Bot终极指南:5步实现暗黑破坏神2重制版全自动运行 【免费下载链接】botty D2R Pixel Bot 项目地址: https://gitcode.com/gh_mirrors/bo/botty D2R Pixel Bot是一款专门为《暗黑破坏神2重制版》设计的智能自动化工具,通过先进的图像识别…...

5分钟快速上手:用Chinese-ERJ LaTeX模板轻松搞定《经济研究》期刊论文格式

5分钟快速上手:用Chinese-ERJ LaTeX模板轻松搞定《经济研究》期刊论文格式 【免费下载链接】Chinese-ERJ 《经济研究》杂志 LaTeX 论文模板 - LaTeX Template for Economic Research Journal 项目地址: https://gitcode.com/gh_mirrors/ch/Chinese-ERJ 还在为…...

Anime4K:3分钟掌握实时动漫视频高清化的终极方案

Anime4K:3分钟掌握实时动漫视频高清化的终极方案 【免费下载链接】Anime4K A High-Quality Real Time Upscaler for Anime Video 项目地址: https://gitcode.com/gh_mirrors/an/Anime4K 当你在4K大屏幕上重温经典动漫时,是否曾因模糊的画面和失真…...

如何高效下载B站视频:BilibiliDown终极使用指南

如何高效下载B站视频:BilibiliDown终极使用指南 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirrors/bi/Bili…...

Win11Debloat:Windows 11终极去广告与系统优化工具,3步告别臃肿

Win11Debloat:Windows 11终极去广告与系统优化工具,3步告别臃肿 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes…...

五分钟搞定VRoidStudio中文界面:免费汉化插件终极指南

五分钟搞定VRoidStudio中文界面:免费汉化插件终极指南 【免费下载链接】VRoidChinese VRoidStudio汉化插件 项目地址: https://gitcode.com/gh_mirrors/vr/VRoidChinese 你是否在使用VRoidStudio时被满屏的英文界面困扰?作为一款功能强大的3D角色…...

终极免费微信聊天记录导出完整指南:永久保存你的数字记忆

终极免费微信聊天记录导出完整指南:永久保存你的数字记忆 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter 你是否曾因手机丢失、系统升级或误操作而丢失珍贵的…...

Nginx+php配置文件及原理解析

采用nginxPHP作为webserver的架构模式,在现如今运用相当广泛。然而第一步需要实现的是如何让nginx正确的调用php。由于nginx调用php并不是如同调用一个静态文件那么直接简单,是需要动态执行php脚本。所以涉及到了对nginx.conf文件的配置。这一步对新手而…...

如何为Nintendo Switch安装游戏?Awoo Installer的三种高效方案详解

如何为Nintendo Switch安装游戏?Awoo Installer的三种高效方案详解 【免费下载链接】Awoo-Installer A No-Bullshit NSP, NSZ, XCI, and XCZ Installer for Nintendo Switch 项目地址: https://gitcode.com/gh_mirrors/aw/Awoo-Installer Awoo Installer是一…...

5个英雄联盟玩家必知的效率工具:League Akari完全指南

5个英雄联盟玩家必知的效率工具:League Akari完全指南 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 你是一个文章写手&#xff0…...

别光看界面了!Gazebo 11 新手必知的 5 个隐藏操作技巧(附鼠标手势详解)

Gazebo 11 隐藏操作手册:5个让仿真效率翻倍的实用技巧 第一次打开Gazebo时,那个布满按钮的界面确实让人望而生畏——左侧是层层叠叠的面板,顶部工具栏密密麻麻排列着二十多个图标,更别提那些隐藏在菜单深处的功能。但真正的高手从…...