IP Package
IP 패키지
- 노드에서 패킷이 처리되는 과정을 나타낸 가상의 그림이다.
외부에서 전송된 패킷 : 아래에서 올라오게 된다. (Data-Link 계층으로부터 패킷을 전달받는다.)
내가 전송할 패킷 : 위에서 내려오게 된다. (상위 계층으로부터 패킷*을 전달받는다.)
* 상위 계층에서 받는 패킷은 TCP 패킷, UDP 패킷 혹은 ICMP 패킷, IGMP 패킷이 될 수 있다.
1. Header-Adding Module (헤더 추가 모듈)
Header_Adding_Module (data, destination_address, service_type, data_length, TTL) {
Encapsulate data in an IP-Datagram
Calculate checksum and insert it in the checksum field
Send data to the corresponding queue
Retrun
}
- 상위 계층에서 전달받은 L4 패킷 데이터와 여러 정보들을 통해 L3 헤더를 구축하여 L4 패킷을 IP-Datagram으로 만든다.
- 완성된 IP-Datagram을 목적에 맞는 포워딩 모듈 혹은 재조립 모듈의 Queue에 전달한다.
2. Processing Module (처리 모듈)
Processing_Module (datagram) {
Remove one datagram from one of the input queue.
if (destination_address matches a local_address) { // 나를 목적지로 하는 패킷 (내 주소 혹은 루프백 주소와 매칭되는 경우)
Send the datagram to the reassembly module. // 재조립 모듈로 전달
return
}
if (destination_address matches a broad_cast_address) { // 패킷이 브로드 캐스트 타입으로 전송된 경우
Send the datagram to the reasembly module. // 재조립 모듈로 전달
return
}
if (destination_address matches a multi_cast_address) {
// 내가 가입된 멀티 캐스팅 네트워크인가를 확인
// 내가 가입된 네트워크라면 재조립 모듈로 전달
// 아니라면, 패킷을 폐기
}
if (machine is a router) { // 내가 경유지일 경우 (라우터도 목적지가 될 수 있음)
Decrement TTL // TTL을 하나 감소시킴
}
if (패킷의 목적지 주소가 나의 주소와 일치하지 않는 경우) {
내가 호스트이면, 패킷을 폐기한다.
내가 호스트가 아니라 중간 노드(경유지)라면, 그대로 내보낸다.
}
if (TTL less than or equal to zero) { // TTL <= 0
Discard the datagram // 라우팅 루프를 방지하기 위해 네트워크에 오랫동안 잔존한 패킷은 폐기
Send an ICMP error message. // ICMP 에러 메세지를 소스에게 전송
return
}
Send the datagram to the forwarding module. // 위 모든 경우에 해당되지 않은 경우, 패킷을 포워딩 모듈에 전달
return.
}
- 패킷의 목적지 주소를 검사하여, 나에게 온 것인지, 다른 노드로 향하는 패킷(내가 경유지 중 하나)인지를 판단한다.
- 나를 목적지로 하는 패킷의 주소는 나의 주소 혹은 Loopback 주소 형태를 띄고 있으며, Reassembly Module로 전달되다.
- 나를 경유하려는 목적인 패킷은 Forwarding Module로 전달된다.
- 드물게, 목적지 주소가 틀린 경우, 패킷을 폐기하고, 이 사실을 ICMP Module을 차용하여 Source에게 알린다.
3. Fragmentation_Module (단편화 모듈)
Fragmentation_Module (datagram, Interface_address, NHA) {
Extract the size of datagram // Length field에 저장된 값 추출
if (size > MTU of the corresponding network) {
if (D bit is set) { // MTU를 초과한다 해서 곧바로 단편화하지 않고, D 비트가 0으로 설정되어야 단편화를 진행
Discard datagram // 단편화가 필요하지만, 단편화를 금지했으니 패킷을 폐기
Send an ICMP error message // ICMP 에러 메세지를 소스에게 전달
return
}
else {
Calculate maximum size // 패킷의 길이를 계산
Divide the segment into fragments // 단편화
Add header to each fragment // 각 단편화 조각들에 헤더를 붙임
Add required options to each fragment // 패킷이 요구한 옵션 헤더를 덧붙임
Send fragment // 내보냄
return
}
}
else { // 내보내는 패킷이 MTU를 초과하지 않는 경우
Send the datagram // 패킷 그대로 내보냄
}
return
}
- 패킷이 이용하는 Interface의 MTU를 확인하여 패킷을 단편화한다.
4. Forwarding Module (포워딩 모듈)
- 나를 경유하여 나가는 패킷은 Forwarding이 수행된다.
5. Reassembly Module (재조립 모듈)
Reassembly Table
- 재조립 모듈에서 쓰이는 시스템 레벨에서 사용되는 자료구조이다.
- 일반적으로, Linked-List 혹은 속도 측면에서 유리한 Fixed-Size Array*로 구현된다.
- State : Entry의 사용 가능 여부를 저장한다. 빈 Entry의 St. 값은 Free이다.
- Source address : 소스 노드의 주솟값을 저장한다.
- Datagram ID : 단편화 조각 패킷들이 한 패킷에서 파생된 경우, 소스 주소와 더불어 데이터그램 ID또한 동일할 것이다.
- Time-out : 첫 번째 단편화 패킷이 도착하면 타이머가 실행되고, 설정한 시간이 넘어가기까지 모든 단편화 조각들을 전달받지 못하면 Time-out이 발생된다. Time-Out이 발생하면 저장해두었던 모든 단편화 패킷들을 폐기하고 St.를 Free로 설정한다.
- Fragments : 단편화 조각들을 지칭하는 포인터이다. 단편화 조각들은 링크드리스트에 Offset-Field에 명시된 순서를 고려하여 저장된다.
* Fixed-Size Array의 문제점
- 해커의 공격 대상이 된다.
- 해커는 완성되지 않은 Fragment만 지속적으로 전달하여 모든 Reassembly Table의 Entry를 쓸모없는 Fragment로 채운다.
- 정상적으로 전송중인 패킷들이 입력될 공간이 없어 처리가 되지 않는다. (Dos 공격의 일종이다.)
Reassembly_Module (datagram) {
if (offset_value = 0 and M = 0) { // 내가 첫 번째 조각이자, 마지막 조각이다 -> 단편화되지 않았음을 의미
Send datagram to the appropriate queue
return
}
Search the reassembly table for the entry // 리어셈블리 테이블에 Free인 엔트리를 찾는다
if (entry not found) {
Create a new entry // 새로운 엔트리를 마련한다
// St. 를 사용중으로 설정한다
}
Insert datagram into the linked list // 단편화 패킷을 링크드리스트에 넣는다.
if (all fragments have arrived) { // M필드가 0인 패킷까지 다 들어왔는가? 그리고 Offset, Length 필드를 참고하여 누락된 패킷이 있는지를 조사한다.
Reassemble the fragment
Deliver the fragment to upper-layer protocol // 조립된 IP-Datagram을 상위 계층으로 올림
return
}
else {
if (time-out expired) { // 재조립 모듈보다는 에러 리커버리(별도의 인터럽트 처리 루틴)에 따로 기술되는 부분이다.
Discard all fragments
Send an ICMP error message // time-out이 발생되면 ICMP 메세지를 소스에게 전송한다.
}
}
return
}
- 나를 목적지로 하는 패킷은 Reassemble이 수행된다.
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)