Windows - IP MTU 값을 바꿀 수 있을까요?
MTU의 크기는 여러 가지 명령어를 통해 알아낼 수 있습니다.
// 리눅스의 MTU 확인
$ ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.28.96.233 netmask 255.255.240.0 broadcast 172.28.111.255
inet6 fe80::215:5dff:fed3:44d5 prefixlen 64 scopeid 0x20<link>
ether 00:15:5d:d3:44:d5 txqueuelen 1000 (Ethernet)
RX packets 1613023 bytes 144197674 (144.1 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 2374447 bytes 266671016 (266.6 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
// Windows의 MTU 확인
C:\temp> netsh interface ipv4 show subinterfaces
MTU MediaSenseState Bytes In Bytes Out Interface
---------- --------------- ------------ ------------ -------------
4294967295 1 0 281167 Loopback Pseudo-Interface 1
1500 5 0 0 Local Area Connection
1500 1 7572426 10258697 vEthernet (Default Switch)
1500 1 451576156 127743835 vEthernet (WSL)
코드로 구하고 싶다면
getsockopt 함수를 이용하면 되는데, 예를 들면,
// C# 예제 코드
public const int IPPROTO_IP = 0;
public static int IP_MTU
{
get
{
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
return 73;
}
return 14;
/* 만약 WSL/Linux 환경에서 73으로 전달하면 실행 시 예외 발생
Unhandled exception. System.Net.Sockets.SocketException (92): Protocol not available
at System.Net.Sockets.Socket.UpdateStatusAfterSocketErrorAndThrowException(SocketError error, Boolean disconnectOnFailure, String callerName)
at System.Net.Sockets.Socket.GetRawSocketOption(Int32 optionLevel, Int32 optionName, Span`1 optionValue)
at Program.Main(String[] args) in C:\temp\ConsoleApp1\ConsoleApp1\Program.cs:line 26
*/
}
}
UdpClient client = new UdpClient("192.168.100.50", 60900);
byte[] buffer = new byte[4];
client.Client.GetRawSocketOption(IPPROTO_IP, IP_MTU, buffer);
int result = BitConverter.ToInt32(buffer, 0);
Console.WriteLine($"MTU_SIZE: {result}"); // 대개의 경우 1500 (Jumbo Frame 사용 시 9000)
# 파이썬 예제 코드 (리눅스에서 실행)
import socket
IP_MTU = 14 # 리눅스 14, 윈도우 73
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(('192.168.100.50', 60900))
mtu = s.getsockopt(socket.IPPROTO_IP, IP_MTU)
print('mtu', mtu) # 대개의 경우 1500
이렇게 구할 수 있습니다. 위의 코드에서 한 가지 재미있는 건, UDP 소켓일지라도 connect를 호출해 줘야 IP_MTU 크기가 구해진다는 점입니다. 만약 connect 과정을 생략하고 호출하면 이런 오류를 만나게 됩니다. ^^
$ python3 test.py
Traceback (most recent call last):
File "test.py", line 14, in <module>
mtu = s.getsockopt(socket.IPPROTO_IP, IP_MTU)
OSError: [Errno 107] Transport endpoint is not connected
// C#의 경우
System.Net.Sockets.SocketException: 'A request to send or receive data was disallowed because the socket is not connected and (when sending on a datagram socket using a sendto call) no address was supplied.'
그런데, 혹시 MTU 크기를 변경하는 것이 가능할까요? 검색해 보면 윈도우의 경우 netsh 명령어를 통해 가능은 합니다.
How To: Change and Check Windows MTU Size
; https://becomethesolution.com/how-to-change-and-check-windows-mtu-size
// 관리자 권한으로 실행
C:\Windows\System32> netsh
netsh> interface
netsh interface> ipv4
netsh interface ipv4> set subinterface "vEthernet (WSL)" mtu=1400 store=persistent
Ok.
단지, MTU 자체가 하위 프로토콜 제약을 받는 것이므로 줄일 수는 있어도 늘리는 것은 안 됩니다. 가령 1500 mtu인 경우 1바이트라도 늘리려는 시도는 이렇게 오류가 발생합니다.
netsh interface ipv4> set subinterface "vEthernet (WSL)" mtu=1501 store=persistent
The parameter is incorrect.
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]