Linux下使用udp传输recvfrom()函数的应用

 

UDP包最大是多大呢?UDP头部大小字段占16字节,所以理论上是65535个字节大小。但是UDP如果是通过IP(大多数情况)来传送,由于UDP本身不支持分片,所以一个UDP包只能通过一个IP包来传送,一个IP包大大小理论上也是用16字节表示,这样UDP最大大小就是(65535-IP头部)。

 

而现实中如果IP包大小大于底层链路层帧的最大数据区大小,则必须对IP包进行分片传送。分片会严重影响传送效率,而且增大不稳定性,所以实际的网络程序发送的IP包都封装到单一的链路层帧中,从而避免分片。问题是链路层帧是多大呢?答案是不一定,因为不同的物理网络的帧大小不一样,如以太网是1500字节,但是其他物理网络可能更小,Internet上的有个最小的限制,那就是576字节。如果UDP程序运行在只运行在以太网中,那么为了避免IP分片,可以采用的最大大小为(1500-20-8)=1472字节。如果UDP程序需要运行在Internet上,那么建议最大大小为(576-20-8)=548字节。

 

上面是实践中的最佳UDP大小,但是并不是所有程序都采用上述经验,所以对于接收缓冲区的大小也就没有一个标准,而是取决于应用程序设计者本身。虽然对于Windows平台,recvfrom()能够提示调用者buf过小的问题,但是即使得到了这个错误,包还是被丢弃了。所以在接收UDP包时,一定要事先了解应用层设计的最大UDP包大小,然后按照最大值开辟接收缓冲区

sitemap