user323: I'm trying to understand how exactly does the Bitcoin client communicate initially with another client, as I'm making my own client and learning new things about TCP protocol. As I understand, the Bitcoin client uses the standard port (8333) as a server port that is listening to other clients' communication, and the client opens up new ports as it is trying to communicate with other clients. As I'm not sure if I understand the communication correctly, I made this chart:

My question is: is this diagram and my assumptions correct, or did I make some mistake in understanding how the protocol works?

user1409: You're pretty close, with the deviations being I think primarily in terminology.
Client A listens for connections on port 8333. Listening is a server activity.
Client A chooses an ephemeral port and opens a connection to the address of Client B on port 8333, on which Client B is listening. At the TCP level, there is a three-way handshake to establish the connection. Imagine this connection as a bi-directional pipe to and from which both clients can read and write.
Once established, Client A sends Version and Client B receives it. Client B sends Version and Client A receives it. Client A sends Verack and I think Client B also sends Verack, which is an acknowledgement of the version compatibility or receipt.
This is my understanding.

323: <p>I'm trying to understand how exactly does the Bitcoin client communicate initially with another client, as I'm making my own client and learning new things about TCP protocol. As I understand, the Bitcoin client uses the standard port (8333) as a server port that is listening to other clients' communication, and the client opens up new ports as it is trying to communicate with other clients. As I'm not sure if I understand the communication correctly, I made this chart:</p>

<p><img src="https://docs.google.com/drawings/pub?id=1Vj0sjmZqbQy97JShB1DUcEXpDiH7djdLsGFxXGFWp3E&amp;w=960&amp;h=720"></p>

<p>My question is: is this diagram and my assumptions correct, or did I make some mistake in understanding how the protocol works?</p>
 1409: <p>You're pretty close, with the deviations being I think primarily in terminology.</p>

<p>Client A <em>listens</em> for connections on port 8333. <em>Listening</em> is a <em>server</em> activity.</p>

<p>Client A chooses an <a href="https://en.wikipedia.org/wiki/Ephemeral_port" rel="nofollow">ephemeral port</a> and opens a connection to the address of Client B on port 8333, on which Client B is <em>listening</em>. At the TCP level, there is a <a href="http://www.inetdaemon.com/tutorials/internet/tcp/3-way_handshake.shtml" rel="nofollow">three-way handshake</a> to establish the connection. Imagine this connection as a bi-directional pipe to and from which both clients can read and write.</p>

<p>Once established, Client A sends <code>Version</code> and Client B receives it. Client B sends <code>Version</code> and Client A receives it. Client A sends <code>Verack</code> and I think Client B also sends <code>Verack</code>, which is an acknowledgement of the version compatibility or receipt.</p>

<p>This is my understanding.</p>
