Ping을 통해 알아보자 2) Internet Protocol Version 4(IPV4)

제발알려주세요·2021년 7월 4일
post-thumbnail

Ping을 통해 알아보자 2) Internet Protocol Version 4(IPv4)

지난번 ICMP에 이어 오늘은 핑을 통해 IPv4를 알아보겠습니다.

후속인 IPv6의 도입에도 불구하고 아직까지 대부분의 통신에서 IPv4가 지배적입니다.(4 다음에 왜 바로 6으로 건너가는지 문득 궁금해서 찾아봤더니, 위키피디아에서 말하길 IPV5의 경우 실험적 프로토콜인 인터넷 스트리밍 프로콜에서 사용되었다고 합니다.)

인터넷 프로토콜이라는 이름에 걸맞게 IPV4는 인터넷 사용을 가능하게 해주는 핵심 프로토콜 입니다.
IPv4 프로토콜 자체가 통신의 신뢰성을 보장하진 않지만, 논리적 주소 지정 시스템을 통해 라우팅을 하게 해주기 때문입니다.

IPv4의 경우 32비트의 주소부 표현을 통해 약 42.9억개의 주소부를 사용합니다.(늘어나는 인터넷 사용양에 비해 적기 때문에 IPv6가 생겨났습니다.) NAT,CIDR와 같은 기술이 IP주소 부족을 어느정도 해소해주지만 IPv6로 넘어가는 날이 오겠죠?

데이터그램 살펴보기

서론은 그만하고 ping명렁어를 통해 생겨난 IPv4 패킷을 살펴보겠습니다.


  • 라우팅을 담당하는 프로토콜인 만큼 Src:172.30.1.40, Dst: 8.8.8.8을 통해 패킷이 가야할 목적지?를 알려주고 있네요.
  • 맨 처음 붙어있는 4,5의 경우 Version이 4라는것과 Header의 Length가 20바이트임을 알려주는것 같습니다. 자세히 알아보면 4,5->0100 0101 로 표현되므로 0100... = version 4로 나타내 지는군요. ...0101의 경우 5를 나타내지만, IHL(인터넷 헤더 길이)의 경우 32비트의 단어수를 지정하는 길이입니다. 따라서 32비트*5=160비트, 즉 20바이트이므로 와이어샤크에 나타나있는 20bytes임을 알 수 있네요. 실제로 IPV4에 붙어있는 헤더는 20바이트네요.
  • 다음 00으로 나타나있는 값의 경우 DSCP(Differentiaed Service Code Point)(직역하면 차별화된 서비스 코드 포인트) 6비트(VoIP 등 차별화된 프로토콜을 나타낸다고 합니다.), ECN(Explicit Congestion Notification)(직역하면 명시적 혼잡 알림) 2비트를 나타나네요. 이 2비트는 TCP와 함께 네트워크 혼잡시를 제어하는 것 같은데...위키피디아를 읽어봤으나 잘 이해가 안가네요. 빠삭하신분의 댓글을 기다리겠습니다...(추가로 찾아보고 업데이트 되는대로 수정해놓겠습니다)
  • 다음 2바이트는 Total length를 나타내는군요. 이 전글에서 이더넷 프레임이 98바이트였는데, 이더넷헤더를 제외한 IPV4까지의 길이(84바이트)를 타나내는군요.
  • 다음 2바이트는 Identification을 타나낸다고 합니다. 단일IP데이터그램의 조각 그룹을 고유하게 식별하는데 사용한다고 합니다.
  • flag는 1바이트로써 조각을 제어하거나 식별하는데 사용한다고 합니다
  • fragment Offset : 이 필드는 조각화되지 않은 원래 IP 데이터 그램의 시작과 관련된 특정 조각의 오프셋을 8 바이트 블록 단위로 지정합니다. 조각화된게 없기 때문에 0으로 나타나네요.
  • Time to Live: 데이터그램이 특정구간을 무한루프로 돌면 안되기 떄문에 TTL필드를 두어 라우터 하나를 지날때마다 값을 감소시켜 0이되면 사라지게합니다. request의 값이 64인걸로봐서는 64개의 라우터를 지났는데도 목적지를 찾지못하면 사라지겠군요.
  • protocol: 붙어있는 프로토콜을 나타내는 필드입니다.
  • checksum 필드입니다. 라우터하나를 지날때마다 TTL필드의 값이 1씩 줄기때문에 모든 라우터는 해당 값을 다시 계산합니다.
  • source와 destination 주소가 있군요.(destination 주소를 보고 어떤 포트로 포워딩할지 결정합니다)
  • ping에는 따로 옵션필드가 들어있지 않습니다.

