目录疑问谁保证了可靠性分组交换为什么要存储转发如果这时候路由器坏了包会丢吗为什么互联网还能正常通信那是谁保证可靠整个路由器坏了后面传输又怎么办其他疑问路由器为什么不把Packet写磁盘如果路由器Buffer满了怎么办结论疑问我们都知道分组交换采用存储转发的技术路由器收到相关分组后会先存储到其内存中然后查询路由表后再进行转发如果此时路由器发生故障如突然断电那是不是我这个路由器上的存储的分组就丢失了呢答案是的如果路由器在分组还没有转发出去之前突然故障这些存储在缓冲区(Buffer)中的分组通常就会丢失。那实际生产中分组交换的可靠性来自哪里呢接着往下看。谁保证了可靠性分组交换为什么要存储转发假设有一个数据包PC A │ │ IP Packet ▼ Router1 │ ▼ Router2 │ ▼ ServerRouter1收到完整的数据包以后会经历几个步骤① 接收整个数据包 ② 放入缓存(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 ... 100Router2坏了导致Packet 45 46 47 丢失接收端收到1 2 3 ... 44 48 49 ... 100TCP就会马上发现45呢 没收到于是ACK 一直ACK 44 或者发送SACK信息。发送端发现哦 45没到重新发送45 46 47因此应用层感觉不到因为TCP帮你补发了。UDP怎么办答案UDP没有重传是一种不可靠的传输协议。如果 Packet 丢了就是真的没了。例如视频会议第324帧丢了就直接播放下一帧不会补因为补回来已经晚了。整个路由器坏了后面传输又怎么办答案动态路由例如R2 / PC--R1 \ R3正常PC ↓ R1 ↓ R2 ↓ ServerR2坏了路由协议会重新收敛PC ↓ R1 ↓ R3 ↓ Server这就是动态路由设计到的相关协议为OSPFIS-ISRIPBGP路由器会根据这些协议重新计算最短路径于是后续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和网络冗余来保证最终可靠。