我想使用UDP进行进程间通信,我知道UDP数据报的最大大小为〜64K。但是对于回送来说是否正确?
答案 0 :(得分:0)
TL; DR :如果不关心IP碎片,则为64k。如果可以,则为MTU。
即使UDP最大数据包大小为64k,实际的传输大小还是由接口的MTU控制。
任何大于MTU的数据包(包括IP和UDP开销)将被分段为多个第二层数据包。
因此,尽管您始终可以发送64k UDP数据包,但最终可能会收到多个IP数据包,这增加了延迟并增加了数据包丢弃的机会(如果丢失一个片段-所有数据报都会丢失)。
好消息是您不必担心碎片问题-内核将负责碎片和重组,因此您的应用程序将看到一个大小为64k的数据报。
由于您正在询问回送接口,因此数据包丢弃不是问题,因此仅受UDP的size字段约束。
如果要避免IP分段,则需要查询接口的MTU,并确保数据报更小(再次包括IP和UDP开销)。
在我的Mac上,回送接口的默认MTU为16384:
$ ifconfig lo0
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
...
在Linux上,您可以使用SIOCGIFMTU
/ SIOCSIFMTU
ioctl(man 7 netdevice)以编程方式获取/设置接口MTU。