发送一个数据包,大小有多重要?

问题描述:

我试图将UDP数据包发送到另一台服务器,以通知它有新的信息可用。数据包中的数据相当小,大约有100个字节,基本上是一个事件类型和一个UUID。发送一个数据包,大小有多重要?

我知道多少信息适合一个数据包(What is the largest Safe UDP Packet Size on the Internet)的局限性,它看起来不像我会遇到任何问题。我知道UDP数据包可能会丢失 - 在我的情况下,这很好,这个数据包只是一个建议,用于优化其他服务器知道新数据的速度,丢失数据包会使应用程序响应速度变慢,但会不会破坏事物。

考虑到这一点,我的问题是这个数据包的大小是多少关系?如果我将这些信息编码为JSON,它看起来将是大约75-100字节。我也可以将信息编码为更小的原始二进制格式(我可以将它适用于30字节或更少的格式)。

是一个UDP数据包与100字节的有效载荷去旅行“慢”比30字节的有效载荷?我知道每个数据包都有开销,但是如果我已经避免了碎片化(这显然会让事情变得更慢,更不可靠),那么对于数据包大小会影响性能,我不清楚。有效载荷的大小是否会影响数据包丢失的可能性?总而言之,我试图决定是更好地制作一个更隐蔽但更紧凑的格式,或者使用JSON来更容易地修改和维护与应用程序演变时的向后兼容性,但绝对更大就每个数据包的大小而言。

+1

在您提到的限制内并不重要。你需要知道以太网还有一个*最小*的大小,所以使它非常小可能根本没有任何影响。 – EJP

+0

再想一想,在我看来,在网络不饱和的情况下,它几乎没有什么区别。数据包将传输,如果时间更长,则可能需要相对较少的纳秒(1Gb网络上的每位大约1纳秒)。如果这些数据包饱和网络,那么额外的〜60%的空间可能很重要(通过避免由于较小的尺寸导致网络饱和)。否则,它似乎确实没有任何实际影响。我不认为我的用例会使网络饱和,但我没有真正想过。 –

谈论大约100字节或30字节的数据的大小并不重要。它不会让您的应用程序性能更低或更高。此外,大小不会影响在路由器上丢弃数据报的可能性。路由器在拥塞时丢弃数据报。

但是,根据您的应用程序,您可能希望在单个UDP消息中发送更多事件。这里有100字节和30字节之间的差异。 UDP数据报的开销为IP报头20字节,UDP报头8字节(+以太网报头)。为了更好地利用网络和CPU资源,最好每个数据报发送更多的数据,所以使用30个字节,您可以在单个数据报中发送大约3倍的数据。这确实会影响性能。在一个数据报中发送N个事件可以节省网络资源和CPU资源(消息少,消息开销少,中断少等)。如果在一个数据报中打包N个事件,每个数据报的建议限制是MTU,以太网为1500字节,考虑20个字节的IP报头和8个字节的UDP报头,你可以发送高达1472字节的有效载荷(14个100字节的事件)。