为什么有人说碎片化是不好的并且由于性能问题而必须避免,而实际上碎片化本质上发生在通信中?
示例: 用户 1想要向用户 2发送 100 000 个字节
连接节点的网络设备的最大 MTU 大小为 1500 字节。
TCP 中的最大 MSS 大小为 1460 字节
在发送过程中,100000 bytes / 1460 => ~70包;因此,分割会自动发生。
我在这里缺少什么?
问候
为什么有人说碎片化是不好的并且由于性能问题而必须避免,而实际上碎片化本质上发生在通信中?
示例: 用户 1想要向用户 2发送 100 000 个字节
连接节点的网络设备的最大 MTU 大小为 1500 字节。
TCP 中的最大 MSS 大小为 1460 字节
在发送过程中,100000 bytes / 1460 => ~70包;因此,分割会自动发生。
我在这里缺少什么?
问候
分段在路由器中是资源密集型的,它会减慢数据包转发速度。今天,我们使用 PMTUD 来确定路径中的最小 MTU,以便在发送之前正确调整数据包的大小。还有分片攻击,所以很多商家会掉分片。
你所困惑是一样的东西TCP分段,这比完全不同的碎片。分段发生在源主机中,而不是路径中的路由器中,因此路由器可以以最高速度转发,而不是暂停对数据包进行分段并执行所有必要的计算并构建新的数据包分段。
IPv6 消除了路径内数据包分段。在发送之前,它必须使用 PMTUD 来查找路径中的最小 MTU 并正确调整数据包的大小。这是加快数据包转发的选择之一。请参阅有关此问题的答案。
当发送方没有正确了解路径的 MTU 时,就会发生 IP 数据包级分段。这会导致比数据包已经在端点正确调整大小的性能更差。
例如,如果 TCP 连接的发送方认为路径 MTU 为 1500 字节,它将发送该大小的数据包。如果实际路径 MTU 为 1400 字节,它们将在路由器上被分割为一个 1396 字节的数据包和一个 104+headers = 124 字节的数据包。处理两倍数量的数据包的开销可能很大。
另一个影响是,如果数据包的一个片段丢失,则必须重新传输所有片段。
IP 分片会导致 TCP 级别的过度重传。
TCP 将信息作为一系列段传输,这些段也是确认和重传的单位。如果 TCP 段在网络中丢失,则必须重新传输整个段。
如果发生 IP 分片,该段将被拆分为多个分片。接收系统在接收到它的所有片段之前无法确认一个片段。
这意味着如果单个片段丢失,则需要重新传输它所属的整个片段。为了避免这个潜在的问题,TCP 尝试调整其段的大小,以便它们不需要被分段。这样,如果数据包丢失,则只需重新传输该数据包。
重传通常会对 TCP 吞吐量产生巨大影响。TCP 的设计假设丢包通常是由于网络拥塞,而避免这种情况的方法是减少使用的网络带宽量,即减慢传输速度。所以当段丢失时,我们必须重新发送它们(使用更多的网络资源)并且我们减慢速度。这些都是有害的,所以我们尽量减少重传的数量。
使分段大小等于路径 MTU(减去 TCP 和 IP 标头长度)可以减少需要重新传输分段的可能性。想象一下,100 个数据包中有 1 个丢失了。如果每个数据包只有一个段,则意味着我们只重传了 1% 的段。但是,如果分段导致分段平均分成 5 个数据包,我们将重新传输 5% 的分段。