无Windows管理员权限时如何为单个Java控制台应用配置MTU
首先得明确:修改网卡全局MTU确实需要管理员权限,这是Windows系统层面的限制,没办法绕开。但如果你的目标是让Java应用发送的数据包适配特定MTU大小(避免因超MTU导致的分片、丢包问题),还是有不需要管理员权限的解决方案的,主要从应用代码层面入手:
针对UDP数据包:手动控制单包大小
UDP协议本身不处理数据包分片(或分片后的重组失败会直接丢包),所以你可以在代码里计算出符合目标MTU的最大 payload 大小,然后限制每一次发送的数据包不超过这个值。公式很简单:最大UDP payload = 目标MTU值 - 20(IP头部固定大小) - 8(UDP头部大小)
比如目标MTU是1400的话,单包数据就不能超过1372字节。你可以在使用DatagramSocket发送DatagramPacket时,直接控制数据包的字节数组长度,或者封装一个工具方法自动拆分大的数据为符合大小的多个小包发送。针对TCP连接:依赖TCP的路径MTU发现(PMTU)
TCP协议本身会自动进行路径MTU发现,自动调整发送的分段大小以适配链路MTU,不需要你手动干预。如果你的应用用的是TCP,其实不用额外做什么,协议本身会处理MTU适配的问题。
至于你问的JVM参数或Windows进程级参数:目前没有现成的JVM参数可以直接设置应用的MTU,Windows也没有针对单个进程设置MTU的非管理员权限可用的选项——因为MTU是网卡级别的系统配置,不属于进程隔离的资源范畴。
总结一下:如果是UDP场景,通过代码控制单包大小就能实现适配MTU的需求,完全不需要管理员权限;如果是TCP场景,协议本身已经帮你处理了MTU适配的问题。
备注:内容来源于stack exchange,提问作者PaulEdison

