我不明白基本的路由概念。即远程互联网服务器在将数据包发送到我的本地 IP 地址时如何构造数据包。
考虑现实生活中的例子。我通过我的提供商连接到互联网。提供商为我和其他客户提供私有范围的 IP 地址10.100.251.1-255
。假设提供商10.100.251.4
动态地为我提供 IP 地址。我不想在浏览器中打开stackoverflow.com(151.101.65.69)
网站。我和之间存在一堆网关stackoverflow.com
。将我与外部互联网连接起来的最后一个网关是85.112.122.13
。当我stackoverflow.com
在浏览器中打开时,我的计算机构建目标地址为的数据包151.101.65.69
,在路由表中查找该地址的网关,然后将数据包发送到网关。第一个网关执行相同操作并将我的数据包转发到第二个网关,依此类推,直到数据包到达最后一个网关85.112.122.13
。为简单起见,假设直接85.112.122.13
将数据包发送到stackoverflow.com
。现在stackoverflow.com
收到我的数据包并想向我发送响应。但我不明白它是怎么做到的。stackoverflow.com
从数据包中可以获取的只有源 IP 地址(10.100.251.4
)。但这个 IP 地址是私有的,互联网上没有路由器知道将数据包发送到哪里。我错在哪里,互联网服务器如何向私有 IP 地址发送响应?
答案1
其中一个网关(通常是第一个或第二个)配置为覆写所有传出数据包的源 IP 地址;它使用自己的公共地址“伪装”私有地址。(这称为源 NAT。
因此,它stackoverflow.com
只会向 NAT 网关的全局地址发送回复,而根本不知道您的私有 IP 地址。(如果您检查各种“我的 IP 是什么”网站,您将始终看到属于该网关的公共地址。)
同一路由器还会跟踪每个连接,因此每当它收到发往其全局地址的数据包时,它都可以查找最初发起连接的主机,并将目标地址转换回原始私有地址。(换句话说,它执行有状态 NAT - 信息保存在“状态表”或“连接跟踪表”中。)