【问题标题】:TCP handshake involving more than two ports涉及两个以上端口的 TCP 握手
【发布时间】:2021-03-08 22:42:26
【问题描述】:

我在 Kubernetes 集群上部署了一个应用程序。我在此部署中使用 Istio/Envoy 来控制入站/出站流量。我使用 TCPdump 收集了一些 TCP 数据包来调查一些问题。

据我了解,TCP 握手应该只涉及一对 5 元组(src-IP、src-Port、dst-IP、dst-Port、协议)。 例如

IP: 198.168.1.100 Port: 52312 ----SYN----> IP: 198.168.1.101 Port: 80
IP: 198.168.1.100 Port: 52312 <--SYN ACK-- IP: 198.168.1.101 Port: 80
IP: 198.168.1.100 Port: 52312 ----ACK----> IP: 198.168.1.101 Port: 80

但在我收集的数据包中,我不明白的是:

10.X.X.X    127.0.0.1   TCP 76  33500 → 15001 [SYN] Seq=3333992218
X.X.X.X     10.X.X.X    TCP 76  80 → 33500 [SYN, ACK] Seq=2228273021 Ack=3333992219
10.X.X.X    127.0.0.1   TCP 68  33500 → 15001 [ACK] Seq=3333992219 Ack=2228273022

请注意,SYN ACK 是从端口 80 返回的。首先,我认为可能丢失了数据包,实际上有两次握手,但查看序列号和确认号,似乎是单次握手。

如果这是一次握手,你会如何解释?是否有一种不同的 TCP 握手技术?

【问题讨论】:

  • 如上所述here Istio 在 0.0.0.0:15001 上生成一个监听器,接收所有到 pod 的出站流量,然后将请求交给一个虚拟监听器。 tutorial 关于这在媒体上的实际工作方式。另外看看2.4 Root CauseIstio Sidecar Interceptionhere

标签: tcp istio handshake


【解决方案1】:

如果这是一次握手,你会如何解释?是否有一种不同的 TCP 握手技术?

据此blog

这是一次握手,只有 2 个单独的连接,首先发送到 envoy sidecar,然后 envoy sidecar 作为中间人发送到您的 pod。

所以这就是魔法:客户端和服务器之间的连接不是直接建立的,而是分成两个独立的连接:

客户端和sidecar之间的连接

sidecar 和服务器之间的连接

这两个连接是独立握手的,因此即使后者失败,前者仍然可以成功。

两个方面的实际视图:一个中间人位于客户端和服务器之间


如果您正在寻找有关 15001 端口本身的更多信息,您可以访问 istio documentation

详细解释here

【讨论】:

    猜你喜欢
    • 2018-10-10
    • 2020-09-18
    • 1970-01-01
    • 1970-01-01
    • 2016-07-21
    • 2017-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多