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

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.dtcms.com/a/319833.html

相关文章:

  • Linux openssl、openssh 升级 保留旧版本
  • 【插件式微服务架构系统分享】之 解耦至上:gateway 网关与APISIX 网关的不同分工
  • React 为什么要自定义 Hooks?
  • 一文解读“Performance面板”前端性能优化工具基础用法!
  • 顺序表——C语言
  • FPGA学习笔记——VGA静态字符的显示(寄存器)
  • SOMGAN:利用自组织映射提高生成对抗网络的模式探索能力
  • 国内PCB批量厂家推荐
  • Linux 文件IO与标准IO的区别解析
  • wordpress安装环境推荐php8.0+mysql5.7
  • Linux Docker 新手入门:一文学会配置镜像加速器
  • 谷歌推出Genie3:世界模型的ChatGPT时刻?
  • 8.3.1 注册服务中心Etcd
  • MHA架构实战
  • 我在学习spring 项目构建时遇到问题,解决JDK最低版本只有17的问题
  • 佳文赏读 || 冶炼钒钛矿高炉操作炉型计算模拟研究
  • 【大前端】vite忽略指定前缀的静态资源
  • 移动端 WebView 登录异常与会话恢复问题全流程排查指南
  • 灯哥FOC笔记-----(1)无刷电机概论和硬件控制原理
  • 高精度惯性导航IMU供应商价格选型
  • 面向制造业的 AI Agent 架构与实战:任务驱动的智能协同新路径
  • 常见命令-资源查看-iostat命令实践
  • React 中 Context(上下文)介绍
  • ReAct Agent 原生代码实现(纯Python实现)
  • OpenAI推出开源GPT-oss-120b与GPT-oss-20b突破性大模型,支持商用与灵活部署!
  • 使用RestTemplate发送与接收http/https请求
  • 告别YAML,在SpringBoot中用数据库配置替代配置文件
  • 【JS】扁平树数据转为树结构
  • [激光原理与应用-172]:测量仪器 - 能量(焦耳)与功率(瓦)的图示比较
  • 14-netty基础-手写rpc-提供方(服务端)-06