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 netmem
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