You have it backwards. ob_start does not buffer the headers, it buffers the content. Using ob_start
allows you to keep the content in a server-side buffer until you are ready to display it.
This is commonly used to so that pages can send headers 'after' they've 'sent' some content already (ie, deciding to redirect half way through rendering a page).