Jak uzyskać surowy pakiet TCP w C #?

Chcę otrzymać surowy pakiet TCP, a następnie wysłać go z powrotem z tym samym obciążeniem.

Powinien wyglądać mniej więcej tak:

void OnPacketReceived(TcpPacket p)
{
    byte [] body = p.GetBody();
}

UWAGA: Potrzebuję pakietu TCP, a nie ramki Ethernet.