dev-lake / udp-merge-demo

A IP fragment merge demo for UDP

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

传输层分包与合并

说明

在讨论UDP协议的分包问题时,有几个关键点需要理解:

  1. UDP报文的最大长度:理论上,UDP报文的最大长度是65507字节。然而,在实际应用中,为了减少UDP包丢失的风险,最好能控制UDP包在下层协议的传输过程中不要被切割。这是因为UDP是一个不可靠的传输协议,它没有提供数据包丢失后的恢复机制。因此,控制数据包的大小以避免在传输过程中的分割是一个常见的做法(来源:知乎)。
  2. MTU(最大传输单元):MTU是指通信协议的链路层上面所能通过的最大数据包大小。对于UDP来说,单个传输的最大内容通常是1472字节(考虑到IP头和UDP头的大小)。不同的网络环境下,MTU的值可能不同,例如Internet环境下标准MTU值为576字节,因此UDP的数据长度应该控制在548字节以内,以避免分片(来源:CSDN博客)。
  3. UDP分包与组包:当IP数据包的大小超过了其所在环境中MTU的大小时,就会对IP数据包进行分片。如果分片中的任何一个片段丢失,那么就需要重传所有的分片数据。这种消耗是比较大的,因此在设计UDP传输时,考虑分包与组包的策略是非常重要的(来源:知乎)。
  4. UDP与IP层分片:UDP协议本身没有自己的传输控制机制,它完全使用IP层提供的能力进行不可靠传输。与TCP流式协议不同,UDP是有消息边界的,一个UDP包代表一个完整消息。如果一个UDP数据包的大小大于MTU-28(IP包头+UDP包头的大小),则会发生IP层的分片(来源:知乎)。

综上所述,UDP协议在处理大数据包时需要特别注意数据包的大小,以避免在网络层面发生分片,从而增加数据丢失的风险。设计时应考虑到网络环境的MTU限制,并可能需要实现自己的分包与组包逻辑,以确保数据的完整性和传输效率。

TCP 分片每片都有自己的头部,但是UDP就一个头部,而且TCP的分片是在传输层而言的,所以 TCP 的分片是对下面三层完全透明的,网络层和链路层不管你的传输层是不是分片了。UDP不分片,意思就是:UDP一次交付一整个报文。

UDP(用户数据报协议)是一种无连接的协议,它不保证数据包的顺序、可靠性或数据完整性。这意味着发送的数据包可能会因为网络拥堵、路由变化或其他网络问题而以不同的顺序到达目的地,或者甚至可能根本不到达。

数据包分析

  • 如果不是最后一个包,MF 位是 1,Offset + (TotalLength - 20) == 下一个包的 offset
  • MF 位是 0
  • 传输层的协议类型可以直接从 IP 协议头中拿到

Untitled

Untitled

About

A IP fragment merge demo for UDP


Languages

Language:Go 100.0%