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

TCP 如何保证可靠性

TCP(Transmission Control Protocol)是一种面向连接、可靠、基于字节流的传输层协议。它在不可靠的 IP 网络之上,通过一系列机制来保证数据能够可靠、按序、不重复地传输给对方。


一、TCP 可靠性的定义

可靠性是指:

数据从发送端传输到接收端时,确保数据不丢失、不重复、不乱序。

TCP 相比 UDP 正是通过引入连接管理数据确认机制重传机制等手段来实现这一点。


二、TCP 如何保证可靠性(核心机制)

三次握手建立连接

  • 通过三次握手确保:
    • 通信双方都有接收和发送能力。
    • 序列号初始值(ISN)协商完毕。
  • 防止历史连接请求被误当作当前连接。
Client --> [SYN] --> Server
Client <-- [SYN+ACK] <-- Server
Client --> [ACK] --> Server

序列号和确认号机制(按序传输)

  • 序列号(SEQ):标识每个字节在数据流中的位置。
  • 确认号(ACK):接收方告知发送方下一个期望的字节序号。

例:

Client 发送 SEQ=1, LEN=100
Server 回复 ACK=101 表示已收到前100字节

保证了数据的顺序性和完整性。


校验和(Checksum)

  • 每个 TCP 报文段都带有一个 校验和字段
  • 用于检测数据在传输过程中是否被篡改或损坏。

如果校验失败,数据包会被丢弃,等待重传。


确认应答机制(ACK)

  • 每接收一个数据段,接收方就会发送一个 ACK 报文作为确认。
  • 支持累计确认(确认到某个序号,表示之前的数据都收到了)。

实现了“发—收—确认”的可靠传输流程。


超时重传机制(RTO)

  • 发送方发送数据后若在超时时间内未收到 ACK,则自动重发该数据。
  • 重传时间基于动态估算的 RTT(往返时间)

保证即使 ACK 丢失,数据也不会丢失。


快速重传(Fast Retransmit)

  • 如果接收方连续收到 3 个相同的 ACK(称为 冗余 ACK),
  • 说明某个数据段可能丢失了,立即重传,不等待超时。

提升了网络性能和响应速度。


滑动窗口机制(流量控制)

  • 接收方通过 Window Size 告诉发送方自己还有多少接收缓冲区。
  • 发送方根据窗口限制控制发送速率,避免接收方被淹没。

保证接收方不会因处理不过来而丢包。


拥塞控制机制(网络拥堵控制)

TCP 提供如下拥塞控制算法:

  • 慢启动(Slow Start)
  • 拥塞避免(Congestion Avoidance)
  • 快速重传(Fast Retransmit)
  • 快速恢复(Fast Recovery)

避免因网络过载而导致大量丢包,从而保证传输的稳定性和可靠性。


三、TCP 可靠传输的核心流程图

连接建立(三次握手)↓
数据发送(序列号 + 校验和)↓
接收确认(ACK)↓
丢包重传(RTO / 快速重传)↓
流控 + 拥控(窗口机制)↓
连接断开(四次挥手)

四、TCP vs UDP 对比(可靠性)

特性TCPUDP
是否连接是(需三次握手)否(无连接)
是否可靠传输是,重传 + 校验 + 顺序否,尽力而为
是否保证顺序是(按序传输)否(可能乱序)
传输效率相对低相对高
场景文件传输、HTTP、IM视频、语音、游戏等

五、面试总结

面试问题建议回答
TCP 如何保证数据可靠性?从三次握手、确认机制、重传机制、滑动窗口、拥塞控制等方面回答
如果 ACK 丢失怎么办?发送方会在超时后重传数据
TCP 如何处理乱序数据?接收方根据序列号排序,丢弃重复数据
TCP 校验和检测什么?校验 IP 头、TCP 头和数据部分是否损坏

六、结语

TCP 通过一整套机制(序列号、确认、重传、窗口、握手等)来确保不可靠的 IP 网络上传输的每一字节都准确无误。这也是它在需要可靠传输的场景中被广泛使用的原因。

http://www.xdnf.cn/news/17367.html

相关文章:

  • 深入解析嵌套事务:原理与应用
  • uniapp vue3中使用pinia 和 pinia持久化(没有使用ts)
  • Java NIO 核心原理与秋招高频面试题解析
  • Gitee上免费搭建博客
  • 嵌入式学习---在 Linux 下的 C 语言学习 Day10
  • 《C语言》指针练习题--2
  • Redisson中的分布式锁
  • uni-app vue3 小程序接入 aliyun-rtc-wx-sdk
  • Vscode Data Wrangler 数据查看和处理工具
  • 如何为WordPress启用LiteSpeed缓存
  • Linux 限制 root 登录 IP 地址的方法
  • Activiti 中各种 startProcessInstance 接口之间的区别
  • Java——详解形参实参方法的重载
  • .NET PDF处理组件IronPDF:如何通过 AI 简化开发人员处理 PDF的方式
  • platform总线简介和使用场景说明
  • 设计模式-装饰模式 Java
  • Web开发-JS应用WebPack构建打包Mode映射DevTool源码泄漏识别还原
  • [激光原理与应用-169]:测量仪器 - 能量型 - 光功率计(功率稳定性监测)
  • RepoCoder:仓库级代码补全的迭代检索生成框架解析与应用前沿
  • 基于Python+Vue+Mysql实现(物联网)智能大棚
  • 【tips】css模仿矢量图透明背景
  • Vue 3 入门教程 9 - 表单处理
  • change和watch
  • 酉矩阵(Unitary Matrix)和随机矩阵
  • 拥抱云原生:从传统架构到云原生架构的演进与实践
  • 慢SQL优化实战:从一例线上慢SQL探究执行引擎工作过程
  • 如何快速掌握Excel公式?14天轻松通关
  • 大疆前端笔试题目详解
  • Kafka数据生产和发送
  • 如何将Dubbo从Zookeeper平滑地迁移到Nacos?