我是一个新手,tyring我的手在一些网络编程。我读通过多播数据(见下面的代码),并希望找到最大传输单元(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的总限额与上述几件事情的性质。它没有任何与接收。在实践中更是低至576或534或一些这样的数字,因为IP fragementation的。
什么是MTU的
最大传输单位是绝对不会通过它传播的整个路径进行分段的数据包的最大尺寸。注意,片提到,这种碎片通常会发生透明的,甚至超过UDP!所以,你的包可能会安全到达重组,即使你很显著超越您的路径MTU。
所以MTU值大多是降低发送用于中间节点,并可能降低从保持数据包传回用于重组其最慢的片引起的等待时间的开销的工具。
如何找到的MTU,一般
RFC 4821是这一进程的一个很好的简介。
总之:发送ICMP的ping了“拒收片段”标志和一些垃圾填充数据。侦听一个ICMP“包太大”的消息。如果您收到ping回复,请重新发送具有较大的ping包。如果你得到一个“包太大”,重新发送具有较小平。通过这种方式可以种对你的实际MTU二进制搜索。
不幸的是,因为这是多播...
RFC 4821的Section 5.4说,
在多播目的地地址的情况下,分组的副本可以穿过许多不同的路径到达许多不同的节点。 “路径”到多播目的地的本地代表必须实际上代表一种潜在的大组路径。
最低限度地,要使用的一个实现可以保持单一MTU值对所有多播数据包源自节点。这种MTU应足够小,使得它预期是小于包括所述多播树中的所有路径的路径MTU。如果小于所配置的组播MTU是经由单播装置学到了路径MTU,组播MTU可以减小到这个值。这种做法很可能会导致使用较小的数据包的比许多路径是必要的。
如果使用多播应用程序获取完整送达报告(不可能的,因为这要求具有较差的缩放属性),PLPMTUD可以在这样的多播协议来实现的是MTU在一组了解到最小的路径变得有效MTU该组。
因此,它可能不是非常可行找到一个MTU为组播用户。
不幸的是,因为这是Java的...
Java不支持ICMP。在所有。它不是真的有可能做到这一点通过UDP - 由于透明的重组,我们永远不知道当碎片发生。
因此,我们有两个选择
TL,DR;我可能会在一千二百八十零分之五百七十六银行分别支持IPv4 / IPv6的。
(注:负68个字节对于IPv4 UDP包,或48个字节的IPv6 UDP包)