tcp two sides trying to connect simultaneously

前端 未结 3 966
逝去的感伤
逝去的感伤 2020-12-29 09:46

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

3条回答
  •  小鲜肉
    小鲜肉 (楼主)
    2020-12-29 10:22

    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.

    1. Slow down the loopback interface using netem

      tc qdisc add dev lo root handle 1:0 netem delay 5sec
      
    2. 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
    

提交回复
热议问题