• 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. ​​

  • 相关阅读:
    吴恩达《机器学习》1-4:无监督学习
    Go : const rotates恒定旋转(附完整源码)
    较真:js判断中文字符串长度的正确方法
    Android RecycleView列表实现画廊效果
    使用spring注解时@Service注解,在注入时为null的问题
    RabbitMQ 入门系列:8、扩展内容:接收信息时:可否根据RoutingKey过滤监听信息,答案是不能。
    椭圆曲线加密算法中公钥与私钥互换性分析
    SpringBoot SpringBoot 基础篇 4 基于 SpringBoot 的SSMP 整合案例 4.2 SSMP 整合案例模块创建
    循环神经网络不常应用于,循环神经网络应用举例
    Bash脚本实现Linux开机自启Redis,Nginx,MySQL等服务
  • 原文地址:https://blog.csdn.net/hqiangtai/article/details/125393859