TCP和UDP最大数据包大小

时间:2020-02-10 10:29:16

标签: c linux tcp udp packet-sniffers

使用recvfrom(2)从网络获取数据包时,我每次获取1个数据包。

此功能获得的TCP / UDP数据包的最大长度是多少?

2 个答案:

答案 0 :(得分:2)

recvfrom将始终为UDP返回正好一个数据包。 UDP数据包最多可以提供64KB的大小,也可以占用几个报头字节。实际上,大多数UDP协议都不会在单个数据包中发送那么多数据。因此,根据协议规定,传递给recvfrom的缓冲区大小可以少得多。

对于TCP,通常使用recv而不是recvfrom从连接的套接字读取传入的数据。许多人会指出,TCP是一种流协议,而不是像UDP这样的消息/分组协议。因此,recv将给您带来不确定的字节数,介于1和传递给recv调用本身的缓冲区大小之间。始终检查recv调用中的返回值-不保证会为您提供任何特定的字节数。

答案 1 :(得分:2)

TCP中没有固定限制,因为它是流协议,而不是数据报协议。

在基于IPv4的UDP中,限制为65,507个字节。来自Wikipedia

长度
该字段指定UDP标头和UDP数据的字节长度。最小长度为8个字节,即标头的长度。字段大小为UDP数据报设置了65,535字节(8字节报头+ 65,527字节数据)的理论限制。但是,由底层IPv4协议施加的实际数据长度限制为65,507字节(65,535-8字节UDP标头-20字节IP标头)。

使用IPv6 jumbograms可以使UDP数据报的大小大于65,535字节。 RFC 2675指定如果UDP标头和UDP数据的长度大于65,535,则将length字段设置为零。

请注意,使用极大的UDP数据报可能会出现问题。很少有网络链路具有如此大的MTU,因此数据报很可能会碎片化。如果丢失任何片段,则必须由应用程序层重新发送整个数据报(如果应用程序要求并实现可靠性)。 TCP通常使用“路径MTU发现”以适合路径中所有链接的最小MTU的段形式发送流。如果某个段丢失,则TCP可以在此之后重新传输这些段(如果实现了选择性确认,则可以仅重新传输丢失的段,大多数TCP实现现在都提供了该段)。

相关问题