TCP/IP Illustrated Vol 1. 내용 요약.
IP Fragmentation은 전송 중 데이터그램이 MTU보다 큰 경우 어디에서나 발생할 수 있다. 한 번 분할된 패킷이 다시 분할되는 것도 가능하다. (인덱스가 아니라 오프셋을 기록하니까) 그리고 전송 계층(TCP, UDP 등)은 IP Fragmentation에 대해서 모른다. 이것은 분할된 부분 중 하나라도 유실된다면 전체 데이터그램이 다시 전송되어야 함을 의미한다. IP 자체는 타임아웃이나 재전송이라는 개념이 없으니 상위 계층에서 전체를 다시 보내게 되는 것.
IP 헤더의 Identification 필드는 각 데이터그램의 식별 번호를 담고 있으며, Fragmentation 되는 경우에도 이 Id값은 그대로 복사된다. Fragment Offset만 바뀔 뿐이다. Total Length는 분할된 크기에 맞춰서 조정된다. 분할하는 크기는 항상 8의 배수로 정렬된다. 물론 마지막 부분은 예외. 마지막 부분을 제외하고는 Flags 필드의 More Fragments 비트가 켜진다.
Don't-Fragment 비트를 켜놓고 ICMP Fragmentation Required 응답을 관찰하는 것으로 경로 전체의 MTU 값을 계산할 수 있다. 구형 장비가 아니라면 ICMP 에러 응답 자체에 MTU 값이 쓰여서 돌아온다.
IP 계층은 데이터그램의 분할된 조각을 받은 경우 타이머를 시작시켜야 한다. 보통 30초에서 60초 정도 시간을 두고 나머지 조각을 받는다. 만약 시간 내에 모든 조각이 도착하지 않으면 전부 버려진다. 이렇게 버려지는 경우 ICMP time exceeded during reassembly 에러가 발생할 수 있는데, 여기에도 조건이 있다. 첫번째 조각이 도착하지 않으면 어차피 전송자가 에러를 받아도 프로세스와 연관시키는데 필요한 전송 계층 헤더가 없기 때문에, 그냥 ICMP 에러 응답 없이 조용히 버린다. 조건이 맞더라도 BSD 계열은 그냥 무시하도록 구현한 경우가 많다고 한다.
RFC 815: IP Datagram Reassembly Algorithm
IP Fragmentation은 전송 중 데이터그램이 MTU보다 큰 경우 어디에서나 발생할 수 있다. 한 번 분할된 패킷이 다시 분할되는 것도 가능하다. (인덱스가 아니라 오프셋을 기록하니까) 그리고 전송 계층(TCP, UDP 등)은 IP Fragmentation에 대해서 모른다. 이것은 분할된 부분 중 하나라도 유실된다면 전체 데이터그램이 다시 전송되어야 함을 의미한다. IP 자체는 타임아웃이나 재전송이라는 개념이 없으니 상위 계층에서 전체를 다시 보내게 되는 것.
IP 헤더의 Identification 필드는 각 데이터그램의 식별 번호를 담고 있으며, Fragmentation 되는 경우에도 이 Id값은 그대로 복사된다. Fragment Offset만 바뀔 뿐이다. Total Length는 분할된 크기에 맞춰서 조정된다. 분할하는 크기는 항상 8의 배수로 정렬된다. 물론 마지막 부분은 예외. 마지막 부분을 제외하고는 Flags 필드의 More Fragments 비트가 켜진다.
Don't-Fragment 비트를 켜놓고 ICMP Fragmentation Required 응답을 관찰하는 것으로 경로 전체의 MTU 값을 계산할 수 있다. 구형 장비가 아니라면 ICMP 에러 응답 자체에 MTU 값이 쓰여서 돌아온다.
IP 계층은 데이터그램의 분할된 조각을 받은 경우 타이머를 시작시켜야 한다. 보통 30초에서 60초 정도 시간을 두고 나머지 조각을 받는다. 만약 시간 내에 모든 조각이 도착하지 않으면 전부 버려진다. 이렇게 버려지는 경우 ICMP time exceeded during reassembly 에러가 발생할 수 있는데, 여기에도 조건이 있다. 첫번째 조각이 도착하지 않으면 어차피 전송자가 에러를 받아도 프로세스와 연관시키는데 필요한 전송 계층 헤더가 없기 때문에, 그냥 ICMP 에러 응답 없이 조용히 버린다. 조건이 맞더라도 BSD 계열은 그냥 무시하도록 구현한 경우가 많다고 한다.
RFC 815: IP Datagram Reassembly Algorithm




