【计算机网络】TCP的可靠性保证

可以把 TCP可靠性保证 理解成一句话:

TCP 为了让数据"发得出去、收得到、不乱序、不丢失、不压垮对方、不压垮网络",设计了一整套机制。

你这段内容整体是对的,我帮你串起来解释。


1. 序列号和确认号:保证数据有顺序、可确认

TCP 不是以"一个包"为单位管理数据,而是以 字节流 为单位管理数据。

比如发送方要发 1000 个字节:

text 复制代码
字节编号:1 2 3 4 ... 1000

每个字节都有自己的序列号。

假设发送方发送:

text 复制代码
Seq = 1,长度 = 1000

表示这次发送的是:

text 复制代码
序列号 1 ~ 1000 的数据

接收方收到后,会回复:

text 复制代码
ACK = 1001

意思是:

1 ~ 1000 我都收到了,下一次你从 1001 开始发。

所以 ACK 确认号不是表示"我收到了哪个字节",而是表示:

我期望你下一个发给我的字节序号。


2. 超时重传:保证丢了还能补发

如果发送方发出数据后,一直没有收到 ACK,就会认为数据可能丢了。

比如:

text 复制代码
发送方发送 Seq = 1,长度 = 1000

但是等了很久没有收到:

text 复制代码
ACK = 1001

那么发送方就会重新发送这段数据。

这就是 超时重传

简单理解:

发出去没人回应,就等一段时间;超过时间还没回应,就重发。


3. 流量控制:照顾接收方,别把接收方撑爆

流量控制解决的是:

接收方处理不过来怎么办?

接收方有一个接收缓冲区,比如大小是 10KB。

如果发送方发得太快,接收方来不及处理,缓冲区就可能被塞满。

所以接收方会通过 TCP 头部中的 窗口大小 rwnd 告诉发送方:

text 复制代码
我现在还能接收多少数据

例如:

text 复制代码
rwnd = 5000

表示:

我现在最多还能接收 5000 字节,你别超过这个量。

所以流量控制的核心是:

接收方控制发送方的发送速度,防止接收方缓冲区溢出。

注意:流量控制关注的是接收方能力。


4. 拥塞控制:照顾网络,别把网络堵死

拥塞控制解决的是:

网络承受不了怎么办?

即使接收方很强,网络中间的路由器、链路也可能被打满。

所以 TCP 不能一上来就疯狂发送,而是要试探网络的承载能力。

这里有两个核心窗口:

text 复制代码
rwnd:接收窗口,接收方告诉你的
cwnd:拥塞窗口,发送方根据网络情况自己算的

真正能发送多少数据,取二者较小值:

text 复制代码
发送窗口 = min(rwnd, cwnd)

也就是说:

接收方不让你多发,你不能多发;网络不允许你多发,你也不能多发。


重点:拥塞控制过程

1. 慢启动:从小到大,指数增长

刚开始 TCP 不知道网络情况好不好,所以先小心一点。

一开始:

text 复制代码
cwnd = 1

每经过一个 RTT,大致翻倍:

text 复制代码
1 -> 2 -> 4 -> 8 -> 16

这叫 慢启动

名字叫"慢启动",但增长其实很快,是指数增长。

它的意思不是增长慢,而是:

不要一开始就把窗口开很大,而是从小窗口开始试探。


2. 拥塞避免:达到门限后,线性增长

如果一直指数增长,网络很快就可能被打爆。

所以 TCP 设置了一个 慢启动门限 ssthresh

当:

text 复制代码
cwnd >= ssthresh

就不再指数增长,而是进入 拥塞避免

拥塞避免阶段增长变慢:

text 复制代码
16 -> 17 -> 18 -> 19

也就是每经过一个 RTT,拥塞窗口大约 +1。

简单理解:

前期大胆试探,后期谨慎增加。


3. 拥塞发生:出现丢包

TCP 判断网络可能拥塞的常见方式是:

text 复制代码
发生丢包

丢包有两种典型表现:


情况一:收到 3 个重复 ACK

例如发送方发了:

text 复制代码
1~1000
1001~2000
2001~3000
3001~4000

假设中间:

