Let me try answering that from positions of RTS (think of it as TBS where each turn is 100msec).
There is separate thread for receiving and sending messages, it has it's own buffer and is black-box to the rest of the game (the game should know nothing about protocol and format). The game sends commands to networking unit and receives complete commands as they are available and verified to be complete.
When networking unit receives a new message it appends it to buffer and checks if buffer has a complete command. That is why each message has a header specifying contents length and CRC. That is ASync part of it.
How to identify the host? That depends on your network layout, is peer-to-peer or centralized server or .. ? If you trust your clients to do the computations (not advised for serious gaming) then there's no host at all, Everyone trusts everyone to supply valid data. If you have a separate host (could be running as stand-alone task on one of players machines) - it does all the computations and clients act as terminals, doing only View-Controller roles.
We use TCP module from OverbyteICS (that is one more layer between the networking module and Net) and it does it for us, each time new connection is made it is assigned new "stream". So when message arrives we know the "stream" who sent it, but in networking module we keep remap table, so that in lobby all players have UIDs and in game all players are IDs 1..8 (again, game knows nothing about networking UIDs).
As for specific details I can't say how it's made inside OverbyteICS, but we have possibility to launch local server and 1-8 clients on the same PC (all having same IP 127.0.0.1) and they are all distinct in game, so this means OverbyteICS takes care of that.