NAT(Network Address Translation)
今天面试被问到这个问题,隐约记起来最先在设置虚拟机网络模式的时候见到过这个,三个选项分别是桥接,NAT和HostOnly。光有印象,真的要答的时候却无从入手,因此事后还是记录一下。
简介
IPv4
由32bits的字来表示网络地址,把保留字段都算上的话也不过$2^{32}$大约4.29亿个。然而现在世界上有70多亿个人且每个人可能都有若干个设备,因此地址数不够用。
NAT实现了局域网和外网的通信。局域网中某台电脑向外网发包都会经过路由器,那路由器拿到物理层包之后开始解包,物理层剥掉之后变数据链路层,数据链路层剥掉之后变成网络层,网络层里面的Source
和DST
都写的很清楚。那么考虑如下场景,假设某个包A从主机被扔到了路由器,路由器解开之后得到了网络层,一看源地址192.168.0.2:7456
,然后果断把这个地址和自己的IP+某个端口12.13.14.15:23333
建立一个映射,存到表里。然后用这个用12.13.14.15:23333
替换192.168.0.2:7456
,接着把它封起来,扔到外网。外网就觉得这个包是从这个路由器发出来的,然后返回的包就直接发到12.13.14.15:23333
。
那我们的路由器老哥拿到这个返回包之后,找到网络层12.13.14.15:23333
,一查表,把对应的192.168.0.2:7456
放上去,再若无其事扔回局域网内。我们的主机正常收到了这个包。
过程图示
Source:192.168.0.2:7456 Dst:20.20.20.20:80
|
|(ROUTER)
v
Source:12.13.14.15:23333 Dst:20.20.20.20:80
|
|(Server Reply)
v
Source:20.20.20.20:80 Dst:12.13.14.15:23333
|
|(ROUTER)
v
Source:20.20.20.20:80 Dst:192.168.0.2:7456
自己的一些拍脑袋的理解
发包的主机真的不知道自己的包被改了,路由器做了这个改的工作。当然也可以不是路由器,还可以是另一个主机。比如我们在我们自己电脑上跑若干个虚拟机,那样这里面就有一个虚拟的局域网,我们的物理机是这个网关,虚拟机发的包都通过NAT转换成物理机的IP和端口和外界以物理机的名义进行通信,数据发回来的时候物理机再根据映射表发回给虚拟机。
这玩意算是局域网知识里面的一个挺重要的点的,计网都讲了,回答不出来的话可真的很丢人了。溜溜。
本文由 Rust401 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: Apr 7, 2019 at 12:13 am
Kamagra Impacto Pharmacy Rx World buy viagra Discount Online Clobetasol Clobetasol Propionate Need Website