【问题标题】:Why Fragmentation is Done at IP why not for TCP/UDP为什么分片是在 IP 上完成 为什么不是 TCP/UDP
【发布时间】:2010-11-05 10:45:44
【问题描述】:

我正在寻找为什么在 IP 级别完成分段,但为什么不用于 TCP/UDP。

假设我的框架看起来像 |MAC|IP|TCP|Payload|FCS。整个大小,例如:1600。PathMTU 发生在这里,为什么在 IP 级别实现分片是我的问题,为什么不实现@TCP/UDP 级别/代码。

提前致谢。

【问题讨论】:

    标签: c++ networking tcp ip-protocol


    【解决方案1】:

    这正是 TCP/IP 堆栈和 ISO/OSI 模型中的多个层的用途。 TCP/UDP 是传输协议,它们不应该关心碎片——这不是它们的问题。 IP 级别处理网络并处理分段,因为分段的大小取决于网络属性。具有解决问题的最佳条件的层确实解决了问题。

    【讨论】:

    • 假设我的框架看起来像 |MAC|IP|TCP|Payload|FCS。整个大小,例如:1600。PathMTU 发生在这里,为什么在 IP 级别实现分片是我的问题,为什么不实现@TCP/UDP 级别/代码。
    • @Brian Agnew,如果您可以按照您希望我编辑的方式编辑问题,它可能会非常完整。 :)。提前致谢。
    【解决方案2】:

    一些 TCP 实现也会确定 MTU 并确定其段的大小以避免碎片化。这样做可以提高有损条件下的可靠性,因为任何接收到的 TCP 段都可以被确认而不是重新传输。只有丢失的 TCP 段会被重传。相反,如果任何 IP 数据报片段丢失,则不会收到任何有用的信息。

    【讨论】:

      【解决方案3】:

      对 TCP 进行分段比对 UDP 分段更有意义。由于 TCP 提供了一种可靠的分段/重组/重传机制,因此可以只发送较小的 TCP 分段并避免整个分段的必要性(这就是 d3jones 所说的)。

      然而,在 UDP 中,分片仍然有意义。您可以发送长度大于 MTU 的单个 UDP 段。 IP 层将正确且不可见地对其进行分段。应用程序开发人员无需确定 MTU 或任何有关网络的信息即可对应用程序层协议进行编码。

      【讨论】:

        【解决方案4】:

        如果在更高层(TCP、UDP 等)上执行分片,那么这将使分片/重组冗余实现(每个协议一次);如果在较低层(以太网、ATM 等)上执行分段,那么这将需要在每一跳上执行分段/重组(可能非常昂贵)并冗余实施(每个链路层协议一次)。因此,IP 层是最有效的分片层。

        【讨论】:

          【解决方案5】:

          第 4 层 (TCP/UDP) 仅在端点(发送方/接收方)出现。 第 3 层 (IP) 以每跳为基础进入图片。

          MTU 是链路的一个属性,但基于此链路属性 (MTU) 的分段总是在路由器的 IP 层(跃点)完成

          现在每一跳之间的链路可以有不同的带宽,所以在每一跳都必须决定如何将数据包转发到目的地。由于 MTU 是可以推送到链路上的最大数据量,如果它小于要发送的数据包的大小,则必须将其分成更小的块以适应链路。

          由于碎片和重组有许多缺点,例如 1. CPU和内存开销小幅增加 2. 由于添加了片段标头,每个数据包的开销更大 3. 如果一个片段丢失,发送者必须传输整个数据包

          为了解决以上问题, 1.可以使用Path MTU Discovery。 2. 在第 4 层,可以使用 TCP MSS-clamping。

          【讨论】:

            猜你喜欢
            • 2011-04-03
            • 2010-09-26
            • 1970-01-01
            • 2021-12-27
            • 2016-11-15
            • 1970-01-01
            • 1970-01-01
            • 2010-11-02
            • 2014-06-07
            相关资源
            最近更新 更多