首页 > 其他分享 >内网和外网之间的通信

内网和外网之间的通信

时间:2022-09-28 21:42:48浏览次数:64  
标签:IP 通信 公有 外网 运营商 局域网 内网 端口映射 路由器


对于初学者而已,我们学习的网络编程(如TCP,UDP编程),我们通常都是在局域网内进行通信测试,有时候我们或者会想,我们现在写的内网网络数据和外网的网络数据有什么不同,我们内网的数据是如何走出外网的呢?


再者,我们大多人都是使用宽带上网,结果发现,A 和 B 的局域网 IP 都是192.168.31.11,当他们都访问百度浏览网页时,百度服务器回复数据时,如何区分是给 A 还是给 B 呢?

内网和外网之间的通信_公网IP

公有 IP 和私有 IP 的区别

首先,我们需要了解一下什么是​​公有 IP 和私有 IP​​ ?


公有地址(Public address):由 Inter NIC(Internet Network Information Center 因特网信息中心)负责。这些 IP 地址分配给注册并向Inter NIC提出申请的组织机构,公有 IP 全球唯一,通过它直接访问因特网(直接能上网)


私有地址(Private address):属于非注册地址,专门为组织机构内部使用,说白了,私有 IP 不能直接上网


而我们平时通过运营商(电信、移动、联通宽带等)上网,家里面通过路由器分出来的 IP 都是私有 IP(局域网 IP),大家可能会疑问,我们可以上网啊,怎么会是私有 IP 呢?租用(申请)公有 IP 是需要钱的。 运营商买了一些公有 IP,然后通过这些公有 IP 分出来,再分给一个一个的用户使用。这个过程有点类似于,我们去安装了宽度,通过路由器分出几个 IP,让好几个人都能上网,当然运营商通过公有 IP 分出来的过程肯定比这个复杂多了。所以,我们平时上网用的 IP 是私有 IP,真正拥有公有 IP 的是运营商(当然,我们可以租用一个公有 IP )。所以,A 家庭的局域网 IP 和 B 家庭的局域网 IP 相同很正常,但是,最终 A 和 B 能上网(数据走出去)还是通过运营商的公有 IP,毕竟,公有 IP 的资源有限,这一片区域的用户使用的很有可能(实际上就是这样的)是同一个公有 IP,这样的话,又回到前面的问题,假如 A 和 B 的局域网 IP 相同(192.168.31.11),当他们同时访问百度服务器的时候,百度服务器如何区分哪个是 A,哪个是 B 呢?

内网和外网之间的通信_公网IP

端口映射

接下来,给大家介绍一下什么是​​端口映射​​?


​端口映射​​​是 ​​NAT​​ 的一种,它将外网主机的 IP 地址的一个端口映射到内网中一台机器,提供相应的服务。当用户访问该 IP 的这个端口时,服务器自动将请求映射到对应局域网内部的机器上。


现在市场上的家庭路由器都具备 ​​ NAT​​ 功能,也可以实现端口映射。下图为小米路由器的端口映射设置图:

内网和外网之间的通信_私有IP_03


我们平时经过路由器,通过宽带,最终去到运营商那边,数据是从运营商出去,最终数据是回到运营商那边,运营商再把数据发送到用户的电脑。


路由器,至少有两个端口:WAN 口和 LAN 口。

WAN:接外部 IP 地址用,通常指的是出口,转发来自内部 LAN 接口的 IP 数据包,这个口的 IP 是唯一的。
LAN:接内部 IP 地址用,LAN 内部是交换机。


这里,我们简化这个过程,我们把运营商当做一个 NAT 设备。

内网和外网之间的通信_私有IP_04


为了方便大家理解,我们把 IP 的转化方向反过来分析(准确来说,公网转局域网)。


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。

内网和外网之间的通信_linux_05


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

内网和外网之间的通信_私有IP_06

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


如何让外网能够访问自己写的网络程序(服务器)

首先,我们需要在运营商那边申请(租用)一个公有 IP (长城宽带一年需要 2000 元左右),假如这个公有 IP 为:128.0.0.123。


假如,我们写的服务器如下:

内网和外网之间的通信_端口映射_07


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

内网和外网之间的通信_私有IP_08


映射关系如下:

内网和外网之间的通信_私有IP_09


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


标签:IP,通信,公有,外网,运营商,局域网,内网,端口映射,路由器
From: https://blog.51cto.com/u_3002289/5720943

相关文章

  • Linux系统编程——进程间通信:消息队列
    概述消息队列提供了一种在两个不相关的进程之间传递数据的简单高效的方法,其特点如下:1)消息队列可以实现消息的随机查询。消息不一定要以先进先出的次序读取,编程时可以按消息......
  • Linux系统编程——进程间通信:管道(pipe)
    管道的概述管道也叫无名管道,它是是UNIX系统IPC(进程间通信)的最古老形式,所有的UNIX系统都支持这种通信机制。无名管道有如下特点:1、半双工,数据在同一时刻只能在一个方向......
  • 西门子300PLC与PC通信
    通过路由器把电脑和PLC进行连接起来,使用博途V16进行下载硬件配置。确保能够通信后,使用wireshark进行抓包分析。西门子PLC和电脑通信最主要是使用S7协议。但是在这之前会有......
  • Vue 组件间的通信方式
    前言在Vue组件库的开发过程中,组件之间的通信一直是一个重要的课题。虽然官方的Vuex状态管理方案可以很好的解决组件之间的通信问题,但是组件库内部对Vuex的使用往往比较繁重......
  • phpmyadmin中如何禁止外网使用
    在phpmyadmin文件夹中找到phpmyadmin.conf在文件中能看到如下面一段配置<Directory"c:/wamp/apps/phpmyadmin3.4.10.1/">OptionsIndexesFollowSymLinksMultiV......
  • 64、ubuntu20.04安装Postman测试http通信和测试其libcurl支持http客户端发送request
    基本思想:需要使用http协议完成业务需求,需要测试一下,所以学习一下想关的应用实践一、下载Postman​​Postman​​ubuntu@ubuntu:~$tar-zxvfpostman-linux-x64.tar.gzubu......
  • 32、树莓派的简单测试串口通信和超声波模块测距
    基本思想:随手记录一下众灵科技树莓派的测试串口通信和超声波模块,其镜像还是很nice,基本的库都给你安装了,比较大链接:https://pan.baidu.com/s/11tMdoRh3bHmcYzPyolm96g 提取......
  • nginx在服务器部署后,服务器本机可以正常访问和转发,外网无法访问
    环境:nginx版本:nginx-1.21.4服务器:windows-server2012R2现象:服务器本机nginx可以实现正常使用,外网无法访问。原因及解决方法:服务器防火墙未配置通过nginx程序,配置通过......
  • 水声通信的特点【读研好难呀】
    水声信道的特性主要有以下几个方面。(1)起伏效应。由于海面的随机运动、海底的随机不均匀、水体的不均匀,通道不仅在空间上分布不均匀,而且是随机的时变的,水声信号在这样......
  • 内网ip查询的两种方法
    https://product.pconline.com.cn/itbk/software/dnyw/1707/9656024.html1、通过命令行窗口获取内网IP地址1.打开命令行窗口在开始菜单中使用搜索功能搜索......