TCP 可靠性 = 确保快递
不丢、不乱、不过载
机制 | 作用(快递类比) | 防止的问题 |
---|---|---|
检验和 | 检查包裹是否损坏,损坏就重新发 | 数据出错 |
序列号 | 给每个包裹编号,按顺序整理 | 乱序、重复 |
确认应答 | 每送到一件,就让收件人签收 | 丢失 |
滑动窗口 | 控制一次寄几件,避免堆积 | 过载 |
超时重传 | 快递超时未送达,自动补发 | 丢失 |
拥塞控制 | 高峰期限流,减少派送压力 | 网络堵塞 |
流量控制 | 收件人快递放不下了,暂停派送 | 过载 |
- 滑动窗口和流量控制的个人理解:
- 滑动窗口是限制某一刻的发送大小,而流量控制更像所需发送的全部流量的限制大小
- 即
- 滑动窗口 就像一条限流高速公路,最多同时允许 5 辆车行驶(窗口大小 = 5)。
- 流量控制 相当于整个高速的容量,如果总流量太大(接收端处理不过来),就会限速或关闭部分入口(缩小窗口)。
TCP 如何保证可靠性?
1️⃣ 检验和:接收端检测数据是否出错,若有错误则丢弃并请求重传。
2️⃣ 序列号 & 确认应答:
- 序列号:保证数据按序传输,去重重复数据。
- 确认应答(ACK):接收方收到数据后,发送 ACK 确认,告知发送方已接收的数据范围及下次应发送的位置。
3️⃣ 滑动窗口:动态调整发送数据量,提高传输效率,防止接收端超载。
4️⃣ 超时重传:若发送数据超时未收到 ACK,认为丢失并重新发送,超时时间动态计算。
5️⃣ 拥塞控制:监测网络状态,避免因发送速率过高导致网络拥堵,保证数据高效传输。
6️⃣ 流量控制:接收端通过窗口大小告知发送方自身处理能力,避免数据过载和丢包。
TCP 滑动窗口详解
1. 滑动窗口是什么?
TCP 滑动窗口(Sliding Window)是一种流量控制机制,用于管理发送端和接收端的数据传输速率,确保高效传输的同时,防止接收端超载。
窗口大小指的是不需要等待确认应答包而可以继续发送数据包的最大值。
核心作用:
- 提高传输效率:无需等待每个数据包的 ACK 确认才能继续发送,而是允许发送多个数据包,提高带宽利用率。
- 避免接收方过载:根据接收方的处理能力调整发送速率,防止数据溢出。
2. 滑动窗口的工作过程
假设发送端一次最多发送 5 个数据包,窗口大小 = 5(每个数据包用 ①②③④⑤ 表示):
1️⃣ 初始状态(发送窗口 = 5)
[①②③④⑤] ⑥⑦⑧⑨🔟 ... (窗口大小 = 5,最多可发送 5 个)
- 发送方先发送 ①②③④⑤,等待 ACK 确认。
2️⃣ 收到部分 ACK(窗口右移)
✔① ✔② [③④⑤⑥⑦] ⑧⑨🔟 ...
- ①② 已收到 ACK,窗口向前滑动 2 位,允许发送 ⑥⑦。
3️⃣ 持续滑动(高效传输)
✔① ✔② ✔③ ✔④ ✔⑤ [⑥⑦⑧⑨🔟] ...
- 每次收到 ACK,窗口继续滑动,提高传输效率。
3. 窗口大小如何调整?
1️⃣ 流量控制(Flow Control)
-
接收端
调整窗口大小(rwnd
),防止缓存溢出。例如:-
缓存充足 → 窗口大 → 发送方可发送更多数据。
-
缓存快满了 → 窗口缩小 → 发送方减少数据发送。
-
缓存满了 → 窗口变 0 → 发送方暂停发送,等待窗口恢复。
-
2️⃣ 拥塞控制(Congestion Control)
-
发送端
根据网络情况调整窗口大小(cwnd
),防止网络拥堵。例如:-
网络畅通 →
cwnd
增加,提高发送速率。 -
检测到丢包 →
cwnd
减小,降低发送速率。
-
TCP 拥塞控制详细解析
四大算法:
-
慢开始(Slow Start)
-
拥塞避免(Congestion Avoidance)
-
快速重传(Fast Retransmit)
-
快速恢复(Fast Recovery)
明确拥塞产生的基础过程:A发送报文,B回一个ACK表示收到,循环操作
慢开始
初始阶段指数增长,避免一开始就占满带宽,即每收到一次ACK就指数增长下一次发送报文的大小,但由此带来的问题是,从1开始的指数增长会不会也变得很大,导致拥塞,于是引出拥塞避免
拥塞避免
为慢开始的指数增长设定一个阈值,一旦超过后,不再指数增长,而是每次+1
快速重传
TCP 规定:当发送方连续收到 3 个重复 ACK,说明某个数据包丢失了。发送方立即重传丢失的数据包,而不等待超时。
-
例:发送方发送 pkt1, pkt2, pkt3, pkt4。
pkt2 丢失,接收方收到 pkt3 后,发送 重复 (在很短的时间内)ACK(pkt2)。 -
发送方收到 3 个 ACK(pkt2),立即重传 pkt2,无需等待超时。(如果没有快速重传机制,正常是接收方每收到pkt2,所以一直不发送pkt2的ACK导致发送方没接到这个ACK最终超时,才进行重新发送)
快速恢复
避免慢开始,从丢包前的一半窗口大小开始,随后采用拥塞避免算法逐步增加窗口
- 设想一下当前链路每次传输100,突然丢包,如果没有快速恢复,则根据慢开始算法从1开始,重新增长速度,太低效,因此规定,减少窗口大小到1/2而不从1开始,即,从50开始,同时停止指数增长,每次+1,复用拥塞避免的逻辑而不使用慢开始,这就是快速恢复。
什么是 SYN洪泛攻击?如何防范?
SYN洪泛攻击属于 DOS 攻击的一种,它利用 TCP 协议缺陷,通过发送大量的半连接请求,耗费 CPU 和内存资源。
1. 什么是半连接(Half-Open Connect)
在 TCP 三次握手过程中,服务器发送 [SYN/ACK]
后(第二次握手后),进入 SYN_RECV 状态,等待客户端的 [ACK]
。
- 若收到
[ACK]
,连接建立。 - 若未收到,服务器会 重发
[SYN/ACK]
直至超时,占用资源。
2. SYN 攻击原理
攻击者伪造 大量不存在的 IP 地址,向服务器发送 [SYN]
,服务器回复 [SYN/ACK]
并等待 ACK
,但客户端 不会响应。
- 影响:大量半连接占满队列,导致正常请求无法处理,甚至服务器瘫痪。
- 检测:若服务器出现 大量 SYN_RECV 连接,且来源 IP 随机,基本可判定为 SYN 攻击。
3. SYN 攻击防范
- 网络层防护:
- 通过 防火墙/路由器 过滤异常流量。
- 限制 每个 IP 的 SYN 速率。
- TCP/IP 协议栈优化:
- 增加最大半连接数,提高抗攻击能力。
- 缩短 SYN 超时时间,减少资源占用。
- SYN Cookies 技术:
- 在
SYN/ACK
中嵌入 特殊编码(Cookie),不分配资源,只有客户端回复正确的ACK
才真正建立连接。 - 特点:无需维护半连接队列,可有效抵御 SYN 攻击。
- 在
https://github.com/0voice