Property | Behavior |
---|---|
Datagram | Individually routed packets. Hop-by-hop routing. |
Unreliable | Packets might be dropped. |
Best effort | ..but only if necessary. |
Connectionless | No per-flow state. Packets might be mis-sequenced. |
IPv4
Fragmentation
IP Fragmentation is generally a BAD thing. Depends on the upper layer to fragment packets. (probably kernel)
可能导致的问题有:
- 同上面提到的 MTU 为什么是 1500 一样的问题:假设拆分成了 3 个包,丢了一个包就相当于全丢了,丢包率直接变成(假设丢包率是 10%,那么3个包都不丢的概率就是 90%^3=72.9%)27%;
- 导致 TCP 乱序:现在网络很多设备都是针对 TCP 做优化的,比如,根据 TCP 的 port number 去 hash 到同一条路由上去,减少 TCP reorder 的概率。但是如果 IP fragmentation 发生的话,后续的 IP 包在路由器看来并不是 TCP 包,因为 TCP header 只在第一个 fragment 上才有,所以会导致 hash 失效,从而更容易发生 TCP 乱序;另外,对段会等齐所有的 fragment 到达才会交给上层,这也导致了延迟增加和乱序的发生;
- 产生一些比较难 debug 的问题;
- 不是所有系统都能处理 IP Fragmentation,比如 Google GCE;
此外,IP Fragmentation 本身就存在一些攻击面
- IP fragment overlapped:攻击者精心设计了很多 IP 分片,它们互相重叠,理论上这种包是无法在网络上出现的。如果服务器收到这些分片,可能无法正确处理(IP 实现的 Bug),那么可能会崩溃;
- IP fragment overrun:攻击者通过 IP 分片的方式,发送的 IP 包组装之后超过了 65535,可能造成服务器崩溃(溢出);
- IP fragmentation buffer full:攻击者一直发送 IP 分片,more-fragments 一直设置为 true,导致服务器收到 IP 包的时候,只能存储在 buffer 中试图将它们组装起来,直到内存耗尽 (DDoS);
- 其他构造的无法正确组装的 IP 包。可能导致 DDoS,或者可能导致 IDS(入侵检测系统)无法正确组装并识别这些包,导致这些包绕过安全系统进入了服务器,最终构造出攻击。参考 Rose Fragmentation Attack
- IP fragment too many packets
- IP fragment incomplete packet
- IP Fragment Too Small