블로그 이전했습니다. https://jeongzero.oopy.io/
IPv4 데이터그램 단편화
본문 바로가기
컴퓨터 관련 과목/Network

IPv4 데이터그램 단편화

728x90

모든 링크 계층 프로토콜이 같은 크기의 네트워크 계층 패킷을 전달할 수 없다. 어떤 프로토콜은 큰 데이터그램을 전달하는 반면에 다른 프로토콜은 작은데이터그램만을 전달할 수 있다. 예를 들어 이더넷 프레임은 최대 1500바이트 데이터를 전달할 수 있지만 광역 링크 프레임은 576바이트 이상의 데이터를전달할 수 없다. 링크 계층 프레임이 전달할 수 있는 최대 데이터 양을 MTU(maximum transmission unit)라 부른다. 


각 IP 데이터그램은 한 라우터에서 다른 라우터로 전송하기위해 링크계층 프레임 내에 캡슐화되므로 링크 계층 프로토콜의 MTU는 IP 데이터그램 길이에 엄격한 제약을 둔다. IP 데이터그램 자체의 크기 제약은 문제가 되지 않지만 문제는 송신자와 목적지 간의 경로를 따르는 각 링크가 다른 링크 계층 프로토코을 사용 할 수 있고 각 프로토콜이서로 다른 MTU를 가질 수 있다는 점이다. 


쉽게 이해하기 위해서 만약 내가 이사짐을 나르는 알바를 한다고 생각해보자. 현재 3대 300kg 정도 들고 열심히 짐을 나르고 있다. 근데 갑자기 내앞에 엄청 무겁고 큰 짐이 떡하니 나타났다. 아무리 해도 이 짐을 한번에 옮기기는 절대 불가능하다. 내 힘으로 들수있는 수준이 아니다. 그렇다면 어떻게 할 것인가? 정답은 간단하다. 이 무겁고 큰 짐을 여러개의 조각으로 분할하여 하나씩 옮기는 것이다. 그리고 하나씩 다 옮겼으면 맨마지막 도착지에서 다시 하나로합치면 된다.(짐이 분할도 가능하고 다시 합치는 것도 가능하다는 전제로...) 


이제 어떻게 단편화되는지를 자세히 살펴보자. IP헤더에서 단편화-재결합 에 필요한 옵션들은 3가지로 구성된다. 식별자, 플래그, 단편화 오프셋이 해당 필드이다. 하나의 데이터그램이 여러개로 단편화되고 마지막에 다시 결합될라면 이러한 단편화된 데이터그램들은 모두 같은 식별자를 가지고 있어야 한다. 즉 ID값이 달라지면 안되고 모두 동일해야한다. 


그리고 어디까지가 단편화된 데이터그램인지 구별하기위해 맨 마지막 단편화 데이터그램의 플래그는 0으로, 다른 모든 조각의 플래그는 1로 설정된다. 마지막으로는 오프셋 필드는 조각이 분실되었는지 또는 적절한 순서로 조각을 재결합 하기위해 데이터그램내에 조각의 위치를 명시하는 용도로 사용된다.



위의 그림을 보자. 만약에 입력 패킷의 크기가 4000바이트이고 이 패킷이 나가려는 링크의 MTU는 최대 1500바이트이다. 그렇다면 4000바이트의 패킷을 쪼개야 한다. 여기서 주의해야 하는게 단순히 1500바이트씩 쪼개기만 하는게 아니라 쪼개는 패킷도 IP데이터그램의 포맷을 맞춰야 한다. 따라서 헤더크기인 20바이트를 고려해야 한다. 우선 4000바이트의 입력패킷은 20바이트의 헤더와 3980바이트의 페이로드로 이루어져 있다. 우리는 페이로드인 3980바이트를 1480바이트씩으로 쪼개고 각 조각마다 20바이트의 헤더를 붙여야한다.


입력패킷 : 20+3980 (바이트)

3980=1480+1480+1020 (바이트)

첫번째 단편 : 20(헤더) + 1480(페이로드)    | ID : x  | fragflag : 1  | offset : 0

두번째 단편 : 20(헤더) + 1480(페이로드)    | ID : x  | fragflag : 1  | offset : 185

세번째 단편 : 20(헤더) + 1020(페이로드)    | ID : x  | fragflag : 0  | offset : 370


오프셋은 첫번째 단편의 페이로드 나누기 8(바이트)로해서 나온 값으로 하면된다. 즉 첫번째 단편의 오프셋은 0, 두번째는 185, 세번째는 370이다.

여기서 처음에 나는 3개의 단편을 다 더하면 4040 바이트인데 머지? 이랬다ㅋㅋㅋ 빡통대가리라;; 

잘보면 헤더는 패킷이 목적지로 가기위해 필요한 정보들이 들어있는 것이기 때문에 실질적인 데이터자체는 페이로드 부분에 있다. 따라서 3980바이트에 

실질 데이터 내용이 들어가 있는 것이고 이것을 1480바이트 씩 쪼개면 1480 + 1480 + 1020 바이트로 쪼개지는 것이다. 헷갈리지 말자 이제..



그럼이제 문제를 하나 풀어보쟈.

1600바이트 데이터그램을 500바이트의 MTU를 가지는 링크로 전송한다고 생각하자. 원래 데이터그램에 식별번호 291이 포함되었다고 가정하자. 얼마나 많은 단편들이 생성되는가? 단편화에 관련되어 생성된 IP 데이터그램의 다양한 필드들의 값은 무엇인가?


문제 풀이 :

입력패킷 : 20+1580 (바이트)

1580=480+480+480+140 (바이트)

오프셋 : 480 / 8 = 60

첫번째 단편 : 20(헤더) + 480(페이로드)    | ID : 291  | fragflag : 1  | offset : 0

두번째 단편 : 20(헤더) + 480(페이로드)    | ID : 291  | fragflag : 1  | offset : 60

세번째 단편 : 20(헤더) + 480(페이로드)    | ID : 291  | fragflag : 1  | offset : 120

네번째 단편 : 20(헤더) + 140(페이로드)    | ID : 291  | fragflag : 0  | offset : 180


728x90