TCP自连接不能同时打开吗?

时间:2018-08-06 10:13:10

标签: networking tcp tcpdump

为说明TCP自连接示例

  • nc -p 9987 127.0.0.1 9987

tcpdump捕获了连接建立

17:52:33.980137 IP 127.0.0.1.9987 > 127.0.0.1.9987: Flags [S], seq 4215993872, win 43690, options [mss 65495,sackOK,TS val 10050427 ecr 0,nop,wscale 7], length 0
17:52:33.980162 IP 127.0.0.1.9987 > 127.0.0.1.9987: Flags [S.], seq 4215993872, ack 4215993873, win 43690, options [mss 65495,sackOK,TS val 10050427 ecr 10050427,nop,wscale 7], length 0
17:52:33.980174 IP 127.0.0.1.9987 > 127.0.0.1.9987: Flags [.], ack 1, win 342, options [nop,nop,TS val 10050427 ecr 10050427], length 0

就像普通的TCP建立一样,但是dst addr和src addr相同。

调用TCP同时打开[参考:TCP / IP图解,第1卷,图18.17和图18.18]

enter image description here enter image description here

接下来,回顾一下TCP状态转换图

enter image description here

对于自连接情况,TCP状态转换应为:

  • 将SYN发送到目标位置,CLOSE-> SYN_SENT
  • 从自身接收SYN,将SYN + ACK发送到dst,SYN_SENT-> SYN_RECD
  • 从自身接收SYN + ACK,SYN_RECD->已建立

问题1

自连接和同时打开之间的过程完全不同(由tcpdump显示)。我有什么想念的吗?

问题2

  

从自身接收SYN + ACK,SYN_RECD->已建立

TCP状态转换图中未显示此转换。怎么解释?

1 个答案:

答案 0 :(得分:0)

不,它不是同时打开的。同步开放是经过理论化并写入标准的内容,但是从不在实践中会发生。

在同时打开中,理论上是两个主机同时(或距离足够近,以至于每个端在尝试打开连接之前都没有看到另一端的初始SYN)试图建立连接,但是有特殊条件

主机A从连接到B上端口Y的端口X打开。 主机B从端口Y打开到主机A上的端口X。

在这种情况下,您将看到似乎是四向握手。如果您想向自己证明这可行,则可以使用Scapy进行尝试。 Here is a Scapy script that you can run on a host您必须使用iptables禁用来自主机的出站RST数据包,否则它将失败

如果您运行该脚本,然后从任何其他客户端主机进行连接,则将看到四种方式的握手!