考虑 TCP 的三次握手。说明here .
现在上面的文章提到两侧可能会尝试同时连接,并且三向握手在这种情况下可以正常工作。
我们可以使用 sockets api 来模拟这种情况吗? 我们通常使用套接字编码的是被动打开(服务器)和主动打开(客户端)?
最佳答案
使用套接字 API 可以同时打开 TCP。正如 Nikolai 所提到的,这是一个执行以下序列的问题,其时间安排使得初始 SYN 相互交叉。
bind addr1, port1
connect addr2, port2
bind addr2, port2
connect addr1, port1
下面是我如何使用单个 Linux 主机实现同时打开。
使用 netem 减慢环回接口(interface)速度
tc qdisc add dev lo root handle 1:0 netem delay 5sec
运行
netcat
两次netcat -p 3000 127.0.0.1 2000 netcat -p 2000 127.0.0.1 3000
两个 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)
这是 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
关于sockets - tcp 两端尝试同时连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2231283/