A flip-flop doesn't sample D at a single instant. It needs D steady across a short window around the clock edge:
- it opens
tsubefore the edge (the setup time), - it closes
thafter the edge (the hold time), - so its width is
tsu + th.
Think of a camera with a slow shutter: the subject has to hold still for the whole exposure, not just the moment the button clicks. Outside the window D can do anything; the flip-flop ignores it.
If D changes inside the window, the flip-flop may capture the wrong value or go metastable. The setup constraint keeps data from arriving too late, at the start of the window. The hold constraint keeps new data from arriving too early, before the window has closed.
An asynchronous input has no fixed timing, so sooner or later it will land inside the window. That's why it needs a synchronizer.