如何测量数据包在读取多播时从服务器接收的最大传输单元(MTU)
问题描述:
我是一名新手,在我的一些网络编程上担心。我正在通过多播读取数据(请参阅下面的代码),并希望查找最大传输单位(MTU)或我可以读取的传输单位。任何人都可以引导我到一个来源或方式来做到这一点。谢谢。如何测量数据包在读取多播时从服务器接收的最大传输单元(MTU)
try {
InetAddress add = InetAddress.getByName("127.0.0.1");
MulticastSocket socket = new MulticastSocket(1234);
socket.joinGroup(add);
byte[] bb = new byte[2500];
while (true) {
DatagramPacket data = new DatagramPacket(bb, bb.length);
datagramSocket.receive(data);
processDataReceived(bb);
}
datagramSocket.leaveGroup(socket);
}
catch (IOException e) {
e.printStackTrace();
}
答
我不知道什么是你的意图,但对于这个答案,我会假设你想要得到的大小BB,以确保没有数据包将被截断。
MulticastSocket类从DatagramSocket继承。 DatagramSocket有一个getReceiveBufferSize()方法,以字节为单位返回最大套接字接收缓冲区。
答
最大数据报可以收到由65507(IPv4)的边界或您的套接字接收缓冲区大小,以较低者为准。
MTU是最大可以是发送的,它是发件人的几件事的财产加上65507的总体限制如上。它与接收没有任何关系。在实践中,由于IP分割,它低至576或534或一些这样的数字。
在理想系统上,mutlicast的MTU将为64千字节,因为它使用UDP服务发送消息。但是,真正的MTU将由网络上的物理硬件决定。 IIRC当数据包对于最小MTU来说太大时,数据包将被底层服务(假设它仍然低于64KB)分割,发送和重新创建(透明地)。所以我不认为你可以通过使用Java DatagramPacket对象来找到它。 – flakes