이 강의는 부산대학교 탁성우 교수님의 컴퓨터 네트워크 강의 자료입니다.
우리는 앞서 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
- 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
가 나오게 된다.
==> 이는 곧 오류가 없음을 말한다!