Read the docs at php.net for session_start, header and possibly some more pages.
In short: as soon as output is sent (in php script: echo, print etc; or anything outside php script, such as leading BOM, intentional html code or whatever) headers are also sent, because headers MUST preceed any other output. And once output is sent, headers can't be sent, once again because headers MUST preceed any other output.
Because of this, php & web server will send headers as soon as any kind of output is sent, and after that point, there's nothing you can do about it.
Hint:
output started at filname:line-number
let's you know where output started.