you have cracked half the case already by reading the material, the point of interest here is the code 4 which relates to "Fragmentation needed or DF Set".
here DF stands for Don't Fragment, which is an essentially a 3 bit section in the entire IP packet structure. the first bit is not used as it is reserved. the second bit is used to specify if the packet can be fragmented or not and is called the DF bit. setting the value for this bit to 0 would mean YES you can fragment it. setting the value to 1 would mean, no you cannot fragment this packet. the third bit is related to the second bit. this bit stands for More Fragments. if the second bit is set to 0, which means you can fragment this packet, then the first packet of the entire big packet will have a value 1. coupled with the DF value as 0 this means that this particular IP packet can be fragmented, and you are expecting more fragment packets from the original big packet. the last packet of the entire original packet will have the last bit set to 0. this coupled with DF set to 0 means, either this is a fragmentable packet and this particular packet is the only packet of that fragment, or this is a fragmentable packet, and this is the last fragment of the big packet.
by design, ICMP packets have the DF value set to 1. this means that ICMP packets cannot be fragmented. this is because ICMP is a network management protocol, hence fragmentation could compromise packet content in various ways.
now by the looks of it, it seems your ICMP packets are going through a channel which cannot take the full size of the ICMP packets, but cannot even fragment the incoming IP packet containing the ICMP segment, simply because the DF field in the IP packet is set to 1. hence no ping packet i.e ICMP packets can get through that 'bottleneck'.
ways to solve the problem, first step:
find the bottleneck
a more detailed network structure could help us diagnose where it is, so if possible post a simple picture of your lan structure.