text 复制代码
1001~2000 丢了

接收方收到了 1~1000,所以回复:

text 复制代码
ACK = 1001

后面它又收到了 2001~3000,但中间缺了 1001~2000,所以它还是回复:

text 复制代码
ACK = 1001

又收到 3001~4000,还是回复:

text 复制代码
ACK = 1001

发送方连续收到多个相同的 ACK,就知道:

后面的数据你都收到了,但中间某一段丢了。

这时候不用等超时,直接重传丢失的数据。

这叫 快速重传

然后 TCP 认为:

网络可能有点拥塞,但还没糟糕到完全不通,因为接收方还能持续返回 ACK。

所以它不会直接把 cwnd 变成 1,而是:

text 复制代码
cwnd = cwnd / 2
ssthresh = cwnd / 2

然后进入线性增长。

这叫 快速恢复

简单理解:

收到 3 个重复 ACK,说明网络只是轻微拥塞,所以窗口减半,不必从头开始。


情况二:超时重传

如果发送方发出数据后,很久都没有收到 ACK,直到超时。

这说明问题可能更严重:

数据可能丢了,ACK 也没回来,网络可能已经很拥塞了。

所以 TCP 的处理更激进:

text 复制代码
ssthresh = cwnd / 2
cwnd = 1

然后重新进入慢启动。

简单理解:

超时说明网络可能真的不行了,所以重新从 1 开始试探。


快速记忆版

TCP 可靠性可以这样记:

text 复制代码
序列号:给数据编号,保证顺序
确认号:告诉对方我收到哪了
超时重传:丢了就重发
流量控制:别把接收方撑爆
拥塞控制:别把网络撑爆
连接管理:三次握手建立连接,四次挥手释放连接

拥塞控制可以这样记:

text 复制代码
慢启动:指数增长,快速试探
拥塞避免:线性增长,谨慎增加
3个重复ACK:快速重传,窗口减半
超时重传:网络较差,窗口变1,重新慢启动

最核心区别

机制 解决什么问题 关注对象
流量控制 接收方处理不过来 接收方
拥塞控制 网络承受不了 网络
超时重传 数据丢失 可靠传输
序列号/确认号 顺序和确认 数据本身
三握四挥 连接可靠建立和关闭 连接状态

一句话总结:

流量控制是"别把对方发爆",拥塞控制是"别把路发堵",重传机制是"丢了我再补",序列号和 ACK 是"我知道你收到哪了"。

相关推荐
专注_每天进步一点点5 小时前
SLB(绑定弹性公网ip)-gateway-业务pod,gateway上出现reset by peer,业务pod上没有reset by peer
服务器·tcp/ip·gateway
CHANG_THE_WORLD6 小时前
TCP 三次握手彻底解析:SYN、ACK、SEQ、确认号与状态迁移
网络·网络协议·tcp/ip
2501_915106326 小时前
TraceEagle 代理抓包教程 本机和手机的 HTTPS 抓包方法
网络协议·计算机网络·网络安全·ios·adb·https·udp
DLYSB_7 小时前
基于 HTTP API 与 Modbus 协议的多源监控声光语音联动告警系统设计与实现
网络·网络协议·http·报警灯
Bobolink_8 小时前
手机端和电脑端的网络环境配置有什么不同?
网络·智能手机·电脑·网络环境
星恒讯工业路由器9 小时前
三大工业以太网协议选型对比
网络·物联网·ethercat·profinet·ethernet/ip·工业以太网协议
春卷同学9 小时前
HarmonyOS掌上记账APP开发实践第25篇:Image 组件高级用法 — 资源引用、网络图片与首字符占位方案
网络·华为·harmonyos
mounter6259 小时前
从内存隔离到运行时防线:透视 Linux 内核安全强化的博弈与演进
linux·网络·安全·linux kernel·kernel
Bug退散师11 小时前
多路IO复用[select版TCP服务器与poll版TCP服务器]与常用网络编程函数详解
linux·服务器·c语言·网络·驱动开发·tcp/ip
Acrellea12 小时前
固态变压器(SST)热管理破局:安科瑞交直流专属测温方案护航无人值守运维
运维·网络