分组交换的可靠性来自哪里?


目录


疑问?

我们都知道分组交换采用存储转发的技术,路由器收到相关分组后,会先存储到其内存中,然后查询路由表后再进行转发,如果此时路由器发生故障(如突然断电),那是不是我这个路由器上的存储的分组就丢失了呢?

答案:是的,如果路由器在分组还没有转发出去之前突然故障,这些存储在缓冲区(Buffer)中的分组通常就会丢失。

那实际生产中分组交换的可靠性来自哪里呢?接着往下看。

谁保证了可靠性?

分组交换为什么要存储转发?

假设有一个数据包

复制代码
PC A
 │
 │  IP Packet
 ▼
Router1
 │
 ▼
Router2
 │
 ▼
Server

Router1收到完整的数据包以后,会经历几个步骤:

复制代码
① 接收整个数据包
② 放入缓存(Buffer)
③ 检查IP头
④ 查询路由表(FIB)
⑤ 找到下一跳
⑥ 放入发送队列
⑦ 发出去

所以它确实要"存储",且这个存储一般不是硬盘,而是内存 RAM(Buffer),通常就是几十MB、几百MB甚至更大的高速缓存。

如果这时候路由器坏了包会丢吗?

答案:一定会丢。

例如:

复制代码
PC
 │
 ▼
Router1
   ↑
Packet
正在Buffer里面

突然:

复制代码
Router1
Power Off

那么RAM里的Buffer全部没了

因为RAM断电即失,所以这个Packet真的丢了。

这就是 Packet Loss(丢包),互联网允许发生丢包。

为什么互联网还能正常通信?

答案:IP协议本身就是不可靠协议(Best Effort)。

IP协议只保证:尽力帮你送达。

它不会保证:

  • 一定送到
  • 一定按顺序
  • 一定不重复
  • 一定不丢

所以RFC里面把IP叫:Best Effort Delivery(即尽力而为)。

那是谁保证可靠?

答案:主要是 TCP。

例如:

复制代码
发送100个Packet

1
2
3
4
5
...
100

Router2坏了,导致:

复制代码
Packet

45
46
47

丢失

接收端收到:

复制代码
1
2
3
...
44

48
49
...
100

TCP就会马上发现:

复制代码
45呢?

没收到

于是:

复制代码
ACK

一直ACK 44 或者发送SACK信息。

发送端发现:

复制代码
哦

45没到

重新发送:

复制代码
45
46
47

因此应用层感觉不到,因为TCP帮你补发了。

UDP怎么办?

答案:UDP没有重传,是一种不可靠的传输协议。

如果 Packet 丢了,就是真的没了。

例如:视频会议第324帧丢了,就直接播放下一帧,不会补,因为补回来已经晚了。

整个路由器坏了后面传输又怎么办?

答案:动态路由

例如:

复制代码
      R2
     /
PC--R1
     \
      R3

正常:

复制代码
PC

↓

R1

↓

R2

↓

Server

R2坏了,路由协议会重新收敛:

复制代码
PC

↓

R1

↓

R3

↓

Server

这就是动态路由,设计到的相关协议为:

  • OSPF
  • IS-IS
  • RIP
  • BGP

路由器会根据这些协议重新计算最短路径,于是后续Packet就会走另一条路。

注意:已经在R2缓冲区里的那些Packet还是会丢,只是之后的新Packet改走别的路,最终通过 TCP 可靠传输协议对丢失部分的数据进行重传。

其他疑问?

路由器为什么不把Packet写磁盘?

答案:因为磁盘的读写速率太慢。

也许你会想:既然RAM会丢,为什么不存SSD?

原因很简单,磁盘读写速度太慢(即便是 SSD)。

例如:一个100G接口 ≈ 12.5GB/s

如果每个Packet都:

复制代码
写SSD

↓

读SSD

↓

发送

延迟会暴涨,而互联网要求延迟几十微秒、甚至几微秒,SSD根本来不及。

因此,所有高性能路由器都是:

复制代码
Packet

↓

ASIC

↓

Buffer(RAM)

↓

发送

而不会落盘。

如果路由器Buffer满了怎么办?

答案:路由器主动丢包

例如:出口1G,入口10G

瞬间:100万个Packet进入

Buffer 放不下,于是直接Drop,这叫 Tail Drop 或 RED(Random Early Detection),即主动提前丢一些包。

TCP看到丢包以后降低发送速度,形成TCP拥塞控制。

所以,丢包并不是异常,而是互联网正常运行的一部分。

结论

互联网并不是依靠路由器保证数据不丢,而是依靠端到端协议(主要是 TCP)和网络冗余来保证最终可靠。

相关推荐
小王C语言5 分钟前
【8.进行接口测试】:通过 curl 进行接口自动化测试 / 通过 python 程序进行接口自动化测试
网络·c++
一条大祥脚7 分钟前
26杭电暑期第三场 DP|费用流|分解质因子|数论|贪心|图论|期望|无穷级数
网络·图论·网络流·无穷级数·费用流
早睡早起身体好12328 分钟前
为什么 Network 中会出现两个同名请求?——CORS 预检请求学习笔记
网络·笔记·学习·网络安全
daad7771 小时前
记录matlab状态机demo
java·网络·matlab
paopaokaka_luck2 小时前
基于springboot3+vue3的智能文库平台(AI智能搜索、AI智能汇总、实时在线状态展示、多格式文档预览与富文本编辑、Echarts图形化分析)
前端·网络·spring boot·网络协议·echarts
Yang96112 小时前
告别“慢工出细活”:如何平衡光纤熔接的速度与精度?
网络
Nebula_g3 小时前
Java实现本地Socket通信(四)
网络
QH139292318804 小时前
Keysight N9917B N9918B手持式综合微波分析仪
网络·科技·嵌入式硬件·集成测试·信息与通信
Drgfd4 小时前
半导体国产替代进入“深水区”:决战设备、材料、IP三大高地
网络·fpga开发
我星期八休息4 小时前
扩展— TCP 全连接队列与 tcpdump 抓包
linux·服务器·开发语言·前端·网络·tcp/ip·tcpdump