TCP传输可靠性保障:理论讲解→实战面试解析

一、TCP为何需要可靠性保障?

        TCP作为互联网的"运输队长",承担着80%以上的网络数据传输任务。其核心使命是:在不可靠的IP层之上,构建端到端可靠传输通道

        想象一下网购时商品运输需要防丢包防损坏防错序,TCP正是通过七大核心机制实现这一目标。

二、TCP可靠性七大支柱

2.1 数据分块与序列号机制

数据分块:将应用层数据切割为MSS(最大报文段长度,通常1460字节)
序列号:每个字节分配唯一编号(ISN初始序列号通过时钟算法生成)

# 示例:数据分块过程
app_data = "A"*5000  # 应用层数据
mss = 1460
segments = [app_data[i:i+mss] for i in range(0, len(app_data), mss)]

想象你要邮寄一本百科全书,快递员说:“抱歉,包裹太大运不了”。TCP的做法是:

  • 拆书成页:把大数据拆成适合网络传输的小块(称为报文段
  • 每页编号:给每个数据块打上唯一序号(比如第1页、第2页...)

序列号的作用

  • 识别顺序:接收方按序号重新组装(像拼图)
  • 发现丢失:如果收到1、3号包,就知道2号丢失了
  • 防止重复:如果重复收到2号包,直接丢弃

2.2 校验和双保险

首部校验和16位反码求和,检测头部篡改
数据完整性校验CRC32等算法(部分实现扩展)

如何验证数据完整?

发送方:计算数据的校验和(类似指纹),一起发送
接收方:重新计算校验和,对比是否一致

 举个栗子🌰

你网购了一箱苹果,快递单上写着“重量5kg”。收到后:

  1. 称重发现只有4kg → 可能运输中丢失(校验失败,拒收)
  2. 重量相符但苹果腐烂 → TCP不检查内容质量(应用层负责)

2.3 重传机制四剑客

重传机制四剑客
机制触发条件特点
超时重传RTO计时器到期保守策略,网络波动时效率低
快速重传收到3个重复ACK效率提升30%+,避免等待超时
SACK选择性确认丢失报文需双方支持,减少无效重传
D-SACK确认重复接收的报文识别伪丢包,优化带宽利用率

超时重传

  • 场景:发送包裹后开始计时,超时未收到签收就重发
  • 难点:如何设置合理超时时间?(动态计算网络延迟)
超时重传机制概述

快速重传

  • 场景:连续收到3个重复ACK(比如收到ACK2三次)
  • 行动:立即重传2号包,不用等超时

2.4 滑动窗口流量控制

接收窗口(rwnd):接收方通过ACK通告剩余缓冲区大小
发送窗口(swnd):swnd = min(rwnd, cwnd)

零窗口探测:通过ZWP技术打破死锁

2.5 拥塞控制四阶段


BBR算法(Google最新方案):基于带宽和延迟的拥塞控制

2.6 顺序保证与去重

接收端重组缓冲区管理
滑动窗口+序列号实现精准排序

2.7 全双工ACK机制

捎带确认技术(Piggybacking)

        有时候,接收方在收到数据后,不用专门马上发一个确认消息给发送方,而是可以趁着自己要给发送方发送数据的时候,顺便把这个确认信息带过去,这就是捎带确认。这么做能减少网络里单独的确认消息数量,让网络用得更有效率。

累计确认与选择确认结合

        在数据传输比较顺利,没有太多丢失和乱序的时候,就用累计确认,简单高效地让发送方知道一大段数据都收到了。而当出现数据丢失或者乱序的情况,接收方就用选择确认,给发送方详细地说明具体哪些数据收到了,哪些没收到,让发送方只重新发送真正丢失的数据。

三、深度剖析:TCP超时重传时间(RTO)计算

3.1 原始算法(RFC 793)

  • 简单平均RTO = α * 平均RTT(α=2,经验值)
  • 缺陷:无法处理网络抖动,容易误判

3.2 Jacobson/Karels算法(RFC 6298)

引入动态方差计算,公式:

SRTT = (1 - α) * SRTT + α * RTT_sample  
RTTVAR = (1 - β) * RTTVAR + β * |SRTT - RTT_sample|  
RTO = SRTT + 4 * RTTVAR
  • 参数取值:α=1/8,β=1/4(通过实验优化)
  • 时钟粒度:RTO最小值为1ms(现代系统)

3.3 Linux内核实现(源码解析)

// net/ipv4/tcp_input.c
void tcp_rtt_estimator(struct sock *sk, long mrtt_us)
{struct tcp_sock *tp = tcp_sk(sk);long m = mrtt_us; // 测得的最新RTT// 首次测量初始化if (tp->srtt_us == 0) {tp->srtt_us = m << 3;  // SRTT = mtp->mdev_us = m << 1;  // 初始方差return;}// 计算SRTT(α=1/8)m -= (tp->srtt_us >> 3);tp->srtt_us += m;// 计算RTTVAR(β=1/4)m = abs(m);if (m > tp->mdev_us)tp->mdev_us += (m - tp->mdev_us) >> 2;elsetp->mdev_us -= (tp->mdev_us - m) >> 5;// 计算RTO边界tp->rttvar_us = max(tp->mdev_us, tcp_rto_min_us(sk));tp->rto = usecs_to_jiffies((tp->srtt_us >> 3) + tp->rttvar_us);
}

3.4 关键问题处理

1. 重传歧义问题
  • 场景:重传后收到ACK,无法确定是对哪个包的确认
  • Karn算法
    a. 重传期间暂停RTT测量
    b. 使用指数退避:RTO = RTO * 2(直到成功传输)
2. 初始RTO设置
  • RFC 6298规定:初始RTO=1秒
  • 实际优化:Linux默认初始RTO=1秒,最小200ms
3. 极端网络抖动
  • RTO上下限
    RTO_min = 200ms(可配置)
    RTO_max = 120秒

四、大厂面试真题解析

腾讯面试题

Q:TCP如何区分流量控制与拥塞控制?
A:流量控制是端到端的接收能力限制(滑动窗口),拥塞控制是全局网络状况的响应(拥塞窗口)。二者共同决定发送窗口:swnd = min(rwnd, cwnd)

阿里面试题

Q:快重传为什么要3个重复ACK?
A:通过三重确认排除网络抖动因素:1个可能是乱序,2个可能是临时延迟,3个基本确认丢包(概率学验证)

字节跳动面试题

Q:TIME_WAIT状态过多的解决方案?
A:1. 开启tcp_tw_reuse 2. 调整tcp_max_tw_buckets 3. 应用层连接池复用

亚马逊面试题

Q:如何设计类TCP的可靠UDP协议?
设计要点:

  1. 添加序列号和确认机制
  2. 实现滑动窗口流量控制
  3. 构建RTT估算模块
  4. 实现选择性重传(SACK)
  5. 应用层拥塞控制(如QUIC协议)


码字不易,希望可以一键三连,我们下期文章再见!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/22237.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一篇搞懂vue3中如何使用ref、reactive实现响应式数据

ref 可实现 基本类型、对象类型响应式数据 reactive&#xff1a;只能实现 对象类型响应式 ref实现 基本类型 数据响应式&#xff1a; <template><div class"person"><h2>姓名&#xff1a;{{ name }}</h2><h2>年龄&#xff1a;{{ ag…

Linux 内核自旋锁spinlock(四)--- queued spinlock

文章目录 前言一、queued spinlock1.1 简介1.2. spin_lock/spin_unlock 二、源码解析2.1 struct qspinlock2.2 struct qnode2.3 queued_spin_lock2.3.1 快速申请通道CPU0申请锁 2.3.2 慢速申请通道CPU0/1申请锁CPU0/1/2申请锁CPU0/1/2/3申请锁 queued_spin_lock_slowpath总结 2…

一种最常见的js加密解密

前言 在前端开发的广袤天地中&#xff0c;你是否遭遇过一些看似“乱码”般的代码&#xff0c;根本无从下手理解&#xff1f;这其实很可能是被 _0x处理过的代码。_0x就像一位神秘的“化妆师”&#xff0c;能把原本清晰的代码改头换面。今天&#xff0c;我就来分享如何破解这些被…

git使用-克隆远程项目、分支管理

文章目录 克隆远程项目到本地1. 远程找到需要克隆的项目&#xff0c;复制ssh地址2. idea开启git版本控制&#xff08;如果已经开了&#xff0c;忽略此步骤&#xff09;3. clone远端项目4. 克隆完成 分支管理1. 新建分支2. 切换分支3. 合并分支4. 储存变化 克隆远程项目到本地 …

Python实战:Excel中文转拼音工具开发教程

在日常办公中&#xff0c;我们经常需要处理Excel文件&#xff0c;有时候需要将中文转换为拼音缩写以方便检索和使用。今天我将分享一个使用Python开发的小工具&#xff0c;它可以自动将Excel文件中指定列的中文转换为拼音缩写。 C:\pythoncode\new\ConvertExcelcontentToPinyin…

什么是矩阵账号?如何高效运营tiktok矩阵账号

‍‌​​‌‌​‌​‍‌​​​‌‌​​‍‌​​​‌​‌​‍‌​​‌​​‌​‍‌​‌‌​‌‌‌‍‌​‌​‌​​​‍‌​​‌​‌‌​‍‌​​​​‌‌​‍‌​‌​​‌‌‌‍‌​​‌‌​‌​‍‌​‌​​‌‌‌‍‌​‌‌‌​​‌‍‌‌​​‌‌‌​‍‌‌​​‌‌​​‍‌…

Docker-技术架构演进之路

目录 一、概述 常见概念 二、架构演进 1.单机架构 2.应用数据分离架构 3.应用服务集群架构 4.读写分离 / 主从分离架构 5.引入缓存 —— 冷热分离架构 6.垂直分库 7.业务拆分 —— 微服务 8.容器化引入——容器编排架构 三、尾声 一、概述 在进行技术学习过程中&am…

并查集算法篇上期:并查集原理及实现

引入 那么我们在介绍我们并查集的原理之前&#xff0c;我们先来看一下并查集所应用的一个场景&#xff1a;那么现在我们有一个长度为n的数组&#xff0c;他们分别属于不同的集合&#xff0c;那么现在我们要查询数组当中某个元素和其他元素是否处于同一集合当中&#xff0c;或者…

MacOS 15.3 卸载系统内置软件

1、关闭系统完整性&#xff08;SIP&#xff09; 进入恢复模式(recovery) 如果您使用的是黑苹果或者白苹果&#xff0c;可以选择 重启按住CommandR 进入&#xff0c;如果是M系列芯片&#xff0c;长按开机键&#xff0c;进入硬盘选择界面进入。 我是MacMini M4芯片&#xff0c;关…

内容中台重构企业内容管理的价值维度与实施路径

内容概要 在数字化转型进程中&#xff0c;企业内容管理&#xff08;ECM&#xff09;与内容中台的差异性体现在价值维度的重构与能力边界的突破。传统ECM系统通常聚焦于文档存储、权限控制等基础功能&#xff0c;而内容中台通过标准化流程引擎与智能工具链&#xff0c;构建起覆…

挖矿病毒实战分析

场景说明 运维人员再设备巡检过程中发现CPU莫名到达百分百&#xff0c;出现异常&#xff0c;请开始你的应急响应排查 cpu百分百&#xff0c;基本就可以确定是中了挖矿病毒了 我们使用命令ps -aux查看进程&#xff0c;或者使用top -c查看进程&#xff0c;排查挖矿程序 使用t…

蓝桥杯好数

样例输入&#xff1a; 24 输出&#xff1a;7 输入&#xff1a;2024 输出&#xff1a; 150 思路&#xff1a;本题朴素方法的时间复杂度是O(n * log10(n)) &#xff0c;不超时。主要考察能否逐位取数&#xff0c;注意细节pi&#xff0c;这样不会改变i,否则会导致循环错误。 #in…

cs*n 网页内容转为html 加入 onenote

csdn上有好用的内容&#xff0c;我们怎么将它们加到 onenote 里吃灰呢。 一、创建 新html create_html.py import sysdef create_html_file(filename):# 检查是否提供了文件名if not filename:print("请提供HTML文件名")return# 创建HTML内容html_content f"…

【后端基础】布隆过滤器原理

文章目录 一、Bloom Filter&#xff08;布隆过滤器&#xff09;概述1. Bloom Filter 的特点2. Bloom Filter 的工作原理 二、示例1. 添加与查询2. 假阳性 三、Bloom Filter 的操作1、假阳性概率2、空间效率3、哈希函数的选择 四、应用 Bloom Filter 是一种非常高效的概率型数据…

【SPIE出版,见刊快速,EI检索稳定,浙江水利水电学院主办】2025年物理学与量子计算国际学术会议(ICPQC 2025)

2025年物理学与量子计算国际学术会议&#xff08;ICPQC 2025&#xff09;将于2025年4月18-20日在中国杭州举行。本次会议旨在汇聚全球的研究人员、学者和业界专家&#xff0c;共同探讨物理学与量子计算领域的最新进展与前沿挑战。随着量子技术的快速发展&#xff0c;其在信息处…

数据库驱动免费下载(Oracle、Mysql、达梦、Postgresql)

数据库驱动找起来好麻烦&#xff0c;我整理到了一起&#xff0c;需要的朋友免费下载&#xff1a;驱动下载 目前收录了Oracle、Mysql、达梦、Postgresql的数据库驱动的多个版本&#xff0c;后续可能会分享更多。

【2025最新版】Chrome谷歌浏览器如何能恢复到之前的旧版本

背景 今天程序突然出了bug&#xff0c;无法自动测试了&#xff0c;显示Chrome版本不匹配&#xff0c;一看&#xff0c;Chrome居然在我已经关闭升级的情况下&#xff0c;又给我升级了&#xff0c;然后就悲剧了&#xff0c;我的代码不能用了。 于是&#xff0c;做了以下几步&…

网络运维学习笔记 017HCIA-Datacom综合实验01

文章目录 综合实验1实验需求总部特性 分支8分支9 配置一、 基本配置&#xff08;IP二层VLAN链路聚合&#xff09;ACC_SWSW-S1SW-S2SW-Ser1SW-CoreSW8SW9DHCPISPGW 二、 单臂路由GW 三、 vlanifSW8SW9 四、 OSPFSW8SW9GW 五、 DHCPDHCPGW 六、 NAT缺省路由GW 七、 HTTPGW 综合实…

出行项目案例

spark和kafka主要通过Scala实现&#xff0c;Hadoop和HBase主要基于java实现。 通过该项目&#xff0c;主要达到以下目的&#xff1a; &#xff08;1&#xff09;通用的数据处理流程&#xff0c;入门大数据领域 &#xff08;2&#xff09;真实体验大数据开发工程师的工作 &a…

2.21力扣-回溯组合

77. 组合 - 力扣&#xff08;LeetCode&#xff09; 一&#xff1a;JAVA class Solution {List<Integer> list new LinkedList<>();List<List<Integer>> ans new LinkedList<>();public List<List<Integer>> combine(int n, int k)…