Computer Science/Computer Network

[Computer Network] IP Package | IP 패키지

lww7438 2020. 4. 27. 16:36

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*로 구현된다.

Reassembly Table

- 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)