• MTU(Maximum Transmission Unit)는 네트워크 인터페이스에서 세그먼트 없이 보낼수 있는 최대 데이터그램 크기 값
  • 데이터가 MTU 값 이상이라면 여러개의 패킷으로 분할
  • MTU는 패킷이 한번에 보낼 수 있는 최대 크기라고 함
  • 주로 사용하는 이더넷의 MTU 값은 일반적으로 1500 바이트
  • 과거의 모뎀을 통해 접속하던 PPPoE 연결은 1492 바이트를 가짐
  • 점보프레임은 9000 바이트의 큰 크기를 가짐


MSS(Maximum segment size)

  • MTU는 각 패킷 프레임 안에 최대 전송할 수 있는 값 → MSS(Maximum segment size)
  • MTU는 MSS + TCP/IP 헤더 크기 → 반대로 MSS는 MTU - 40 바이트가 됨
  • 40 바이트는 IP와 TCP 헤더 각각 20 바이트임
  • 일반적으로 사용하는 TCP 환경에서 애플리케이션이 사용할 수 있는 크기는 헤더를 제외한 1460 바이트 → MSS가 1460를 의미
  • RFC1323에서 정의한 타임스탬프 옵션이 확장되어 사용되면 12바이트가 늘어 1448 바이트까지 사용 가능

1.TCP 프로토콜 연결시 SYN 패킷을 보낼 때 MSS 크기를 함께 보냄

  • SYN 패킷 안에 0x0204 0x05B4 값이 있음 → 0x0204 0x05B4는 MSS를 의미
  • 02 → MSS 옵션의 시작점
  • 04 → 옵션의 크기(4바이트)
  • 0x05B4 → 크기를 의미하는데, 10진수로 표시하면 1460 바이트
  • MSS 크기를 전송하면 받는 측에서도 어떤 크기로 전송해야 할지 알고 준비하게 됨

2.MTU와 속도 상관 관계

  • 전용선 라인 T1을 사용한다고 가정 → T1은 1.544Mbps (1,544,000 bits/sec)
  • 1개 패킷을 전송할 때 속도 → MTU가 1500 바이트 가정하면, (1460 + 40 ) * 8 / 1544000 = 7.772ms
  • 1Mbytes의 파일을 전송
  • 1Mbyte는 1024KB 이고 바이트로는 1,048,576 바이트
  • 1Mbyte를 전송하려면 패킷의 데이터 영역인 MSS(1460)으로 나눠야함 → 1048576bytes / 1460 = 718.2
  • 1MByte를 T1라인에서 전송하려면 718.2 * 7.772 = 5581ms 시간 발생
  • T1라인에서는 1Mbyte 크기의 데이터를 전송하는데 꽤 오랜 시간이 발생한다고 할 수 있음
  • T1라인을 사용한다고 하고, 다른 네트워크 환경을 감안하지 않고 산술적으로 계산한 것이기에 실제와 다를 수 있음 → 이론적인 것이므로 네트워크 환경에 따라 달라짐


리눅스의 MTU 값 확인 → ifconfig 명령어를 이용하면 쉽게 확인이 가능

  • ifconfig 명령어를 통해 확인한 인터페이스 상태

    $ ifconfig eth0
    eth0      Link encap:Ethernet  HWaddr bc:ae:c5:xx:xx:xx
            inet addr:192.168.xx.xx Bcast:192.168.xx.255  Mask:255.255.255.0
            inet6 addr: fe80::beae:xxxx:xxxx:b436/64 Scope:Link
            UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
            RX packets:22530399 errors:0 dropped:0 overruns:0 frame:0
            TX packets:16150847 errors:0 dropped:1 overruns:0 carrier:0
            collisions:0 txqueuelen:1000
            RX bytes:10308945022 (10.3 GB)  TX bytes:3971757833 (3.9 GB)
            Interrupt:45 Base address:0x2000

  • mtu 값 변경도 ifconifg 명령어를 통해 쉽게 가능

    $ ifconfig eth0 mtu 9000