조각화(Fragmentation)

데이터그램을 살펴보았는데 전체적으로 fragmentation과 관련된 항목들이 잘 이해가 되지않았습니다.
떄문에 이 부분에 대해서 더 자세히 알아보겠습니다.

하드웨어가 다른 네트워크는 일반적으로 전송 속도뿐만 아니라 최대 전송 단위 (MTU) 도 다릅니다. 한 네트워크가 더 작은 MTU가있는 네트워크로 데이터 그램을 전송하려고 할 때 데이터 그램을 조각화가 필요할 수 있고, IPv4에서는 이걸 지원해줍니다.(IPv6에서는 지원하지 않는다고 합니다.)

조각화는 다음과 같은 프로세스로 이루어집니다.

1) 라우터가 패킷을 수신하면 대상 주소를 검사하고 사용할 나가는 인터페이스와 해당 인터페이스의 MTU를 결정합니다. 패킷 크기가 MTU보다 크고 패킷 헤더의 DF (Do not Fragment) 비트(Flag의 2번째 비트)가 0으로 설정된 경우 라우터가 패킷을 조각화 할 수 있습니다.
2) 라우터는 패킷을 조각으로 나눕니다. 각 조각의 최대 크기는 MTU에서 IP 헤더 크기를 뺀 값입니다 (최소 20 바이트, 최대 60 바이트). 라우터는 각 조각을 자체 패킷에 넣습니다. 각 조각 패킷은 다음과 같이 변경됩니다.
- 전체 길이 필드는 프래그먼트 크기입니다.
- 이상의 단편 (MF) 플래그는 0으로 설정되어 마지막을 제외한 모든 프래그먼트에 대해 설정된다.
- 프래그먼트 오프셋 필드는 원래의 데이터 페이로드의 단편의 오프셋에 기초하여 설정된다. 이는 8 바이트 블록 단위로 측정됩니다.
- 헤더 체크섬 필드가 다시 계산됩니다.
- 예를 들어 MTU가 1,500 바이트이고 헤더 크기가 20 바이트 인 경우 조각 오프셋은 (1500-20)/8 = 185. 이 배수는 0, 185, 370, 555, 740 등입니다.

위키피디아 자료를 참조해보겠습니다.

조각 오프셋이라는 말이 좀 어렵게 느껴졌는데, 단편화 되기전 데이터 시작점으로부터의 차이라고 생각하시면 될 것 같습니다. 첫번쨰 예시에서 310*8=2480. 즉 두번째 파편은 첫번쨰 원데이터로부터 2480의 offset을 가집니다.

조립은 조각화 된 패킷을 오프셋을 기준으로 다시 조립합니다.
조각화된 패킷은 마지막 패킷을 제외하고 more fragments 플래그가 1이므로 이를통해 조각난 패킷임을 알 수 있고, 오프셋을 통해 조립할 수 있습니다. 또한 마지막 패킷일지라도 offset필드가 0이 아니므로 이를 통해 조립할 수 있습니다.


ping을 통해 IPv4를 알아보았습니다.
다음 글에서 이더넷에 대해 알아보겠습니다.

0개의 댓글