
지난번 ICMP에 이어 오늘은 핑을 통해 IPv4를 알아보겠습니다.
후속인 IPv6의 도입에도 불구하고 아직까지 대부분의 통신에서 IPv4가 지배적입니다.(4 다음에 왜 바로 6으로 건너가는지 문득 궁금해서 찾아봤더니, 위키피디아에서 말하길 IPV5의 경우 실험적 프로토콜인 인터넷 스트리밍 프로콜에서 사용되었다고 합니다.)
인터넷 프로토콜이라는 이름에 걸맞게 IPV4는 인터넷 사용을 가능하게 해주는 핵심 프로토콜 입니다.
IPv4 프로토콜 자체가 통신의 신뢰성을 보장하진 않지만, 논리적 주소 지정 시스템을 통해 라우팅을 하게 해주기 때문입니다.
IPv4의 경우 32비트의 주소부 표현을 통해 약 42.9억개의 주소부를 사용합니다.(늘어나는 인터넷 사용양에 비해 적기 때문에 IPv6가 생겨났습니다.) NAT,CIDR와 같은 기술이 IP주소 부족을 어느정도 해소해주지만 IPv6로 넘어가는 날이 오겠죠?
서론은 그만하고 ping명렁어를 통해 생겨난 IPv4 패킷을 살펴보겠습니다.


데이터그램을 살펴보았는데 전체적으로 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를 알아보았습니다.
다음 글에서 이더넷에 대해 알아보겠습니다.