Jaka jest różnica między strumieniami a datagramami w programowaniu sieciowym?

Jaka jest różnica między gniazdami (strumień) a gniazdami (datagramami)? Po co używać jednego nad drugim?