即使该问题已被完全涵盖。我觉得最好对这一过程进行逐步描述。
对于此示例,我坐在通过路由器连接到Internet的专用LAN中。因为我们的网络共享一个公共IP地址,所以我们使用NAT。
因此,当我请求superuser.com
将生成许多IP数据包的页面时。让我们看一个。
IP数据包
来源:(192.168.1.12
我的IP)
目的地:64.34.119.12
(superuser.com)
现在,我的系统很可能与所讨论的系统类似。我有自己的IP地址(192.168.1.12
),子网掩码(255.255.255.0
)和默认网关(192.168.1.1
)。现在,由于我的IP数据包中的“ 目标”字段指向的网络不同于我自己的网络,因此将其发送到默认网关(而不是直接发送到计算机)。
但是,如果目的地完全指向其他地方,那么数据包如何到达默认网关呢?
乙太网路
这很容易,因为我们为此使用了以太网协议的寻址。我们只需在IP数据包中设置目标IP地址,并在以太网帧中将默认网关的MAC地址设置为目标。
现在,将确保我们的默认网关获取到的数据包superuser.com
。好极了!
现在,网关已收到我们的数据包,可以直接在其路径上发送它。但是要确保它会得到答案,首先需要替换数据包的源地址(否则superuser.com
将尝试将答案发送到其网络上具有我的 IP地址的某些(可能)不存在的设备。非常好。)
因此,我的路由器会将其公共 IP地址放在“ 源”字段中:
IP数据包
来源:(92.69.127.243
我的公共IP)
目的地:64.34.119.12
(superuser.com)
现在,同一游戏在世界上的所有路由器上不断进行,直到数据包最终到达superuser.com
并生成答案为止。
答案
回答IP数据包
来源:64.34.119.12
(superuser.com)
目的地:(92.69.127.243
我的公共IP)
好的,答案到了我的路由器,现在呢?我的路由器现在如何知道将答案发送到192.168.1.12
?
TCP协议
嗯,这确实有效,因为我们只研究了通信的IP和以太网部分。使这项工作起作用的是TCP部分。
您很可能知道Web服务器通常在port上运行80
。IP没有端口的概念。那来自TCP。在TCP中,我们有一个(如IP)源和目标 端口。
我发送到superuser.com的TCP数据包
源:(192.168.1.12
我的IP)
源端口:(11111
计算机组成的端口)
目标:64.34.119.12
(superuser.com)
目标端口:80
当您的路由器发送该初始数据包(发送到superuser.com
port 80
)时,他将在其中放置一个新的源端口(如12345
)。
这是重要的部分!他会记得那个替换!
我的路由器到superuser.com的TCP数据包
源:(92.69.127.243
我的公共IP)
源端口:(12345
我的路由器组成的端口)
目标:64.34.119.12
(superuser.com)
目标端口:80
因此,路由器收到的应答数据包实际上是这样的:
从superuser.com应答TCP数据包
来源:64.34.119.12
(superuser.com)
来源端口:80
目的地:(92.69.127.243
我的公共IP)
目的地端口:(12345
我的路由器组成的端口)
因此,现在他获取了该数据包,并看到该数据包是用于先前记住的端口,该端口已分配给IP地址192.168.1.12
(我的IP地址)的NAT操作。
回答来自路由器的TCP数据包
来源:64.34.119.12
(superuser.com)
来源端口:80
目的地:(192.168.1.12
我的IP)
目的地端口:(11111
我的计算机组成的端口)