前几天又面了一家目标外企,虽然算法方面表现还可以的,但是在回答网络基础相关的问题时发现自己对于一些概念还是比较模糊,看来是当初学的时候没有掌握透彻。

问题:现在在一个内网中,主机 A 尝试给主机 B 发送一个数据包,那么在这个过程中 src_ip, dst_ip, src_port, dst_port, src_mac, dst_mac,哪些会变,哪些不会变,结合整个过程具体讲讲。

网络结构:A — gateway1 — gateway3 — gateway2 — B
PS:其实这道题当初最困扰我的就是“网关”,我一下子想不起来“网关”是什么,最终开始胡言乱语🤐

网络中的设备

其实网络中的设备大体上就分为三类:集线器、交换机、路由器,主要说说后两者。

Switch

MAC -> 接口,找到下一跳

如果按照 TCP/IP 的 4 层模型来看(后文同样如此),交换机工作在 Layer1 数据链路层,工作内容就是根据数据包的目的 MAC 地址,将其从对应的接口转发出去。所以交换机内部维护一个 MAC 映射表,可以看作是节点之间的桥梁。
image.png
例如上图,在自学习一段时间后,交换机最终的 MAC 映射表就变成如下。那么如果来了一个数据包,目的 MAC 地址为 bbbb.bbbb.bbbb 那么交换机查表,然后在 1 号接口将数据包转发出去。

MAC (48 bit) interface
bbbb.bbbb.bbbb 1
aaaa.aaaa.aaaa 2
eeee.eeee.eeee 3

Router

IP -> 接口,找到下一个网络

路由器工作在 Layer2 网络层,工作内容是根据数据包的目的 IP 地址,将其从对应的接口转发出去。所以路由器内部维护的是一个 IP 映射表,可以看作是网络之间的桥梁。
image.png
例如在上图,路由器的 IP 转发表如下。那么若路由器收到一个数据包,目的 IP 为 11.11.11.201,那么就会根据转发表表项,先用掩码算出 IP 的网络号,再进行匹配,所以就从 eth2 将包转发到上图右侧的网络中,之后内部的逐步转发就由交换机来完成。

IP 网络(32bit) interface
11.11.11.0/24 eth1
22.22.22.0/24 eth2

Gateway

了解完两个基本的设备之后,再来看网关。在 TCP/IP 协议中,网关就是路由器
image.png

若抛开这个背景限制,网关跟路由器也非常类似,也是作为网络之间的媒介,但网关是两个不同网络之间的媒介,工作内容是让数据包能够在两种不同(协议)的网络中传递,且网关大多数工作在 Layer4 应用层

Solution

回到刚刚的问题,在该题的情景中,网关就等价于路由器,且由于都是在内网环境中,所以不会有 NAT 转换。故在这个过程中,网络层及以上的 src_ip, dst_ip, src_port, dst_port 都不会改变,src_mac 也不会改变,改变的只是在逐跳转发过程中的 dst_mac。
image.png

Pass through the Internet

若将题目进一步升级,不局限于内网,而是经过互联网,那么变化的有哪些字段呢?
image.png
内网使用的 IP 地址都是私有 IP,这使得相同的 IP 地址能够在不同的内网中复用,提高 IP 地址的利用率。私有 IP 只能在当前内网中被使用,一旦数据包的传输范围超出内网,要进入互联网,就需要使用公网 IP,需要使用 NAT 进行转换。

从内网发出数据包时,NAT 转换的是源 IP 地址,相当于给数据包在英特网中一个初始定位。NAT 由路由器来完成,这个路由器所在的整个内网就共享这一个公网 IP 地址(也可以是多个,以一个为例),并通过 16bit 的端口来区分具体映射的是内网的哪台机器,所以更准确地说,NAT 同时转换 IP 地址与端口号。故只有在 NAT 转换的过程中,才会改变数据包的 IP 地址与端口号。

同理,数据包从公网进入到内网也是类似的,将目的地址(公网 IP,端口)映射成(内网 IP,端口)。进一步可以得出结论,跨互联网通信时,最初写在数据包上的目的 IP 地址,实际上是目的网络的网关 IP 地址。

image.png

那么此时,题目中除了源 MAC 以外的所有字段都会变化:
image.png

Summary

Packet Traveling - 图8