Microsoft MVP성태의 닷넷 이야기
개발 환경 구성: 659. Windows - IP MTU 값을 바꿀 수 있을까요? [링크 복사], [링크+제목 복사],
조회: 15069
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
(연관된 글이 1개 있습니다.)

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.




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]






[최초 등록일: ]
[최종 수정일: 2/9/2023]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 



2023-04-20 04시33분
정성태

... 91  92  93  [94]  95  96  97  98  99  100  101  102  103  104  105  ...
NoWriterDateCnt.TitleFile(s)
11619정성태7/21/201823143Graphics: 10. Unity로 실습하는 Shader (6) - Mosaic Shading
11618정성태7/20/201819842개발 환경 구성: 387. 삼성 오디세이(Odyssey) 노트북의 운영체제를 새로 설치하는 방법
11617정성태7/20/201820458Team Foundation Server: 50. TFS 소스 코드 관리 기능 (5) - "Rollback", "Rollback Entire Changeset"
11616정성태7/17/201819532Graphics: 9. Unity Shader - 전역 변수의 초기화
11615정성태7/17/201823949.NET Framework: 788. RawInput을 이용한 키보드/마우스 입력 모니터링파일 다운로드1
11614정성태7/17/201826906Graphics: 8. Unity Shader - Texture의 UV 좌표에 대응하는 Pixel 좌표
11613정성태7/16/201823388Graphics: 7. Unity로 실습하는 Shader (5) - Flat Shading
11612정성태7/16/201821354Windows: 148. Windows - Raw Input의 Top level collection 의미
11611정성태7/15/201821721Graphics: 6. Unity로 실습하는 Shader (4) - 퐁 셰이딩(phong shading)
11610정성태7/15/201819117Graphics: 5. Unity로 실습하는 Shader (3) - 고로 셰이딩(gouraud shading) + 퐁 모델(Phong model) + Texture
11609정성태7/15/201822173Graphics: 4. Unity로 실습하는 Shader (2) - 고로 셰이딩(gouraud shading) + 퐁 모델(Phong model)
11608정성태7/15/201825826Graphics: 3. Unity로 실습하는 Shader (1) - 컬러 반전 및 상하/좌우 뒤집기
11607정성태7/14/201826193Graphics: 2. Unity로 실습하는 Shader [1]
11606정성태7/13/201827013사물인터넷: 19. PC에 연결해 동작하는 자신만의 USB 장치 만들어 보기파일 다운로드1
11605정성태7/13/201823374사물인터넷: 18. New NodeMCU v3 아두이노 호환 보드의 내장 LED 및 입력 핀 사용법 [1]파일 다운로드1
11604정성태7/12/201822364Math: 47. GeoGebra 기하 (24) - 정다각형파일 다운로드1
11603정성태7/12/201817620Math: 46. GeoGebra 기하 (23) - sqrt(n) 제곱근파일 다운로드1
11602정성태7/11/201818209Math: 45. GeoGebra 기하 (22) - 반전기하학의 원에 관한 반사변환파일 다운로드1
11601정성태7/11/201821230Math: 44. GeoGebra 기하 (21) - 반전기하학의 직선 및 원에 관한 반사변환파일 다운로드1
11600정성태7/10/201819873Math: 43. GeoGebra 기하 (20) - 세 점을 지나는 원파일 다운로드1
11599정성태7/10/201818793Math: 42. GeoGebra 기하 (19) - 두 원의 안과 밖으로 접하는 직선파일 다운로드1
11598정성태7/10/201820998Windows: 147. 시스템 복구 디스크를 USB 디스크에 만드는 방법
11597정성태7/10/201823240사물인터넷: 17. Thinary Electronic - ATmega328PB 아두이노 호환 보드의 개발 환경 구성
11596정성태7/10/201820642기타: 72. 과거의 용어 설명 - OWIN
11595정성태7/10/201826132사물인터넷: 16. New NodeMCU v3 아두이노 호환 보드의 기본 개발 환경 구성
11594정성태7/8/201821054Math: 41. GeoGebra 기하 (18) - 원의 중심 및 접선파일 다운로드1
... 91  92  93  [94]  95  96  97  98  99  100  101  102  103  104  105  ...