Consider the three way handshake of TCP. It is explained here.
Now the article above mentions that two sides may try to connect simultaneously and the three way hand
It is possible to cause a simultaneous TCP open using the sockets API. As Nikolai mentions, it is a matter of executing the following sequence with a timing such that the initial SYNs cross each other.
bind addr1, port1
connect addr2, port2
bind addr2, port2
connect addr1, port1
Here's how I achieved a simultaneous open using a single Linux host.
Slow down the loopback interface using netem
tc qdisc add dev lo root handle 1:0 netem delay 5sec
Run netcat
twice
netcat -p 3000 127.0.0.1 2000
netcat -p 2000 127.0.0.1 3000
The two netcat processes connect to each other resulting in a single TCP connection
$ lsof -nP -c netcat -a -i # some columns removed
COMMAND PID NAME
netcat 27911 127.0.0.1:2000->127.0.0.1:3000 (ESTABLISHED)
netcat 27912 127.0.0.1:3000->127.0.0.1:2000 (ESTABLISHED)
Here's what tcpdump showed me (output edited for clarity)
127.0.0.1.2000 > 127.0.0.1.3000: Flags [S], seq 1139279069
127.0.0.1.3000 > 127.0.0.1.2000: Flags [S], seq 1170088782
127.0.0.1.3000 > 127.0.0.1.2000: Flags [S.], seq 1170088782, ack 1139279070
127.0.0.1.2000 > 127.0.0.1.3000: Flags [S.], seq 1139279069, ack 1170088783