路由器如何知道将数据包转发到哪里

Kor*_*tak 85 router tcp forwarding local packet

如果多台具有本地地址(192.168.0.#)的计算机连接到一个路由器,每台计算机打开一个网络浏览器并通过HTTP请求一个页面,当这些TCP:80数据包发出时,路由器将本地地址与路由器的静态 IP(即提供商给定的 IP),以便服务器可以回复适当的地址。

但是路由器如何知道将 HTTP 回复转发到哪台计算机,因为 TCP 标头不包含本地 IP 地址(是吗?),并且所有计算机都使用端口 80?

这与MAC地址有什么关系吗?

这是如何工作的?

Pau*_*aul 98

大多数家用路由器使用称为 PAT 的 NAT 特例。

您还将看到它被称为 NAPT,或 IP 伪装。后三个术语在一般使用中的含义相同。(首字母缩写词——网络地址转换/端口地址转换/网络地址端口转换)

当数据包从您的内部机器发出时,源地址会如您所知被重写。源端口也被改变,通常是一个较大的数字,并且路由器保留一个地址转换表。

例如,假设您有一台访问 www.google.com 的客户端计算机。您的计算机(例如 192.168.1.100)查找该地址并使用随机源端口从您的内部 IP 地址在端口 80 上建立到 72.14.204.147 的 TCP 连接。

对于您的计算机,连接如下所示:

192.168.1.100:37641   <-->  72.14.204.147:80
Run Code Online (Sandbox Code Playgroud)

您的计算机将数据包发送到路由器,路由器会选择一个新的随机高端口并重写数据包。每个出站连接在路由器上都有自己的端口。然后,路由器将数据包添加到其连接表后,将数据包转发到您的 ISP:

PrivateIP        PrivatePort   PublicIP      PublicPort    Remote          RemotePort
-------------    ----------    -----------   -----------   ----------      -----------
192.168.1.100    37641         *10.6.23.5    59273         72.14.204.147   80
Run Code Online (Sandbox Code Playgroud)

*出于示例目的,我使用了以 10 开头的地址,但这些地址不可公开路由。该表也有些过于简化。

对于谷歌,连接如下所示:

10.6.23.5:59273   <-->  72.14.204.147:80
Run Code Online (Sandbox Code Playgroud)

Google 会将其响应发送到端口 59273 上的 10.6.23.5。然后您的路由器在表中查找该信息并将数据包转发到 192.168.1.100:37641。

  • @Jason 这是一个危险的神话。拥有*防火墙*增加了安全性。典型的 SoHo 路由器的工作只是让事情正常工作,而不是阻止事情工作。有关更多信息,请参见 [此处](http://security.stackexchange.com/a/8773/4295)。 (6认同)
  • 总而言之,路由器使用端口号来记住从本地网络外部到网络内部的内容。但是,这并不能解释如果我没有向它发送初始请求,它会如何找到我。换句话说,如果我最初通过路由器发送请求,消息只能通过路由器到达我 (4认同)
  • 如果您的计算机未发起请求,@Imray google.com(或 Internet 上的任何其他内容)将无法找到您的计算机。这就是为什么拥有路由器可以增加很多安全性的原因。 (2认同)
  • @Jason 最好不要删除你的评论,这使得本来值得阅读的讨论变得不可能阅读。 (2认同)
  • 很好的例子,但这是否意味着我们的路由器上的所有大端口都始终打开? (2认同)