A method of processing a packet, wherein, a memory is divided into a plurality of first blocks, each of the first blocks being divided into a plurality of second blocks, each of the second blocks including a first storage space and a second storage space, and the method comprising: obtaining a first packet to be stored; determining one or more second blocks to be occupied by the first packet based on a length of the first packet and a length of the first storage space; storing each of fragments of the first packet in the first storage space of each of the determined second blocks; for each of the determined second blocks, generating a packet descriptor, PD, corresponding to the second block, wherein each of the second blocks stores both a fragment of the first packet and the PD corresponding to the fragment of the first packet, and wherein the PD comprises information fields indicating status of the second block corresponding to the PD, an address of a next first block, and the number of second blocks in the next first block, and storing the PD in the second storage space of the second block; determining one or more second blocks to be read based on a start address of a second packet to be read; for each of the second blocks to be read, reading a packet fragment from a respective first storage space of the second block to be read, and reading the PD from a respective second storage space of the second block to be read; obtaining the second packet by composing the read packet segments based on the read PDs, and sending the second packet. obtaining a first packet to be stored; determining one or more second blocks to be occupied by the first packet based on a length of the first packet and a length of the first storage space; storing each of fragments of the first packet in the first storage space of each of the determined second blocks; for each of the determined second blocks, generating a packet descriptor, PD, corresponding to the second block, wherein each of the second blocks stores both a fragment of the first packet and the PD corresponding to the fragment of the first packet, and wherein the PD comprises information fields indicating status of the second block corresponding to the PD, an address of a next first block, and the number of second blocks in the next first block, and storing the PD in the second storage space of the second block; generating a packet descriptor, PD, corresponding to the second block, wherein each of the second blocks stores both a fragment of the first packet and the PD corresponding to the fragment of the first packet, and wherein the PD comprises information fields indicating status of the second block corresponding to the PD, an address of a next first block, and the number of second blocks in the next first block, and storing the PD in the second storage space of the second block; determining one or more second blocks to be read based on a start address of a second packet to be read; for each of the second blocks to be read, reading a packet fragment from a respective first storage space of the second block to be read, and reading the PD from a respective second storage space of the second block to be read; reading a packet fragment from a respective first storage space of the second block to be read, and reading the PD from a respective second storage space of the second block to be read; obtaining the second packet by composing the read packet segments based on the read PDs, and sending the second packet.