tcp双方试图同时连接

Roh*_*nga 13 sockets tcp

考虑TCP的三次握手.这里解释一下.

现在上面的文章提到双方可能会尝试同时连接,在这种情况下三方握手工作正常.

我们可以使用套接字api模拟这种情况吗?我们通常使用套接字编码的是被动打开(服务器)和活动打开(客户端)?

sig*_*ice 16

可以使用套接字API同时打开TCP.正如尼古拉所提到的,这是一个执行以下序列的问题,其时间使得初始SYN彼此交叉.

bind addr1, port1
connect addr2, port2
bind addr2, port2
connect addr1, port1
Run Code Online (Sandbox Code Playgroud)

以下是我使用单个Linux主机同时打开的方法.

  1. 使用netem减慢环回接口

    tc qdisc add dev lo root handle 1:0 netem delay 5sec
    
    Run Code Online (Sandbox Code Playgroud)
  2. netcat两次

    netcat -p 3000 127.0.0.1 2000
    netcat -p 2000 127.0.0.1 3000
    
    Run Code Online (Sandbox Code Playgroud)

两个netcat进程相互连接,从而形成单个TCP连接

$ 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)
Run Code Online (Sandbox Code Playgroud)

这是tcpdump向我展示的内容(为清晰起见编辑了输出)

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
Run Code Online (Sandbox Code Playgroud)