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

TCP核心机制

1. TCP五大核心机制

1.1. 顺序问题(稳重不乱)

背景:网络传输中数据包可能因路径不同或网络波动导致乱序到达,需保证接收方能按正确顺序处理数据。

原理

  • 序列号(Sequence Number):每个数据包携带唯一序列号,接收方按序号重组数据。
  • 累积确认(Cumulative ACK):接收方通过ACK确认“已收到的最大连续序号”,例如ACK=6表示1-5号包已按序接收。
  • 缓存乱序包:接收方缓存非连续包,待缺失包到达后一并处理。

关键技术

  • 快速重传(Fast Retransmit):收到3次重复ACK(如ACK=5),立即重传缺失包(6号包)。
  • SACK(Selective Acknowledgment):通过扩展选项标记已接收的非连续包范围(如SACK=8-9),帮助发送方精准重传。

在 TCP 里,接收端会给发送端报一个窗口的大小,叫Advertised window

发送端需要保持下面的数据结构:

接受端需要保持下面的数据结构:

1.2. 丢包问题(承诺靠谱)

背景:网络拥塞或链路故障可能导致数据包丢失,需确保数据可靠传输。

原理

  • 超时重传(Retransmission Timeout, RTO):

RTT采样:动态计算往返时间(Round-Trip Time),加权平均历史值(SRTT)。

自适应超时:超时时间 = SRTT + 4×RTT波动值(RTTVAR),避免过早或过晚重传。

指数退避:超时后重传时间加倍(如2×RTO),防止加剧拥塞。

  • 快速重传:触发条件为收到3次重复ACK,无需等待超时。
  • SACK

示例

发送方发送包6-9,若包7丢失,接收方持续发送ACK=6;发送方收到3次ACK=6后,立即重传包7。

1.3. 连接维护(有始有终)

背景:TCP是面向连接的协议,需明确建立和释放连接,防止资源泄漏。

原理

三次握手(建立连接):

  • SYN:客户端发送初始序列号(seq=x)。
  • SYN-ACK:服务端确认x+1(ack=x+1),并发送初始序列号(seq=y)。
  • ACK:客户端确认y+1(ack=y+1),双方进入ESTABLISHED状态。
  • 为什么不是两次?:防止历史SYN包导致无效连接(如网络延迟的重传包)。

四次挥手(释放连接):

  • FIN:主动方发送终止请求。
  • ACK:被动方确认。
  • FIN:被动方处理完数据后发送终止请求。
  • ACK:主动方确认,进入TIME_WAIT状态(等待2MSL)。
  • TIME_WAIT作用:确保最后一个ACK到达,避免旧连接数据干扰新连接。

异常处理

  • Keepalive机制:长时间无数据时发送探测包,检测连接存活。
  • RST包:强制终止异常连接(如对方进程崩溃)。

1.4. 流量控制(把握分寸)

背景:防止发送速率超过接收方处理能力,导致缓冲区溢出。

原理

  • 滑动窗口(Sliding Window):

接收窗口(rwnd):接收方通过ACK告知剩余缓冲区大小(Advertised Window)。

发送窗口:发送方限制未确认数据量 ≤ min(rwnd, cwnd)。

关键策略:

  • 零窗口探测:当rwnd=0时,发送方定期发送1字节探测包,避免死锁。
  • 糊涂窗口综合征避免:接收方在缓冲区有足够空间(如≥1MSS)时才更新窗口。

示例

接收方缓冲区满时,发送ACK携带rwnd=0,发送方暂停发送;待接收方处理数据后,通过ACK更新rwnd恢复传输。

1.5. 拥塞控制(知进知退)

背景:防止发送速率超过网络承载能力,导致全局性丢包和拥塞崩溃。

原理

  • 拥塞窗口(cwnd):动态调整的发送速率上限,与rwnd共同限制发送量。
  • 核心算法:

        慢启动(Slow Start):

        初始cwnd=1 MSS,每RTT指数增长(cwnd×2)。

        当cwnd≥ssthresh(慢启动阈值,默认65535字节)时进入拥塞避免。

        拥塞避免(Congestion Avoidance):

        每RTT线性增长(cwnd += 1 MSS)。

        快重传与快恢复:

        收到3次重复ACK时,ssthresh=cwnd/2,cwnd=ssthresh+3,进入线性增长。

        超时重传:

        ssthresh=cwnd/2,cwnd=1,重新慢启动。

优化算法(如BBR)

带宽与时延探测:动态计算最大带宽(BtlBw)和最小RTT(RTprop),按BtlBw×RTprop设置cwnd,避免填满中间设备缓存。

示例

网络拥塞时,传统TCP通过丢包触发降速;BBR通过测量带宽和时延主动调整,保持高吞吐和低延迟。

总结:

机制

核心目标

关键技术

关键参数/算法

顺序问题

数据按序到达

序列号、累积确认、SACK

快速重传、SACK选项

丢包问题

数据可靠传输

超时重传、快速重传

RTT计算、指数退避

连接维护

明确连接生命周期

三次握手、四次挥手、TIME_WAIT

Keepalive、RST

流量控制

匹配发送与接收速率

滑动窗口、零窗口探测

rwnd、MSS

拥塞控制

避免网络过载

慢启动、拥塞避免、快恢复、BBR

cwnd、ssthresh、BtlBw、RTprop

相关文章:

  • list基础用法
  • Docker疑难杂症解决指南
  • ThingsBoard3.9.1 MQTT Topic(4)
  • python常用算法总结(下)
  • 基于STM32、HAL库的TLV320AIC3101IRHBR音频接口芯片驱动程序设计
  • [250512] Node.js 24 发布:ClangCL 构建,升级 V8 引擎、集成 npm 11
  • webservice获取全国省份区县编码(拼音全拼+拼音简写)
  • linux 抓包工具tcpdump使用小记(使用时注意权限和系统资源)
  • OpenHarmony 开源鸿蒙南向开发——linux下使用make交叉编译第三方库——mqtt库
  • 时间序列预测建模的完整流程以及数据分析【学习记录】
  • 从零开始了解数据采集(二十七)——什么IIOT平台
  • 源码分析之Leaflet中GeoJSON模块
  • 信息学奥赛一本通 1535:【例 1】数列操作
  • 信奥赛-刷题笔记-队列篇-T2-P1540机器翻译和P2952Cow Line S
  • 品种亮相!贵州金桥药业筑牢市场竞争护城河
  • MATLAB语音情感识别神经网络方法
  • 从零开始:使用 Vue-ECharts 实现数据可视化图表功能
  • INT202 Complexity of Algroithms 算法的复杂度 Pt.7 NP-Completeness NP完全性
  • SwarmUI 基于.NET开发的开源AI图像生成WEB用户界面系统
  • 市政务服务技能竞赛流程策划方案
  • 大英博物馆展歌川广重:他是梵高最钟爱的浮世绘名家
  • 智能手表眼镜等存泄密隐患,国安部提醒:严禁在涉密场所使用
  • 明查|印度空军“又有一架战机被巴基斯坦击落,飞行员被俘”?
  • 季后赛主场优势消失之谜,这事竟然要赖库里
  • 全国层面首次!《防震减灾基本知识与技能大纲》发布
  • 李公明 | 一周画记:印巴交火会否升级为第四次印巴战争?