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

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

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

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

这和 MAC 地址有关系吗?

这究竟是如何运作的?

答案1

大多数家用路由器使用一种称为 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

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

PrivateIP        PrivatePort   PublicIP      PublicPort    Remote          RemotePort
-------------    ----------    -----------   -----------   ----------      -----------
192.168.1.100    37641         *10.6.23.5    59273         72.14.204.147   80

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

通过 Google 搜索,连接如下所示:

10.6.23.5:59273   <-->  72.14.204.147:80

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

答案2

本地网络和互联网其余部分之间的路由器使用一种称为 NAT 的技术。

以下是《TCP/IP 图解第 1 卷》中有关 NAPT 的摘录,其中介绍了它的简单同类产品 Basic NAT 的缺点:

基本 NAT 仅执行 IP 地址重写。本质上,将私有地址重写为公共地址,通常来自 ISP 提供的公共地址池或范围。这种类型的 NAT 不是最流行的,因为它无助于大幅减少对 IP 地址的需求——全局可路由地址的数量必须等于或超过希望同时访问 Internet 的内部主机数量。NAPT 是一种更流行的方法,它涉及使用传输层标识符(即 TCP 和 UDP 的端口、ICMP 的查询标识符)来区分 NAT 私有端的哪个主机与特定数据包相关联(参见图 7-4)。这允许大量内部主机(即数千个)使用有限数量的公共地址(通常只有一个)同时访问 Internet。我们通常使用术语 NAT 来同时包括传统 NAT 和 NAPT,除非在特定情况下这种区别很重要。

相关内容