【问题标题】:TCP self connect is not simultaneous open?TCP自连接不是同时打开的吗?
【发布时间】:2019-01-13 06:35:00
【问题描述】:

为了说明 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 同时打开 [ref: TCP/IP Illustrated, Volume 1, Figure 18.17 and Figure 18.18]

接下来,回忆一下TCP状态转移图

对于自连接的情况,TCP状态转换应该是:

  • 向目标发送SYN,CLOSE -> SYN_SENT
  • 接收 SYN(来自自己),发送 SYN+ACK 到 dst,SYN_SENT -> SYN_RECD
  • 接收 SYN+ACK(来自自己),SYN_RECD -> ESTABLISHED

问题 1

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

问题 2

接收 SYN+ACK(来自自己),SYN_RECD -> ESTABLISHED

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

【问题讨论】:

    标签: networking tcp tcpdump


    【解决方案1】:

    不,它不是同时打开的。同步开放是被理论化并写入标准的东西,但在实践中从未发生过。

    在同时打开中,理论上是两个主机同时(或足够近,因为每一端在尝试打开连接之前都没有看到对方的初始SYN)尝试建立连接,但有特殊条件.

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

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

    如果您运行该脚本,然后从任何其他客户端主机连接,您将看到四次握手的动作!

    【讨论】:

    • 感谢您的回答!我现在对同时打开很清楚,但是对于自连接还是一头雾水,如何解释自连接TCP的建立?
    • 自连接与连接到另一台主机没有任何不同。堆栈的行为方式完全相同。唯一的“区别”是“远程”端点是 127.0.0.1。
    • 但是有问题,发送的SYN应该自己去(已经处于SYN_SENT状态),这对应于同时打开。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-26
    • 2021-02-14
    • 2018-02-19
    • 1970-01-01
    • 2021-11-04
    • 2016-08-03
    相关资源
    最近更新 更多