ns.Read(headerBuffer); // прочитали заголовок
Вот здесь нет гарантии, что вы прочитали именно столько байт сколько у вас буфер.
Поэтому метод Read возвращает количество фактически прочитанных байт.
Это классические проблемы чтения, про которые можно почитать
тут
Там как раз про то, как решить это все с помощью pipelines, которые упоминал
Василий Банников