sockets - tcp 两端尝试同时连接

标签 sockets tcp

考虑 TCP 的三次握手。说明here .

现在上面的文章提到两侧可能会尝试同时连接,并且三向握手在这种情况下可以正常工作。

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

最佳答案

使用套接字 API 可以同时打开 TCP。正如 Nikolai 所提到的,这是一个执行以下序列的问题,其时间安排使得初始 SYN 相互交叉。

bind addr1, port1
connect addr2, port2
bind addr2, port2
connect addr1, port1

下面是我如何使用单个 Linux 主机实现同时打开。

  1. 使用 netem 减慢环回接口(interface)速度

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

相关文章:

android - 在 Android 聊天应用程序中看到的功能

android - 强制关闭 TCP/IP (Telnet) 连接

python - 导入错误 : No module named 'twisted'

Python:在连接时将数据发送到套接字

python - 如何启动连接到您正在监听的套接字的进程?

客户端随机连接到服务器

c - 确定网络流量中的关闭/关闭流量

tcp - 如何使 AT 命令以编程方式在 arduino 中为 ESP8266 wifi 模块工作

java - 单独的 TCP/SSL 连接用于身份验证,而 UDP 连接用于主要流量?

c# - Socket c# 通过互联网聊天?