¿Cómo separar adecuadamente los paquetes usando Sockets stream? C#

Estoy creando una aplicación de servidor / cliente y estoy buscando opciones para separar paquetes. He leído que lo más apropiado sería crear un encabezado que contenga información sobre qué tan grande es la carga útil y luego leer hasta que termine.

¿Cómo funciona eso programáticamente?

También separándolos usando "\ n" nueva línea. Un buen ejemplo sería bueno.

Estoy asincrónico recibiendo datos de esta manera:

private void AsyncReceive(IAsyncResult result)
    {
        int bytesTransfered;

        try
        {
            bytesTransfered = _handle.EndReceive(result);

            if(bytesTransfered <= 0)
            {
                throw new Exception("No bytes transfered");
            }
        }
        catch(NullReferenceException)
        {
            return;
        }
        catch(ObjectDisposedException)
        {
            return;
        }
        catch(Exception)
        {
            return;
        }


        byte[] received = new byte[bytesTransfered];

        try
        {
            Array.Copy(_readBuffer, received, received.Length);
        }
        catch(Exception)
        {
            Disconnect();
            return;
        }


        // How should I process the received data now?


        try
        {
            _handle.BeginReceive(_readBuffer, 0, _readBuffer.Length, SocketFlags.None, AsyncReceive, null);
        }
        catch(ObjectDisposedException)
        {
            return;
        }
        catch(Exception)
        {

        }
    }

Respuestas a la pregunta(2)

Su respuesta a la pregunta