【问题标题】:HTTP traffic vs Socket trafficHTTP 流量与 Socket 流量
【发布时间】:2017-03-18 03:32:08
【问题描述】:

我知道为了连接一个网站,在TCP层,源端口是一个高随机数,目的是80。所以,响应段有80作为源端口,随机端口号作为目的端口。

据我了解,客户端在等待其 HTTP 请求的响应时会侦听该随机端口号。

当我创建一个 TCP 服务器套接字并且我想让它监听特定的端口 (47860) 时,为什么我应该配置我的路由器并转发端口,而我在使用 Web 浏览器时不需要这样做? HTTP 套接字和通用 TCP 套接字有什么区别?

【问题讨论】:

  • HTTP 是使用 TCP 的应用层协议。 “套接字”与 TCP 层相关,而不是应用程序。没有“HTTP 套接字”
  • 你必须阅读 TCP。客户端不听任何东西,连接已经打开。也没有 HTTP 套接字之类的东西。
  • 在一个基于HTTP的进程下,我们找到了一个TCP套接字;出于这个原因,我使用了“HTTP 套接字”这个术语。
  • 为什么我的路由器接受传入的 HTTP 流量并阻止传入的套接字流量?
  • “据我了解,客户端在等待其 HTTP 请求的响应时侦听该随机端口号。”我不想让你感到困惑,但“听”在这里不是正确的术语。有两种类型的套接字,服务器套接字和客户端套接字。我们说服务器套接字侦听新连接,而客户端套接字连接到服务器套接字。不同之处在于,服务器套接字能够与多个客户端交换流量,而客户端套接字可以与单个服务器通信。

标签: sockets networking tcp port portforwarding


【解决方案1】:

当 NAT 后面的客户端向远程主机发起流量时,NAT 路由器会记住这一点。这样,从远程主机到本地客户端的响应可以重定向到客户端。

当您在 NAT 后面有一台服务器而没有转发其侦听端口时,路由器将丢弃该端口的任何传入流量:之前没有从 NAT 后面该客户端的流量,所以就路由器而言,没有什么要记住的,也没有什么要转发的。

【讨论】:

  • 假设我连接到一个网站,我的随机源端口号是 35691。路由器生成另一个公共源端口号(例如 43512)。路由器是否打开此端口(43512)来接收 HTTP 响应?
  • 我禁用了路由器防火墙,然后通过 canyouseeme.org 检查了端口。港口仍然关闭。如果它们被 ISP 阻止,我的路由器如何接收 HTTP 响应?
  • HTTP 部分与防火墙完全无关。关键是:从 NAT 后面发起的流量(例如发出 HTTP 请求的浏览器)不需要端口转发(路由器会自动和临时地这样做),从外部发起的流量需要路由到内部的机器(例如例如,您运行 Web 服务器)是否需要永久端口转发,因为之前没有流量。
  • 我已经完成了端口转发并禁用了路由器和 windows 防火墙。此外,我将我的 Web 服务器配置为高端口号以避免 ISP 端口阻塞问题。我仍然无法远程连接到我的网络服务器(局域网没有问题)
  • 我认为这是一个理论问题,而不是“帮助我进行端口转发工作”。我不会帮助后者,因为无论如何它都是 Stack Overflow 的题外话。
【解决方案2】:

@CodeCaster 的回答是正确的,我会尽量提供更多细节。

所以我们这里有两种情况:1) NAT 后面的网络浏览器 2) NAT 后面的网络服务器。它们之间的主要区别是第一个数据包的方向。

在 (1) 中,网络浏览器启动通信并通过路由器发送数据包。路由器中的 NAT 将此数据包注册为表中的条目,该表将源 IP/端口映射到目标 IP/端口。当路由器收到来自网络服务器的回复时,它会在 NAT 表中查找该条目以确定将数据包转发到哪里,然后您的网络浏览器会收到回复。

在 (2) 中,路由器中的 NAT 不知道您的网络服务器是否存在。外部网络浏览器使用您的公共 IP 向您的网络服务器发送请求,因此数据包到达路由器。现在路由器不知道如何处理数据包,因为 NAT 表和端口转发都没有注册端口 80。因此,换句话说,NAT 会自动处理传出连接,而对于传入连接,您需要配置端口转发。

【讨论】:

  • 非常感谢
猜你喜欢
  • 2012-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-06
  • 2014-04-09
  • 1970-01-01
  • 1970-01-01
  • 2021-08-16
相关资源
最近更新 更多