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

  • 相关阅读:
    代码随想录算法训练营第四十六天丨 动态规划part09
    第9章 【MySQL】InnoDB的表空间
    【踩坑专栏】禁止kafka自带的日志
    uCOSIII实时操作系统 六 内部任务(空闲函数)
    前后端分离同步/异步实现文件上传(boot+vue+elementUI)
    UE5中实现沿样条线创建网格体2-SplineMesh版本
    1358:中缀表达式值(expr)
    el-date-picker日期列表样式更换为完全不同的样式保证弹出日期弹窗的功能不变
    驱动开发第二天
    fusion 360制作机械臂
  • 原文地址:https://blog.csdn.net/hqiangtai/article/details/125393859