The differences are fairly minor. Both make a shallow copy of an object, but dup does not copy *special attributes* of that object (clone does).
Special attributes include "frozen" and "tainted." If you freeze a String (so it becomes immutable), and you want to make a copy so that you can change it (without changing the original), then you should just use dup. It will make a copy of the original String, without the special attribute that freezes it. If you want an exact copy with all the special attributes in place, then use clone.