【计算机网络】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 是"我知道你收到哪了"。

相关推荐
Yang96111 小时前
煤矿 SDH/PDH 线路检修难?鼎讯 HM-G2500 手持式传输分析仪实用解析
运维·服务器·网络
逆境不可逃1 小时前
【WebSocket 02】 握手拦截实现 Token 鉴权、Ping/Pong 心跳保活、前端断线自动重连
网络·websocket·网络协议
安当加密1 小时前
汽车OTA升级怎么保证安全?从固件签名到密钥全生命周期管理
网络·安全·汽车
网络研究院1 小时前
关键基础设施与认知领域:网络攻击作为跨海事、能源和数字网络的胁迫工具
网络·能源·网络攻击·海洋·关键基础设施
byte轻骑兵2 小时前
【AVRCP】规范精讲[23]: 字符集切换全流程与两种典型场景解析
网络·人机交互·媒体·avrcp·媒体控制·车机蓝牙
InHand云飞小白2 小时前
连锁门店IT运维实战:如何用“云+端“架构解决分布式网络管理难题
运维·网络·5g·安全·智能路由器·5g路由器
Anthony_2312 小时前
Linux 从基础操作到故障排查
linux·运维·服务器·网络·nginx·ubuntu·centos
折翅鵬10 小时前
Android史诗级网络优化实践总结
android·网络
网安小白的进阶之路13 小时前
B模块 安全通信网络 第二门课IPv6与WLAN 01
网络·安全