当前位置:   article > 正文

UDP的MTU发现_udp mtu

udp mtu

一些典型的MTU值: 

网络:                                    MTU字节
超通道                                  65535
16Mb/s信息令牌环(IBM)               17914
4Mb/s令牌环(IEEE802.5)              4464
FDDI                                   4352
以太网                                  1500
IEEE802.3/802.2                         1492
X.25                                    576
点对点(低时延)                         296

    路径MTU:如果两台主机之间的通信要通过多个网络,那么每个网络的链路层就可能有不同的MTU。重要的不是两台主机所在网络的MTU的值,重要的是两台通信主机路径中的最小MTU。它被称作路径MTU。

对于不同的PATH 的MTU,需要实现前期的MTU探索算法:

1、把socket设置为ip包不可分片模式 ,这样从client发送一系列不同大小的包到server,超过MTU的包自然会被丢弃。这样可以得到路径MTU值。

2、java 实例

  1. Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
  2. int count = 0;
  3. while (networkInterfaces.hasMoreElements()) {
  4. NetworkInterface next = networkInterfaces.nextElement();
  5. System.out.println("getName获取网络设备名称=" + next.getName());
  6. System.out.println("getDisplayName获得网络设备显示名称=" + next.getDisplayName());
  7. System.out.println("getMTU获得最大传输单元=" + next.getMTU());
  8. System.out.println("**********************" + count++);
  9. }
  1. import java.net.NetworkInterface;
  2. public static int getMaximumTransferUnit() {
  3. try {
  4. return NetworkInterface.getByInetAddress(InetAddress.getLocalHost()).getMTU();
  5. } catch (Throwable throwable) {
  6. try {
  7. boolean foundDevice = false;
  8. int lowestMaximumTransferUnit = Integer.MAX_VALUE;
  9. for (Enumeration<NetworkInterface> networkInterfaces = NetworkInterface
  10. .getNetworkInterfaces(); networkInterfaces.hasMoreElements(); ) {
  11. NetworkInterface networkInterface = networkInterfaces.nextElement();
  12. int maximumTransferUnit = networkInterface.getMTU();
  13. if (maximumTransferUnit < lowestMaximumTransferUnit
  14. && maximumTransferUnit >= RakNet.MINIMUM_TRANSFER_UNIT) {
  15. lowestMaximumTransferUnit = maximumTransferUnit;
  16. foundDevice = true;
  17. }
  18. }
  19. if (foundDevice == false) {
  20. throw new IOException("Failed to locate a network interface with an MTU higher than the minimum ("
  21. + RakNet.MINIMUM_TRANSFER_UNIT + ")");
  22. }
  23. return lowestMaximumTransferUnit;
  24. } catch (Throwable throwable2) {
  25. throwable2.printStackTrace();
  26. return -1;
  27. }
  28. }
  29. }​
  30. ​​

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/483180
推荐阅读
相关标签
  

闽ICP备14008679号