이 강의는 부산대학교 탁성우 교수님의 컴퓨터 네트워크 강의 자료입니다.

우리는 앞서 Router에 대한 얘기를 했다.
Router는 Network을 사용하므로, Data에 IP Packet이 붙게 될 것이다.
그럼 그 때 붙게되는 IP Packet의 모양은 어떻게 생겼을까?

IPv4 Packet

기본적으로 우리가 사용하는 네트워크에는 MTU(Max Transmission Unit)이라는 것이 존재한다.
보통은 1500bytes로 제한을 하고 있는데, 사실 이는 1460bytes라고 봐도 무방하다.
그 이유는 계층을 지나오면서 붙게되는 TCP Header, IP Header 때문이다.

TCP Header(20 bytes) + IP Header(20 bytes) + 1460bytes = MTU

위와 같은 식이 성립하는 것이다.
그 중 Router에서 참조하는 여러 정보가 가득한 IP Packet Header에 대해서 알아보자.
IPv6과 IPv4의 Header는 모양이 전혀 다르다. 이번엔 IPv4에 대해서만 알아보자.

Configuration

image

  • 4 bit IP Version
    • IPv4인지 IPv6인지 Version을 명시한다.
  • 4 bit Header Length
    • IPv4는 Header의 길이가 가변적인 Version이다. 그래서 길이를 명시해야 한다.
    • IPv6은 고정된 Header의 길이를 사용하기 때문에 굳이 필요가 없다.
  • 16 bit Total Length
    • Packet의 전체 총 길이를 저장한다.
  • 16 bit Identification
    • 해당 Packet의 고유 ID를 저장한다.
  • 3 bit Flags
    • 해당 Packet의 Fragmented 인지 아닌지를 저장한다.
  • 13 bit Fragment Offset
    • Fragmented Packet이라면, 몇 번째 Packet인지를 저장한다.
    • 위의 3개, ID, Flag, Offset은 Fragmentation을 설명할 때 한 번 더 하겠다.
  • 8 bit Time To Live
    • Packet이 살아있을 수 있는 시간을 저장한다.
    • 하지만 실제 시간과 동기화하는 것은 매우 복잡하므로, Hop Count 를 저장한다.
    • 보통은 64의 Hop Count를 저장하며, 그 말은 64회 이상 Hop을 할 수 없음을 의미한다.
  • 8 bit Protocol
    • Packet이 윗계층에서 내려온 경우, 어떤 Protocol을 사용했는지 저장한다.
  • 16 bit Header Checksum
    • Packet에 오류가 있는 지 없는 지 검사하는 Check 값을 저장한다.
    • 해당 Checksum의 계산 방식은 아래에서 설명하도록 하겠다.
  • 32 bit Source IP(Dest IP)
    • Router에게 가장 중요한 Destination IP가 저장되는 곳이다.

Packet Fragmentation

앞서 Internet은 Packet Switching을 사용한다고 설명했었다.
Packet Swithching의 그림을 보면, Packet이 통째로 가는 것이 아닌 잘려서 감을 알 수 있는데,
이를 우리는 Packet Fragmentatio이라고 한다.

여기서 우리는 생각해 봐야할 점이 있다.

  • Packet을 조각조각자르면 원래 순서가 어떤 순서인지 어떻게 알까?
  • 그 잘린 조각이 어느 Packet의 조각인지는 어떻게 구분할까?
  • Packet이 잘려있는건지 아니면 그냥 크기가 작은 통 Packet인지 어떻게 구분할까?

하나하나 씩 해결방안에 대해서 얘기해보겠다.

  • Packet Fragmentation의 순서
    • 위의 Packet Header에서 13 bit Fragmentation Offset이라는 것이 존재했었다.
    • Fragmentation Offset을 저장함으로써 각 조각이 몇 번째 순서인지 표시할 수 있다.
  • 잘린 조각은 어느 Packet의 조각?
    • Packet Header에는 16 bit Identification이라는 것이 존재했다.
    • 해당 ID는 Packet의 고유한 ID이며, Fragmentation을 해도 똑같이 가져간다.
    • 즉, Packet에서 잘린 조각도 Packet과 같은 ID를 가지므로 쉽게 구분할 수 있다.
  • Packet이 잘린건지 아닌건지?
    • Packet Header에는 3 bit Flag가 존재했다.
    • Flag는 흔히 코딩할 때 사용하는 Boolean 값으로 저장되는 값이다.
    • 따라서 Fragmentation인지 아닌지 여부를 Flag에 표시를 하면, 쉽게 알 수 있다.

Packet Checksum

Router은 기본적으로 Unreliable delivery 방식으로 Packet을 전달하기 때문에,
따로 Error를 Control 할 수 있는 Algorithm이 존재하지 않는다.

그럼 Packet이 변조되었거나, 오류가 발생했을 때는 어떻게 처리를 해야할까?
바로 Header에 저장되는 Packet Checksum을 통해서 변조를 알아차릴 수 있다.

물론 Router가 Error를 Correction 하는 등의 제어는 할 수 없지만, 오류나 변조를 발견했을 때 해당 Packet을 Drop시키는 정도는 가능하다.

그럼 어떻게 오류 및 변조를 발견할 수 있을까? 아래의 두 가지 방법이 존재한다.
Packet은 총 20bytes의 크기를 가지고 있는데, 모두 이진수로 이루어져 있다.

  • Checksum을 제외한 모든 이진수를 더한 값이 Checksum의 1의 보수인가?
  • Checksum을 포함한 모두를 더했을 때 FFFF가 나오는가?
    • 덧셈 연산을 통해서 오류를 검증하기 때문에 Check sum 이라는 이름이 붙는 것이다.

예를 들어 4500 0028 C280 4000 7806 1209 0D6B 2a0e 79a8 7d25 이라는 Header라고 가정하자.
이 때, Checksum은 1209가 되며, 나머지 Header 들을 모두 덧셈(OR) 연산을 해준다.
그럼 2 EDF4 라는 값이 나오게 되고, 2는 Carry이므로 결과적으로 EDF6이 된다.
EDF6을 1의 보수를 취해보면, 1209로 Checksum과 동일한 값이 나오게 된다.
또한, 1209를 포함해 모두를 더해보면 FFFF가 나오게 된다.

==> 이는 곧 오류가 없음을 말한다!