모든 이야기

패킷은 얼마나 커질 수 있을까: MTU와 MSS

MTU는 특정 링크에서 운반할 수 있는 네트워크 계층 패킷의 최대 크기다. 단위는 보통 바이트이며, 이더넷에서 흔히 보는 IP MTU 1500은 애플리케이션이 1500바이트의 데이터를 그대로 넣을 수 있다는 뜻이 아니다. IP와 전송 프로토콜의 헤더도 그 안에 들어가야 한다.

MTU 1500에서 IP와 TCP 헤더를 뺀 1460바이트 데이터 공간과 경로의 최소 MTU를 함께 보여주는 그림

MTU는 패킷 전체의 한계이며, 실제 데이터 공간은 헤더와 경로 조건에 따라 줄어든다.

1500바이트에서 빠지는 공간

IPv4 헤더가 20바이트이고 TCP 헤더도 옵션 없이 20바이트라면, MTU 1500 안에 들어갈 TCP 데이터의 상한은 1460바이트다. TCP의 MSS는 세그먼트에 담는 TCP 데이터의 최대 크기를 나타낸다. IPv6 기본 헤더는 40바이트이므로 같은 단순 조건에서는 1440바이트가 된다. 옵션, 확장 헤더, 터널 캡슐화가 있으면 실제 공간 계산은 더 달라진다.

통신 경로에는 여러 링크가 있고 각각의 MTU가 다를 수 있다. 경로 MTU는 그 경로에서 통과해야 할 링크들의 최소 MTU다. 출발지 링크가 큰 패킷을 받아 준다고 해서 전체 경로가 같은 크기를 허용하는 것은 아니다. 특히 VPN과 터널은 안쪽 패킷을 바깥 헤더로 감싸므로 예상보다 작은 유효 MTU를 만들 수 있다.

IPv4에서는 조건에 따라 패킷을 단편화할 수 있다. 수신 측은 조각들을 모아 원래 IP 데이터그램을 복원한다. 조각 하나가 없어도 전체 데이터그램을 완성할 수 없고, 재조립을 위한 상태와 자원이 필요하다. IPv6 라우터는 패킷을 단편화하지 않으며 필요하면 출발지가 대응해야 한다.

크기를 알아내는 통신

경로 MTU 탐색은 너무 큰 패킷에 대한 네트워크의 피드백을 이용해 전송 크기를 조절한다. 고전적인 IPv4 방식은 단편화 금지 조건과 ICMP 오류를 활용한다. 그런데 필요한 ICMP가 차단되면 작은 요청은 통과하지만 큰 응답은 멈추는 블랙홀 현상이 나타날 수 있다. 패킷화 계층에서 실제 전달 성공을 탐색하는 접근도 있다.

큰 패킷은 같은 데이터 양을 운반할 때 헤더와 패킷 처리 횟수를 줄일 수 있다. 반면 모든 경로가 큰 크기를 지원해야 하고, 한 패킷이 링크를 점유하는 시간이 길어진다. 점보 프레임을 켠 장비 한 대만으로 인터넷 전체 전송이 빨라지지는 않는다.

문제를 확인할 때는 인터페이스 MTU, 터널 유무, 협상된 MSS, 실제 세그먼트 크기를 따로 보는 것이 좋다. MTU와 MSS를 같은 숫자로 적거나 단편화와 TCP 분할을 같은 동작으로 생각하면 원인을 놓치기 쉽다. 전자는 네트워크 패킷의 한계이고, 후자는 TCP가 바이트 스트림을 담는 방식의 한계다.

MSS 협상 역시 양쪽이 어디까지 이해하는지 구분해야 한다. TCP 연결 설정 때 알린 MSS는 상대가 자신에게 보내는 TCP 데이터의 크기에 관한 정보다. 그것만으로 경로의 모든 링크 MTU가 검증되지는 않는다. 예를 들어 출발지와 도착지 모두 MTU 1500을 사용하더라도 중간 터널의 유효 한계가 1400이면 추가 조절이 필요하다. 또한 운영체제의 세그먼트 오프로딩 때문에 로컬 패킷 캡처에 실제 선로보다 큰 단위가 보일 수 있다. 캡처 지점과 하드웨어 분할 여부를 함께 확인해야 큰 덩어리를 곧바로 잘못된 네트워크 패킷이라고 단정하지 않을 수 있다.

참고 자료