윈도우 MTU 확인

  • 윈도우에서는 netsh 명령어를 통해 인터페이스 정보를 확인 가능

    C:\>netsh interface ip show interface
    
    The Routing and Remote Access Service is not currently running on the local machine.
    Please use 'net start remoteaccess' on the machine to start the service.

  • 서비스가 시작되어 있지 않다고 remoteaccess 서비스를 시작

    C:\>net start remoteaccess
    System error 1058 has occurred.
    
    The service cannot be started, either because it is disabled or because it has no enabled devices associated with it.

  • Startup Type을 자동 또는 수동으로 변경후 시작해 주면, 인터페이스 결과를 얻을 수 있음

  • 윈도우에서는 netsh 명령어를 통해 인터페이스 정보를 확인 가능 (MTU 1500 확인 가능)

    C:\Users\hippo>netsh interface ip show interface 
    색인     메트릭         MTU          상태                이름
    ---  ----------  ----------  ------------  ---------------------------
     1          75  4294967295  connected         Loopback Pseudo-Interface 1
    18           5       65535      disconnected     OpenVPN Wintun
    15          50        1500      connected         Wi-Fi
    21           5         1500      disconnected     이더넷
     9          25         1500      connected         OpenVPN TAP-Windows6
     2          25         1500      disconnected     로컬 영역 연결* 1
     5          65         1500      disconnected     Bluetooth 네트워크 연결
    10          25        1500      disconnected     로컬 영역 연결* 10
    32          15        1500      connected         vEthernet (WSL)
    23          35        1500      connected         VMware Network Adapter VMnet1
     7          35         1500      connected         VMware Network Adapter VMnet8

  • ping 명령어에 -l 옵션으로 데이터 크기를 지정하여 ping 테스트

    1. MTU 크기 값 이상이 되면 Fragment 메시지를 볼 수 있게 되어, MTU를 알 수 있음
    2. 인터페이스에 설정된 MTU 값은 1500 바이트
    3. IP 헤더가 20 바이트이고 ICMP 헤더가 8바이트(TYPE, CODE, CHECKSUM, DATA)로 1500 - 28 = 1472 바이트됨
    4. 만약 1473 바이트로 ping을 날리면 fragment가 필요하다고 출력됨
      C:\>ping -f -l 1472 packetinside.com
      Ping packetinside.com [216.239.38.21] 1472바이트 데이터 사용:
      216.239.38.21의 응답: 바이트=68 (1472 보냄) 시간=76ms TTL=53
      216.239.38.21의 응답: 바이트=68 (1472 보냄) 시간=74ms TTL=53
      216.239.38.21의 응답: 바이트=68 (1472 보냄) 시간=74ms TTL=53
      216.239.38.21의 응답: 바이트=68 (1472 보냄) 시간=72ms TTL=53
      216.239.38.21에 대한 Ping 통계:
      패킷: 보냄 = 4, 받음 = 4, 손실 = 0 (0% 손실),
      왕복 시간(밀리초):
      최소 = 72ms, 최대 = 76ms, 평균 = 74ms

  • 1472 바이트보다 크게 1 바이트를 늘려서 전송해 보았더니 fragment 가 필요하다고 출력

    C:\>ping -f -l 1473 packetinside.com
    Ping packetinside.com [216.239.38.21] 1473바이트 데이터 사용:
    패킷 조각화가 필요하지만 DF가 설정되어 있습니다.
    패킷 조각화가 필요하지만 DF가 설정되어 있습니다.
    패킷 조각화가 필요하지만 DF가 설정되어 있습니다.
    패킷 조각화가 필요하지만 DF가 설정되어 있습니다. 
    216.239.38.21에 대한 Ping 통계:
     패킷: 보냄 = 4, 받음 = 0, 손실 = 4 (100% 손실),

참고 : http://www.packetinside.com/2013/02/mtumaximum-transmission-unit.html

+ Recent posts