images

MSS (Maximun Segment Size)


Screen Shot 2021-04-27 at 11 48 40 PM

  • MSS는 TCP 상에서 전송할 수 있는 사용자의 데이터(payload) 크기를 말한다.
  • MSS는 TCP 헤더를 제외한 데이터의 크기이다.
  • MSS는 TCP(L4) 계층에서 데이터의 크기를 말한다.
  • 위의 사진을 보면, TCP 헤더를 제외한 데이터 부분을 MSS라고 말한다.

MTU (Maximun Transmission Unit)


Screen Shot 2021-04-27 at 11 51 49 PM

  • MTU는 네트워크에서 전송 될 수 있는 최대 패킷의 크기를 말한다.
  • MTU는 IP(L3) 계층에서 패킷이라고도 불리운다.
  • MTU에서 IP 헤더와 TCP 헤더를 제외하면 그것이 바로 MSS가 된다.
  • MTU를 패킷이라고 부른다.
  • 참고로 L2는 프레임이라는 용어로 부른다.

설정된 MTU 크기를 확인하는 방법

test

  • ip link 라는 명령어를 치면 현재 리눅스 환경에서 설정된 MTU 값을 확인할 수 있다.
  • MTU 값이 1500 BYTES 으로 잡혀 있는 것을 확인할 수 있다.

패킷을 보내고 이를 트레이싱 해보자

  • 패킷을 보내기 위해서 ping 이라는 도구를 통해서 구글 DNS 서버 (8.8.8.8)에 요청을 보내보자.

  • ping -M do -s 68 8.8.8.8 이 명령어는 서버에 68 바이트를 보내는 것이다.

Screen Shot 2021-04-28 at 12 02 18 AM

  • 사진을 보면 데이터는 68바이트를 보냈지만 실제로는 96 바이트가 전송된 것을 확인할 수 있다. 이유는 데이터에 헤더 부분이 포함되었기 때문이다.

  • 추가로 ping -M do -s 1500 8.8.8.8 명령어로 패킷의 최대 크기인 1500 MTU 만큼 데이터를 전송해본다.

Screen Shot 2021-04-28 at 12 05 06 AM

  • 에러가 발생하는 것을 확인해볼 수 있는데, 그 이유는 헤더가 포함되었기 때문이다. 하지만 이 에러는 커널 레벨에서 발생한 것은 아니고 ping 도구에서 발생시킨 것이다.

  • 이를 확인해보기 위해서, ping 보다 많은 기능을 지원하는 hping3 도구를 이용해서 테스트 해보겠다.

sudo tshark -i enp0s3 -f icmp -Y "ip.dst == 8.8.8.8 or ip.src == 8.8.8.8"
  • 위의 명령어를 이용해서 패킷을 캡처하고 아래 명령어를 다른 터미널에서 입력을 해본다.
sudo hping3 -d 2000 --icmp 8.8.8.8

Screen Shot 2021-04-28 at 12 12 05 AM

  • 위와 같은 결과를 확인해 볼 수 있다. 자세히 살펴보면, 패킷이 정상적으로 전송이 된 것을 확인해볼 수 있지만 서버로 부터 응답이 오지 않는 것을 확인할 수 있다. 이로서 구글 도메인 서버에 요청할 수 있는 최대 패킷 크기는 1500 bytes 라는 것을 확인할 수 있었다.

  • 그리고 2000 바이트를 데이터로 전송을 하였는데 MTU는 최대 1500 바이트이다. 따라서 패킷이 쪼개져서 전송되고 있다는 것을 확인할 수 있다.

참고 문헌


>> Home