首页 > 解决方案 > 涉及两个以上端口的 TCP 握手

问题描述

我在 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 握手技术?

标签: tcpistiohandshake

解决方案


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

根据这个博客

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

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

客户端和边车之间的连接

Sidecar 和服务器之间的连接

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

在此处输入图像描述

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


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

这里有更详细的解释。


推荐阅读