2

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

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

预先感谢。

4

5 回答 5

11

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

于 2009-06-24T08:54:08.913 回答
3

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

于 2009-06-24T19:05:29.970 回答
3

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

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

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

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

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

于 2010-08-19T16:55:41.383 回答
2

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

于 2010-07-08T08:52:10.203 回答
0

It makes less sense to fragment TCP than it does to fragment UDP. Since TCP provides a reliable segmentation/reassembly/retransmission mechanism, one can just send smaller TCP segments and avoid the whole necessity for fragmentation (this is what d3jones is talking about).

In UDP, however, fragmentation still makes sense. You can send a single UDP segment greater in length than the MTU. The IP layer will fragment it correctly and invisibly. The application developer doesn't have to determine the MTU or anything about the network in order to code the application layer protocol.

于 2010-06-21T04:47:24.443 回答