【发布时间】:2010-11-05 10:45:44
【问题描述】:
我正在寻找为什么在 IP 级别完成分段,但为什么不用于 TCP/UDP。
假设我的框架看起来像 |MAC|IP|TCP|Payload|FCS。整个大小,例如:1600。PathMTU 发生在这里,为什么在 IP 级别实现分片是我的问题,为什么不实现@TCP/UDP 级别/代码。
提前致谢。
【问题讨论】:
标签: c++ networking tcp ip-protocol
我正在寻找为什么在 IP 级别完成分段,但为什么不用于 TCP/UDP。
假设我的框架看起来像 |MAC|IP|TCP|Payload|FCS。整个大小,例如:1600。PathMTU 发生在这里,为什么在 IP 级别实现分片是我的问题,为什么不实现@TCP/UDP 级别/代码。
提前致谢。
【问题讨论】:
标签: c++ networking tcp ip-protocol
这正是 TCP/IP 堆栈和 ISO/OSI 模型中的多个层的用途。 TCP/UDP 是传输协议,它们不应该关心碎片——这不是它们的问题。 IP 级别处理网络并处理分段,因为分段的大小取决于网络属性。具有解决问题的最佳条件的层确实解决了问题。
【讨论】:
一些 TCP 实现也会确定 MTU 并确定其段的大小以避免碎片化。这样做可以提高有损条件下的可靠性,因为任何接收到的 TCP 段都可以被确认而不是重新传输。只有丢失的 TCP 段会被重传。相反,如果任何 IP 数据报片段丢失,则不会收到任何有用的信息。
【讨论】:
对 TCP 进行分段比对 UDP 分段更有意义。由于 TCP 提供了一种可靠的分段/重组/重传机制,因此可以只发送较小的 TCP 分段并避免整个分段的必要性(这就是 d3jones 所说的)。
然而,在 UDP 中,分片仍然有意义。您可以发送长度大于 MTU 的单个 UDP 段。 IP 层将正确且不可见地对其进行分段。应用程序开发人员无需确定 MTU 或任何有关网络的信息即可对应用程序层协议进行编码。
【讨论】:
如果在更高层(TCP、UDP 等)上执行分片,那么这将使分片/重组冗余实现(每个协议一次);如果在较低层(以太网、ATM 等)上执行分段,那么这将需要在每一跳上执行分段/重组(可能非常昂贵)并冗余实施(每个链路层协议一次)。因此,IP 层是最有效的分片层。
【讨论】:
第 4 层 (TCP/UDP) 仅在端点(发送方/接收方)出现。 第 3 层 (IP) 以每跳为基础进入图片。
MTU 是链路的一个属性,但基于此链路属性 (MTU) 的分段总是在路由器的 IP 层(跃点)完成
现在每一跳之间的链路可以有不同的带宽,所以在每一跳都必须决定如何将数据包转发到目的地。由于 MTU 是可以推送到链路上的最大数据量,如果它小于要发送的数据包的大小,则必须将其分成更小的块以适应链路。
由于碎片和重组有许多缺点,例如 1. CPU和内存开销小幅增加 2. 由于添加了片段标头,每个数据包的开销更大 3. 如果一个片段丢失,发送者必须传输整个数据包
为了解决以上问题, 1.可以使用Path MTU Discovery。 2. 在第 4 层,可以使用 TCP MSS-clamping。
【讨论】: