R1 --- 126.96.36.199/24 --- R2 --- 188.8.131.52/24 --- R3 --- 184.108.40.206/24 --- R4
If the IP MTU between R2 and R3 is 68 and we send a ping from R4 -> R1 with a size of 68 bytes we get this:
However, if we do that same ping but make the size 69 bytes we get this:
Notice how the IP fragment shows up? The router split the packet almost in half. The first fragment carried 24 of the 69 bytes and the offset was set to 0. The 2nd packet carried the remainder of the packet and begins at byte offset 24. Since the offset is expressed in multiples of 8, the actual value store is '00 03' - 13 bits are allowed for the offset value. That allows the receiver to stitch the packet back together from the fragments it receives.
Imagine we have data ,say 6000 bytes that we want to send on a data link with 1500 bytes MTU. We must fragment this data into chunks of 1500 bytes and when it gets to the destination, it will be reassembled.
So how does the destination know that if it received four fragments, those fragments are part of the same data that was fragmented? That is where the IDENTIFIER comes in. The fragments are marked with the same number in the Identifier field so that when the destination receives the four fragments, it will know that these are part of the same data flow.
But the fragments might not always arrive in sequence. The receiver must however reassemble to fragments in the right order to make sense of the data. That is where the FRAGMENT OFFSET comes in; which defines the position of each fragment in the flow so that the destination can reassemble in the right order.