이것이 점프 투 공작소

네트워크에서 패킷 분할 과정에 대해 알아보자 본문

해킹,보안

네트워크에서 패킷 분할 과정에 대해 알아보자

겅겅겅 2023. 8. 13. 20:52

네트워크를 이용한 통신에서 송신측은 데이터를 그대로 전송하지 않고 필요에 따라 분할하여 전송하고

그리고 수신측은 분할된 데이터를 재조립하여 원래의 요청을 알아 낼 수 있습니다.

 

데이터의 분할이 필요한 이유

데이터의 분할은 전송계층(4계층), 네트워크계층(3계층)에서 발생합니다.

4계층에서 발생하는 분할을 Segmentaion, 3계층에서 발생하는 분할을 Fragmentaion 이라고합니다.

데이터를 분할하는 이유는 크게 아래와 같습니다.

1. 대역폭 활용

네트워크 대역폭은 제한되어있기에, 한꺼번에 큰 데이터를 전송하게된다면, 대역폭을 모두 차지하여 전송이 느려지거나, 병목 현상이 나타 날 수 있습니다.

2. 데이터 손실 최소화

데이터를 한번에 보내게 되면 한번의 전송 오류에 모든 데이터가 손실 될 수 있습니다.

분할하여 전송하게되면 손실을 최소화 할 수 있고, 라우터에서의 부담 또한 줄어들게됩니다.

 

Segmentaion

상위 계층(Application계층)에서 전송계층으로 도착한 메세지가 MTU (Maximum Transmission Unit : 네트워크에서 한번에 전송 될 수 있는 최대 크기) 보다 크면 Segmentation이 실행됩니다.

(상위 계층에서는 ICMP프로토콜을 이용한 Path MTU Discovery 기능을 사용하여 자신(HOST)의 데이터링크 계층의 MTU를 동적으로 확인 합니다.)

 

분할된 TCP Segment에는 TCP헤더가 추가되며

TCP헤더에는 포트번호, 순서번호, Checksum 등의 정보가 포함되어 순서와 무결성을 확인합니다.

Segment의 크기는 추가된 헤더를 제외한 데이터의 최대 길이가 되며 이를 MSS(Maximum Segment Size)라고 합니다.

MSS는 수신,송신측이 협상하여 더 작은 크기의 MSS로 서로 통신하게됩니다.

출처 : https://www.javatpoint.com/tcp

  • 소스 포트: 데이터를 보내는 애플리케이션의 포트를 정의합니다.
  • 대상 포트: 수신 측에서 애플리케이션의 포트를 정의합니다. 
  • 시퀀스 번호: 전송하는 데이터의 순서번호입니다.
  • 승인 번호: 수신한 데이터의 응답 확인 번호입니다. 수신자가 세그먼트 번호 'x'를 수신하면 승인 번호로 'x+1'로 응답합니다.
  • HLEN: TCP헤더의 길이를 지정합니다.
  • Reserved: 향후 사용을 위해 예약된 4비트 필드이며 기본적으로 모두 0으로 설정됩니다.
  • flag
    6개의 제어 비트 또는 플래그가 있습니다.
    1. URG: 긴급 포인터를 나타냅니다. 설정되어 있으면 데이터가 긴급하게 처리됩니다.
    2. ACK: ACK가 0으로 설정되면 데이터 패킷에 승인이 포함되어 있지 않음을 의미합니다.
    3. PSH: 이 필드가 설정되면 데이터를 버퍼링하지 않고 수신 애플리케이션으로 푸시하도록 수신 장치에 요청합니다.
    4. RST: 설정되어 있으면 연결을 다시 시작하도록 요청합니다.
    5. SYN: 호스트 간의 연결을 설정하는 데 사용됩니다.
    6. FIN: 연결을 해제하는 데 사용되며 더 이상 데이터 교환이 발생하지 않습니다.
  • Window Size
    수신자가 받아들일 수 있는 데이터의 크기를 포함합니다. 이 필드는 송신자와 수신자 사이의 흐름 제어에 사용되며 수신자가 세그먼트에 할당한 버퍼의 양도 결정합니다. 이 필드의 값은 수신자에 의해 결정됩니다.
  • checksum
    이 필드는 UDP에서는 선택 사항이지만 TCP/IP의 경우 이 필드는 필수입니다.
  • Urgent 포인터
    URG 플래그가 1로 설정된 경우 긴급 데이터 바이트를 가리키는 포인터입니다. 마지막 긴급 바이트의 시퀀스 번호를 얻기 위해 시퀀스 번호에 추가할 값을 정의합니다.
  • option
    추가 옵션을 제공합니다.

 

Fragmentaion

전송계층은 HOST 즉 송신측의 MTU를 참조하여 데이터를 분할했지만, 네트워크 계층에서는 경로상의 다른 호스트나 라우터의 MTU를 참조하여 데이터를 분할합니다.

전송계층에서의 분할을 Fragmentation 단편화라고 합니다.

 

상위 계층 (여기서는 TCP 전송계층)에서 전달받은 데이터에 IP헤더를 붙여서 만들어지며,

각각 네트워크에서 다른 방법으로 전달 될 수 있기에 TCP의 Segment와 달리 순서가 보장이되지 않습니다.

따라서 분할된 패킷들이 수신 호스트에 도착하면 패킷이 재조립되는 과정이 필요합니다.

IP헤더에는 다음과 값들이 추가됩니다.

  • IP Version : IP 프로토콜 버전입니다.
  • Header Length : IP헤더의 길이를 32bit단위로 나타냅니다.
  • Type of Service : 패킷의 우선순위나 서비스 특성을 나타냅니다.
  • Total Length : 단편화된 데이터의 전체 길이 bite입니다. (IP 헤더 + 단편화된 데이터)
  • Identification : 단편화된 데이터의 일련번호, 분할되기 전 원래 패킷의 Identification값과 동일합니다.
  • Don't Fragment : 분할된 패킷에는 0, 분할되지 않은 패킷에는 1입니다.
  • More Fragment : 분할된 패킷들 중에 마지막 패킷 또는 분할되지 않은 패킷일 경우에 0, 아니면 1입니다.
  • Fragment offset : 단편화된 패킷이 원래 패킷의 어느 부분에 위치하는지 알려주는 오프셋 값입니다. 
  • Flags : 첫번째 단편화된 데이터인지 구분하기 위한 값
  • TTL : Time To Live 시간

reassembling

패킷을 재조립하는 주체는 일반적으로 목적지 호스트 또는 라우터입니다.

단편화된 데이터가 순서대로 도착하지 않기에 재조립 과정이 필요합니다.

 

1. 패킷 수신 및 임시 저장 : 도착한 패킷들을 임시로 저장하고 저장된 분할된 패킷들이 각각 Identification이 일치하는지 확인합니다.

2. 순서 조립 및 복원 : Fragment offset을 이용하여 패킷의 순서를 조립 후 단편화되지 않은 패킷으로 복원합니다.