IP-Datagram Header Structure
L3 패킷 헤더 구조
- IP-Datagram(L3 패킷)에서 헤더의 길이는 20 ~ 60Byte로 구성된다.
(표준 헤더는 20Byte 크기이다. 옵션으로 최대 40Byte가 추가될 수 있다.)
- L3 패킷에서 데이터의 길이는 0 ~ 65515Byte로 구성된다.
- L3 패킷의 최소 길이는 20Byte, 최대 \(2^{16} - 1\)Byte로 구성된다.
그림에서 하나의 Row는 4Byte 크기이다.
- 흰색 바탕의 내용들은 표준 헤더를 구성하는 요소들이다.
(5 Rows를 구성하고 있으므로, 표준 헤더의 크기는 20Byte이다.)
- 회색 바탕의 내용은 옵션 헤더를 구성한다.
(옵션 헤더는 0 ~ 40Byte 사이의 크기를 갖는다.)
1st Row
VER : Version (4bits)
- IPv4와 IPv6 버전을 구분짓는 4bits 값이 저장된다.
- IP 프로토콜의 버전에 따라 헤더를 해석하는 방법이 달라지므로 가장 먼저 해석되는 필드이다.
HLEN : Header Length (6bits)
- 헤더와 데이터의 경계를 알려주는 값(헤더의 마지막 bits)이 저장된다.
- HLEN에 저장된 값은 1bits당 4Byte를 의미한다. (HLEN에 4bits만 할당한 이유는, 헤더의 크기를 최대한 줄이기 위해서이다.)
- 헤더의 최소길이가 20Byte이므로, HLEN의 최솟값도 5(0101)이다. (즉, HLEN의 최댓값은 15(1111)이다.)
- HLEN이 4Byte 단위로 구분짓기 때문에, 옵션 헤더에 Padding을 더하여 헤더의 크기를 4Byte 단위로 맞출 필요가 생긴다.
Service Type (8bits)
- 패킷의 전달 방법과 네트워크 서비스 종류를 구분짓는 값이 저장된다.
- 왼쪽 6bits를 해석하는 방법으로 아래와 같은 두 가지 방법이 존재한다.
1. Precedence Interpretation (우선순위 해석)
- LSB부터 3bits가 0일 경우, MSB부터 3bits를 우선순위(0~7)로 간주한다.
- 라우터 큐에 혼잡이 발생하게 되면, 먼저 들어온 패킷이더라도 우선순위가 낮다면 폐기되고, 우선순위가 높다면 늦게 온 패킷이더라도 큐로 들어가게 된다.
2. Differentiated Service Interpretation (DS; 차등화 서비스 해석)
- LSB부터 3bits가 0이 아닐 경우, MSB부터 4bits 혹은 5bits를 DS를 구분짓는 값으로 간주한다.
- 어떤 Application의 패킷이냐에 따라, 전송 속도와 신뢰도의 비중이 다르다.
- 보통, Interactive Service(대화식 서비스)는 전송 속도에 주안점을 두고(패킷 Loss를 감수함), 인터넷 뱅킹, 이메일과 같은 서비스는 신뢰도에 주안점을 둔다(느린 전송을 감수함).
- 전송 속도에 주안점을 둔 패킷은 우선순위가 낮아 라우터에서 폐기될 수 있다.
클라이언트가 인터넷에 요청하는 것
- 서비스 유형 : 클라이언트는 Application에 적절한 네트워크 서비스를 받기 위해 패킷 헤더에 서비스 타입을 지정한다. (응용 프로그램의 종류를 알림. ex) 인터넷 뱅킹 서비스, 화상회의 서비스 등)
- 트래픽 특성 : 전송 속도의 평균값과 최댓값
인터넷이 클라이언트에게 제공하는 것
- Admission Control : 현재 네트워크의 자원으로 클라이언트의 요구를 수용할 수 있는지에 대한 여부 (Y/N)
- 서비스 제공 : 클라이언트가 요구한 네트워크 서비스
- 트래픽 모니터링 : 고지한 대로 트래픽 특성을 준수하는 지에 대한 감시 (클라이언트가 전송 속도를 위반할 경우, 네트워크가 강제적으로 속도를 제어하게 된다.)
- Accounting : 클라이언트가 데이터(패킷)을 송수신하는 양을 측량
(이동통신망 회사에서 요금을 부과하기 위해 사용하는 형태가 대표적이다. 앞으로 가정에 제공되는 유선망에도 네트워크의 퀄리티와 트래픽 양을 측량해서 요금을 부과하려는 움직임이 있다고 한다.)
Total Length (16bits)
- IP-Datagram 전체 길이를 Byte단위로 저장된다.
- 16bits 필드로, 표현할 수 있는 최대 L3 패킷의 크기는 65,535Byte이다. (훗날 발전될 여지를 고려한 크기이다.)
- Ethernet Protocol에서는 Frame에 포함될 수 있는 데이터의 최소 크기를 46Byte, 최대 크기를 1,500Byte로 지정해놓았다. 따라서 46Byte 이하의 이더넷 프레임은 최소 크기 조건을 충족하기 위해 그림과 같이 Padding이 진행된다.
- L2 Trailer에는 오류 탐지 코드와 같은 것들이 포함된다.
2nd Row (Packet Fragmentation & Packet Reassemble)
- Packet Fragmentation (패킷 단편화) : 패킷이 해당 물리 네트워크의 MTU를 초과할 경우 패킷을 분할하는 것이다.
- Packet Reassemble (패킷 재조립) : 단편화 된 패킷이 순서에 맞춰 재조립되는 것이다.
- 패킷이 단편화될 때, 원본 헤더의 정보들이 대부분 복사되고, 재조립에 필요한 3가지 정보*들이 추가적으로 붙게 된다.
- 패킷이 재조립은 오직 목적지 노드에서만 행해진다.**
* Packet Reassemble에 필요한 3가지 정보
1. Identification Field & Source IP Address
2. Fragmentation offset
3. Flags
** 목적지에서만 재조립되는 이유
1. 라우터의 오버헤드를 최소화하기 위함이다.
2. 중간 경로에서 재조립되어도 다시 단편화 될 가능성이 있기 때문이다.
3. 단편화 된 패킷들이 서로 같은 경로로 전송된다는 보장이 없으므로, 재조립 자체가 불가능한 경우도 존재하기 때문이다.
Identification (16bits)
- 패킷의 고유 ID값이며, Host마다 독립적으로 부여하기 때문에, Host 간 중복의 우려가 있다.
- ID값은 Source의 IP주소와 Pair로 구분지어져서 중복을 피해야 한다.
Flags (3bits)
- 마지막 Fragment임을 알리는 정보가 저장되는 필드이다.
- 단편화 작업이 수행되면, 원본 패킷의 Length 필드값이 유실된다. (패킷이 잘리는 작업이니 없어지는 것이 당연하다.)
- \(\texttt{D}\) : Do not fragment, D = 1이면, 단편화가 필요한 상황이더라도 단편화를 수행하지 않고 폐기한다.
- \(\texttt{M}\) : More fragment, M = 1이면, 뒤따르는 단편화 된 패킷이 존재함을 의미한다.
(M = 0인 패킷은 단편화 된 패킷 중 가장 마지막 패킷, 단편화되지 않은 패킷 둘 중 하나임을 의미한다.)
Fragmentation offset (13bits)
- 단편화되기 전, 원본 패킷에서의 위치정보이다.
- 0Byte ~ 65,515Byte의 Data를 구분하기 위해 16bits(\(2^{16} = 65,536\))가 필요하나, 헤더 크기의 한계로 13bits로 할당되었다.
- 3bits가 부족하므로, 8의 배수(\(2^3 = 8\))로 데이터를 구분짓는다.
(즉, Fragmentation은 8Byte 단위로 수행된다.)
※ Offset = 0 & M = 0 단편화 미이행
※ Offset ≠ 0 & M = 0 단편화 된 패킷 중, 가장 마지막 패킷임을 의미
※ Offset = 0 & M = 1 단편화 된 패킷 중, 첫 번째 패킷임을 의미
※ Offset ≠ 0 & M = 1 단편화 된 패킷 중, 첫 번째, 마지막 패킷이 아닌 패킷임을 의미 (중간 패킷)
ex) Offset 표기
- 4,000Byte 크기의 데이터가 각각 1,400Byte, 1,400Byte, 1,200Byte로 단편화될 때, 각 데이터의 Offset 값은 0, 175, 350이다.
ex) Fragmentation 예시
- 단편화되지 않은 패킷과, 단편화 된 패킷 중 가장 마지막 패킷의 M값이 0임에 주목하자.
- Fragment 1 ~ 3에서 1420, 1420, 1220의 20Byte는 헤더의 길이를 의미한다.
3rd Row
Time to live, TTL (8bits)
- Routing Loop를 방지하고, 메세지가 송신되는 범위를 제한하기 위해 존재하는 필드이다.
(1970년대 중반에 TCP/IP가 개발되고, 80년대 초반에 TCP/IP의 정상 작동을 확인하기 위해 인터넷을 확인했을 때, 2년째 라우팅 루프에 갇힌 패킷을 발견한 이후에 고안된 개념이다.)
- Source에서 Time to live 필드에 적절한 값을 설정하여, 경유할 수 있는 최대 라우터의 개수를 제한한다.
- Time to live 필드에 저장된 값은 라우터를 지날 때 마다 1씩 감소하고, 라우터는 이 필드 값이 0인 것을 확인하면 패킷을 폐기하고 Source 측에 이를 통보한다.
- 거칠 수 있는 라우터의 개수가 제한된다는 것은 패킷이 전송될 수 있는 물리적 거리가 제한됨을 의미한다.
- TTL 값을 설정함으로써, Multicasting 통신을 구현하기에 용이해졌다.
(UC Berkley에서는 인근 기업들에게 Multicast 방식의 인터넷 강의를 제공하기 위해 TTL값을 제어하는 방식으로 공급하고 있다.)
Protocol (8bits)
- 목적지에서 패킷을 지정된 프로토콜에 맞추어 Decapsulation하기 위해,
Source측에서 Encapsulation에 이용한 프로토콜의 종류를 구분하는 필드이다.
- 목적지에선 해당 프로토콜로 Multiplexing하며,
Source측에선 목적지에서 이용된 프로토콜로 Demultiplexing한다.
Protocol | ICMP | IGMP | TCP | UDP | OSPF |
Value | 1 | 2 | 6 | 17 | 89 |
* OSPF (Open shortest Path First)
- 라우팅 프로토콜의 한 종류로, 계층화 된 라우팅 동작을 수행시킨다.
Header checksum (16bits)
- 패킷의 오류를 탐지하기 위해 존재하는 필드이다.
- 경유하는 라우터들과 목적지에서 checksum이 갱신되고, 오류가 탐지되면 패킷을 폐기한다.
- 라우팅 속도를 위해 헤더 부분의 오류만 고려한다.
6th Row : Options (0 ~ 40bytes 가변길이)
Type Field
Copy Bit : 0이면 옵션 헤더의 내용을 첫 번째 패킷에만 적용하고, 1이면 모든 패킷에 적용한다.
Class Bits : 옵션의 일반적인 목적을 정의한다.
Number Bits : 옵션의 유형을 정의한다. IPv4에는 6가지 유형이 존재한다.
- 옵션 헤더는 크게 두 가지 형태로 존재한다.
1. Single Byte Option (Type 필드만 존재)
No operation (00001)
- HLEN 필드에서의 정의로 인해, 옵션 헤더의 길이를 4Byte 단위로 만들기 위한 Padding Bits이다.
- 옵션의 앞, 뒤, 옵션 사이와 같이 자유롭게 위치할 수 있다.
End of option (00000)
- No operation과 같은 Padding Bits이나, 옵션 헤더의 맨 뒤에만 위치할 수 있다.
2. Multiple Byte Option (Type, Length, Value 필드로 구성)
Record route (000 00111 = 7)
- Copy 필드가 0이다. 즉, 첫 번째 Fragment에만 적용되는 옵션이다.
- 패킷이 목적지에 전송되면서 경유한 라우터의 인터페이스 주소를 저장할 것을 지시한다.
- 이 경우, 옵션 헤더의 길이는 4R+3 형태가 된다. (R은 라우터의 개수, 3은 Type, Length, Pointer 각각 1Byte씩을 의미한다.)
- 포인터 필드는 기록한 라우터 주소가 옵션 헤더의 몇 Bit부터 시작하는지를 나타내는 정보를 저장하고 있다.
(Type 필드부터 1로 간주한다.)
- 옵션 헤더는 최대 40Byte이므로, 최대 9개의 라우터 주소를 기록할 수 있다. (4 * 9 + 3 + + (No-Op | End-Op))
- 라우터의 여러 인터페이스 주소 중, 라우터를 나갈 때 이용한 인터페이스의 주소를 기록한다.
ex) Record route 예시
- Record route의 옵션값은 7이다. 즉, Type 필드에 0000111이 저장되어 있다.
- 옵션 헤더의 길이는 15Byte이다. 즉 3개의 라우터 주소를 저장할 수 있다. (4 * 3 + 3)
- 포인터 값은 4이다. 4Byte 부분부터 라우터 주소 기록을 시작한다.
- 라우터를 나갈 때 이용한 인터페이스의 주소를 차례대로 저장한다. (저장하면서 포인터 값은 4씩 증가시킨다.)
- 옵션 헤더의 길이에 따라, 라우터 주소를 저장할 수 있을만큼 저장하고 나면, 포인터 오버플로우가 발생하여 그 이후에 경유하는 라우터의 주소는 기록하지 못한다.
Strict source route (100 01001 = 137)
- Copy 필드가 1이다. 즉, 모든 Fragment에 적용되는 옵션이다. (즉, 모든 패킷 단편화들이 같은 경로로 이동한다.)
- 목적지로 향하는 패킷의 이동경로를 소스에서 미리 다 지정해놓는 방식이다. 패킷은 이에 맞춰서 네트워크의 상황은 무시하고 무조건 지정해놓은 경로로 이동한다.
- Length 필드에 저장되는 값은 4n+3의 형태이며, 여기서 n은 라우터의 개수를 의미한다. (즉, 4의 배수 형태를 맞추기 위해 No-Op 혹은 End-of-Op이 하나 붙게 된다.)
- 옵션 헤더의 최대 길이는 40Byte이므로, 중간 경로에 해당하는 라우터는 최대 9개 까지 지정할 수 있다.
- 일반적인 네트워크 환경에서는 거의 활용되지 않고, 복잡한 모바일 네트워크에서 유용하게 사용된다.
ex) Strict source route 예시
- #은 포인터가 가리키는 주소를 의미한다. (이미 지난 노드는 #의 왼쪽, 앞으로 가야할 노드는 #의 오른쪽에 위치한다.)
- 포인터는 각 노드에 도착할 때마다 다다음 노드를 가리키도록 4씩 증가하게 된다.
- 소괄호( ) 내부엔 소스 주소와 Next-Hop 주소가 들어온다.
ex) Strict source route 악용 예시
- 수년 전, 해커가 은행의 네트워크를 공격하는 데 Strict source route 방식을 이용했다.
- 은행의 네트워크에 존재하는 여러 DB 중, 중요한 두 가지 DB로 정보계 DB(금융상품과 같은 공개적인 정보를 저장)와 계정계 DB(고객의 개인정보를 저장, 엄격한 보안 정책이 필요)가 있다.
- 이 두 DB를 같은 보안 정책 하에 운용하는 것은 안전 측면에서 바람직하지 못하므로, 은행의 네트워크는 각기 다른 보안 정책 수준을 적용하기 위해 Multiple Level로 구성되어 있다.
- DMZ : 비무장지대를 의미하는 용어로, 보안이 중시되지 않는 외부와 가장 가까운 인터페이스 환경을 의미한다.
- FW : 방화벽(Firewall)을 의미하며, 오가는 패킷을 모니터링하여 보안 정책에 위배되는 패킷을 폐기하는 역할을 한다.
- 이전의 네트워크에서는 그림과 같이 라우터에 FW가 직접 붙지 않고, 논리적으로 패킷들이 FW를 거쳐서 네트워크를 오가도록 설정했다. (당시, 인터페이스의 가격이 높았던 것이 이유였다.)
- 해커는 이 점을 이용하여, 은행 네트워크에 침투한 패킷이 FW을 거치지 않도록 Strict source route 방식을 통해 FW를 Bypass한다.
- 가장 간단한 해결책으로는, 각 라우터에서 패킷 필터링 시, Strict source route 방식으로 전송되는 패킷을 폐기하는 것이다. 일반적인 패킷은 Strict source route 방식으로 전송되지 않기 때문이다.
- 현재 네트워크에서는 라우터의 인터페이스마다 FW가 설치되어 운용된다.
Loose source route (100 00011 = 131)
- Copy 필드가 1이다. 즉, 모든 Fragment에 적용되는 옵션이다. (즉, 모든 패킷 단편화들이 같은 경로로 이동한다.)
- 지나야 할 라우터의 주소를 지정하는 것은 Strict source route와 비슷하나, Loose source route 방식에서는 지정한 라우터들 사이에 다른 경로가 추가될 수 있다.
- 즉, 지정된 라우터 IP주소들은 중간 체크포인트 역할을 한다.
(즉 첫 번째 라우터에서의 NHA주소가 꼭 두 번째 라우터의 주소라는 보장이 없다.)
ex) Loose source route 예시
Time stamp (010 00100 = 68)
- Copy 필드가 0이다. 즉, 첫 번째 Fragment에만 적용되는 옵션이다. (즉, 첫 번째 단편화 패킷에만 시간이 기록된다.)
- 패킷이 목적지로 전송되면서, 라우터를 나설 때의 시간을 기록한다.
- Length는 버퍼의 크기를 저장한다. (타임스탬프 옵션 헤더의 크기 역시 4Byte의 배수이다.)
- Pointer는 기록할 버퍼의 위치를 지정한다.
- O-Flow는 Over Flow 비트를 저장한다.
- Flas는 아래 3가지 동작 모드를 지정한다.
1. Flags = 0 : 라우터를 지날 때 순서에 맞춰서 시간값을 기록한다.
2. Flags = 1 : 라우터를 지날 때, 시간값 앞에 라우터의 Out-going 주솟값까지 기록한다. (Record route 기능까지 수행)
3. Flags = 3 : 경유할 라우터의 Out-going 주소를 미리 지정하고, 해당 라우터를 지날 때의 시간값을 기록한다. (Strict source route 기능가지 수행)
ex) Time Stamp 예시
Reference: TCP/IP Protocol Suite 4th Edition
(Behrouz A. Forouzan 저, McGraw-Hill, 2010)
Reference: Data Communications and Networking 5th Edition
(Behrouz A. Forouzan 저, McGraw-Hill, 2012)