我知道我们有位于不同层的 MAC 地址和 IP 地址。
MAC 地址用于节点(交换机)之间的通信,而 IP 地址用于网络(路由器)
Mac 地址在数据包发送过程中会改变,但 ip 地址不会改变
假设我的 IP 是 192.168.1.10(来自我的本地网络)我们向公共 IP 发送请求,假设它是 10.98.9.3
我们向服务器发送一个 IP 数据包(源 IP - 192.168.1.10,目标 IP - 10.98.9.3)
它进入交换机,然后进入路由器,再通过几个路由器链进入不同的网络,最后到达目标 IP 为 10.98.9.3 的设备。
然后服务器应该响应我,现在使用源 IP 作为目标 IP。但是 192.168.1.10 是我的本地网络 IP。服务器如何知道将数据包发回哪里?
答案1
您的私有 IP ( 192.168.1.10
) 服务器看不到,因为您位于 NAT(尤其是 PAT)后面,您的私有 IP 被转换为某个公共 IP,该 IP 由您的 ISP 分配给您。当返回数据包时,此远程服务器会将其发送到您的 NAT,然后此 NAT 会将其转换为您的私有 IP :) 就是这样。NAT 就是答案
答案2
首先,192.168.1.x 和 10.98.9.x 都是私有的、不可路由的(在公共互联网上)IP 地址。因此,您的示例只有在您控制路由器并创建了必要的路由,或在某些其他情况下才会起作用。
此外,如果您确实在 Internet 上运行此程序,则 IP 地址将使用称为 NAT 的机制进行转换。这会带来一些复杂性,我将忽略这些问题。
为了回答这个问题,我将简单地假设源 IP 地址和目标 IP 地址彼此连接且可路由。
现在回答这些问题,在这里分离层确实很有帮助。IP 数据包位于第 3 层,我将首先考虑这一点。
第 3 层
IP 数据包包含源地址和目标地址。您发送的数据包表示“我要去往 10.98.9.3,我来自 192.168.1.10”。
一旦连接远端的计算机收到此数据包并准备响应,它就会简单地反转这两个:“我要去 192.168.1.10,我来自 10.98.9.3”。
路由
现在下一个问题是您的计算机如何知道如何将数据包发送到 10.98.9.3。答案是:它不知道。但它知道其他人(称为默认网关)知道。
192.168.1.10 上的计算机将首先检查目标是否位于同一子网或不同子网。为此,它使用子网掩码。例如,如果子网掩码为 255.255.255.0,则您的计算机将检查源和目标是否具有相同的三个数字。
如果目的地位于同一子网(例如 192.168.1.27),则您的计算机可以直接将数据包发送到目的地。在您的示例中,目的地位于不同的子网。
要确定计算机是位于同一子网还是不同子网,需要使用子网掩码。
您的计算机包含一个称为路由表的表,它描述了如何访问其他网络。它看起来像这样(在 Linux 计算机上,Windows 类似)
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.1.1 0.0.0.0 UG 100 0 0 ens192
192.168.1.0 0.0.0.0 255.255.255.0 U 100 0 0 ens192
第一个条目表明去往任何地方(目的地 0.0.0.0 和 genmask 0.0.0.0)的数据包都必须发送到 192.168.1.1,它是知道如何将数据包发送至目的地的路由器。
第二条条目本质上是第一条规则的一个例外。它表示以 192.168.1 开头的任何内容(genmask 或子网掩码 255.255.255.0 描述此处考虑了多少位 IP 地址)都会直接(网关 0.0.0.0)到达目的地。它还表示应该使用名为 ens192 的接口(NIC)连接到 192.168.1.1。
因此对于 10.98.9.3,您的计算机将使用第一条规则,发现这些数据包应该转至 192.168.1.1。然后您的计算机第二次使用同一张表,发现 192.168.1.1 可以直接通过接口 ens192 发送。
同样的事情也发生在另一侧的响应中。
所有这些都发生在您自己的网络中;目的地对这一切都一无所知。
第 2 层-MAC 地址。
请注意,mac 地址实际上与这些都无关。它们的作用是处理我之前忽略的一个方面:在您自己的网络中,您的计算机实际上是如何将数据包直接发送到目标计算机,还是发送到默认网关,或者路由表所说的其他内容。
一旦你的计算机确定数据包应该发送到 192.168.1.1(默认网关)或 192.168.1.27(可直接访问的计算机)或其他任何地址,你的计算机就会使用 ARP 协议发送 MAC 地址请求:“谁是 192.168.1.27?”然后该计算机会回复“我是 192.168.1.27,我的 MAC 地址是 00:11:22:33:44:55”
然后,您的计算机将把您的数据包包装(封装)到以太网帧中,以该 MAC 地址作为目的地(以您自己的 MAC 地址作为源)。