内网访问外网以及外网访问内网的原理

假如设A 和 B 的局域网 IP 相同(192.168.31.11),当他们同时访问百度服务器的时候,百度服务器如何区分哪个是 A,哪个是 B 呢?

解决方案:端口映射

什么是端口映射?

端口映射是 NAT 的一种,它将外网主机的 IP 地址的一个端口映射到内网中一台机器,提供相应的服务。当用户访问该 IP 的这个端口时,服务器自动将请求映射到对应局域网内部的机器上。 
现在市场上的家庭路由器都具备 NAT 功能,也可以实现端口映射。下图为小米路由器的端口映射设置图:

这里写图片描述

我们平时经过路由器,通过宽带,最终去到运营商那边,数据是从运营商出去,最终数据是回到运营商那边,运营商再把数据发送到用户的电脑。 
路由器,至少有两个端口:WAN 口和 LAN 口。 
WAN:接外部 IP 地址用,通常指的是出口,转发来自内部 LAN 接口的 IP 数据包,这个口的 IP 是唯一的。LAN:接内部 IP 地址用,LAN 内部是交换机。 
这里,我们简化这个过程,我们把运营商当做一个 NAT 设备。

这里写图片描述

A 电脑的 IP 是局域网 IP(192.168.31.11),这个 IP(192.168.31.11)是从路由器的 lan口分配的。 
当我们上百度的时候,经过路由器的 wan口,进行相应的IP、端口转化:192.168.31.11:80 -> 10.221.0.24:8080,所以,从 wan口出去的地址为:10.221.0.24:8080。

这里写图片描述

最后,经过运营商,运营商那边会做相应的端口映射(而且是动态端口映射),子网 IP(10.221.0.24:8080)转化为公网IP(128.0.0.1:8888),通过这个公网 IP 去访问百度服务器

这里写图片描述

同理,B 的过程也是一样。通过这样的层层端口映射,最终保证地址(IP + 端口)的唯一性。A 和 B 访问百度服务器,尽管它们的局域网 IP 是一样的,但是最终它们访问百度的地址(IP + 端口)是唯一的,所以,百度服务器回复时,原路返回时能够区分到底给谁回。

如何让外网能够访问自己写的网络程序(服务器) 
首先,我们需要在运营商那边申请(租用)一个公有 IP (长城宽带一年需要 2000 元左右),假如这个公有 IP 为:128.0.0.123。 
假如,我们写的服务器如下:

这里写图片描述

接着,找个 NAT 设备进行相应的端口映射,家庭路由器都有这个功能。这里以小米路由器为例:

这里写图片描述

映射关系如下:

这里写图片描述

最后,其他人写客户端程序时(电脑能上外网),只要指定目的 IP 地址为 128.0.0.123,端口为 8888,通过这个地址,就能找到192.168.31.248:8080,因为这两者已经建立好映射,如上图,这样,我们的服务器就能收到数据。

你可能感兴趣的:(通信协议)