【问题标题】:Different port number on client and server for same connection相同连接的客户端和服务器上的不同端口号
【发布时间】:2015-10-04 23:45:52
【问题描述】:

我通过 websocket 建立了从客户端到服务器的连接。 我只是在检查 netstat o/p 以了解网络级别的详细信息。 我发现当我在客户端和服务器上运行 netstat -anpt 时,我得到不同的客户端端口。 例如 在服务器上,

tcp6 0 0 172.34.10.158:8080 121.71.171.152:28301
已建立 13250/java

在客户端,

tcp6 0 0 192.168.0.111:35129 51.74.132.142:8080
已建立 8209/java

所以来自服务器的客户端端口是“28301”,但是当我检查我的客户端时,它是“35129”。 我对此有点困惑。 附言192.168.0.111 是我的本地 ip,51.74.132.142 是我服务器的公共 ip,121.71.171.152 是我的 ISP ip,172.34.10.158 是我服务器的私有 ip。 很高兴了解更多关于此的信息,因此任何文档、资源都会很有用。

【问题讨论】:

    标签: java networking tcp websocket


    【解决方案1】:

    客户端和服务器都位于NAT (Network Address Translation) 防火墙后面。

    您列出了:

    客户端:tcp6 0 0 192.168.0.111:35129 51.74.132.142:8080

    服务器:tcp6 0 0 172.34.10.158:8080 121.71.171.152:28301

    您的客户端在您的本地网络上的 IP 为 192.168.0.111,并希望在端口 8080 上与位于 51.74.132.142 的服务器对话,因此它为对话分配了一个动态端口(端口 35129)。

    TCP/IP 数据包通过带有源 NAT 的防火墙离开本地网络,该防火墙将源 IP:Port 映射到 121.71.171.152:28301
    那是您办公室/家庭的外部IP。您可以通过http://www.whatsmyip.org/ 确认。

    TCP/IP 数据包到达保护服务器网络的防火墙,该防火墙配置了destination-NAT,因此它将目标IP:Port 映射到172.34.10.158:8080

    服务器收到数据包并建立连接。

    以其他方式流动的数据包然后被防火墙取消映射。防火墙维护状态以记住如何反转映射。为了节省资源,状态有一个超时,所以如果服务器真的很慢并且响应时间比超时时间长,即使客户端还在等待,响应也会丢失。网络管理员控制超时。我已经看到它们低至 5 分钟,因此任何超过 5 分钟的响应时间都不会返回给客户。
    道德:将客户端超时设置为高于防火墙 NAT 超时只会延迟不可避免的情况。

    回顾

    Network                      Source                Destination
    YourPC   --lan--> Firewall   192.168.0.111:35129   51.74.132.142:8080
    Firewall --web--> Firewall   121.71.171.152:28301  51.74.132.142:8080
    Firewall --lan--> Server     121.71.171.152:28301  172.34.10.158:8080
    

    【讨论】:

    • @Andreas 我不认为 N​​AT 是原因。我们可以将所有客户端服务器都放在同一台机器上(127.0.0....,但您仍然会有相同类型的信息布局。网络元组与 NAT 无关。
    • @Ritesh,当客户端和服务器在同一台机器上时,我看不到与我原来的问题相同的布局。只有当两者都在不同的主机上时才会发生。
    • @Ritesh 你误解了这个问题。这与源 IP 为何使用动态端口号或源/目标 IP/端口组合如何唯一标识对话无关。这是关于为什么客户端机器和服务器机器没有显示相同的信息(除了反转),是因为 NAT。与自己或同一本地网络上的服务器交谈时,值将相同(相反)。
    • @Andreas...谢谢..我真的误解了这个问题...我以为我们在问为什么 Nestat 有这种输出。
    【解决方案2】:

    这是一个网络元组 hostip:hostport:destip:dest:port:protocol。所有这 5 个信息共同定义了操作系统级别的一个连接。在操作系统级别,它必须知道所有这些细节,才能成功地将数据从主机路由到目标,反之亦然。

    How many tuples are there in a connection?

    https://en.wikipedia.org/wiki/Network_socket#Socket_pairs

    【讨论】:

    • 但这如何证明服务器和客户端的 netstat o/p 中的不同端口?
    • 使用示例.. 许多客户端尝试连接到服务器。因此操作系统需要唯一了解每个连接,因此需要额外的信息来定义唯一连接。因此,如果操作系统添加客户端地址,那么操作系统可以唯一区分客户端。但是现在如果相同的客户端建立 10 个连接会发生什么。然后,如果我们在操作系统级别添加端口,那么我们可以唯一区分相同的客户端。现在,如果同一个客户端和同一个端口建立 udp 连接,那么您还需要保存协议。这就是在操作系统级别使用这 5 个值唯一定义每个连接的方式。
    • 只想知道...为什么是-1?
    猜你喜欢
    • 2021-10-03
    • 1970-01-01
    • 2021-10-10
    • 1970-01-01
    • 2019-07-12
    • 1970-01-01
    • 2013-05-27
    • 2016-10-08
    • 2015-10-24
    相关资源
    最近更新 更多