网络编程入门(六):什么是公网IP和内网IPNAT转换又是什么鬼

核心提示本文引用了“帅地”发表于公众号苦逼的码农的技术分享。1、引言搞网络通信应用开发的程序员,可能会经常听到外网IP和内网IP,但他们的区别是什么?又有什么关系呢?另外,内行都知道,提到外网IP和内网IP就不得不提NAT路由转换这种东西,那这双是

本文引用了“帅地”发表于公众号苦逼的码农的技术分享。

1、引言

搞网络通信应用开发的程序员,可能会经常听到外网IP和内网IP,但他们的区别是什么?又有什么关系呢?另外,内行都知道,提到外网IP和内网IP就不得不提NAT路由转换这种东西,那这双是什么鬼?本文就来简单讲讲这些到底都是怎么回事。

另外,以下是与本文内相关知识点有关联的文章,可详细阅读之:

《P2P 技术详解:NAT详解——详细原理、P2P简介》《P2P 技术详解:P2P中的NAT穿越方案详解》《通俗易懂:快速理解P2P技术中的NAT穿透原理》《网络编程懒人入门:史上最通俗的集线器、交换机、路由器功能原理入门》《网络编程懒人入门:通俗讲解,有了IP地址,为何还要用MAC地址?》《脑残式网络编程入门:每天都在用的Ping命令,它到底是什么?》

2、系列文章

本文是系列文章中的第6篇,本系列大纲如下:

《脑残式网络编程入门:跟着动画来学TCP三次握手和四次挥手》《脑残式网络编程入门:我们在读写Socket时,究竟在读什么?》《脑残式网络编程入门:HTTP协议必知必会的一些知识》《脑残式网络编程入门:快速理解HTTP/2的服务器推送》《脑残式网络编程入门:每天都在用的Ping命令,它到底是什么?》《脑残式网络编程入门:什么是公网IP和内网IP?NAT转换又是什么鬼?》

3、每台电脑都必须要一个公网IP吗?

答案:不是。

我们都知道,IPv4中的IP地址的数量是有限的,每次把一部分地址分配出去,那么就意味着能够用来分配的IP地址就更少了,而且随着现在手机,电脑等的快速发展,如果每个手机或者电脑都要求一个IP地址,那么显然IP地址是不够用的。

为了解决这个问题,我们可以采取这样的策略:例如对于一个公司来说,每个公司都会有一个属于自己公司的内网。

内网)是在一个局部的地理范围内,一般可以是是几米内,也可以是方圆几千米以内,将各种计算机、外部设备和数据库等互相联接起来组成的计算机通信网。

内网主要作用有:

1)共享传输信道:简单地理解就是不需要每台电脑一个外网IP地址;

2)传输速率高:内网之间的电脑因为没有外网网络拓扑的复杂性,所以互相通信的网络可以很快,比如从一个台电脑向另一台电脑复制一个几G的文件可能只需要数十秒时间。

3)误码率低:因为通信距离很近,所以误码率很低,换句话说就是网络很稳定。

4、公司的内网是如何实现内网IP地址分配和管理的?

假如我们给这个公司A分配了一个IP=192.168.1.1。我们把这个IP作为这个公司内网的网关吧。

在公司A的内网里面有3台电脑,如果这三台电脑要上网的话,我们需要给他分配一个IP,那么就像上一节提到的:我们一定需要去申请3个IP地址来使用吗?

答否。我们不一定需要去申请3个IP的,在我们这个内网里,我们可以指定自己的规则,例如,我们可以给这三台电脑随便分配三个IP。分别分配电脑A = 192.168.1.2 电脑B = 192.168.1.3 电脑C = 192.168.1.4。

而这个规则可以由我们的内网网关来管理,就像下面这样:

5、NAT技术:实现内网电脑访问外网的能力

假如电脑A想要访问,的IP我们假设为:172.168.30.3:

我们都知道,电脑A的IP是我们虚构的,实际上可能并不存在这样一个IP,如果用电脑A的IP去访问,那肯定行不通。

我们也知道,由于和电脑A不在一个局域网内,所以A要访问,那么必须得经过网关。而网关的这个IP地址,是真实存在的,是可以访问的。

为了让 A 可以访问,那么我们可以采取这样的方法:让网关去帮助 A 访问,然后把结果传递给网关,而网关再把结果传递给 A,这样不就可以解决了?

不过电脑A、B、C都可能拜托网关去帮忙访问,而返回的结果 的目的IP都是网关的IP=192.168.1.1。那么网关该如何进行区分这结果是A的、B的还是C的呢?

我们去访问的时候,不是需要指定一个端口吗?只要我们把 A的IP + 端口 映射成 网关的IP+端口,不就可以唯一确定身份了?

例如A用端口60去访问,网关把 A的IP+端口60 映射成 网关的IP+端口80 不就可以了?

把结果返回给网关的80端口之后,网关再通过映射表,就可以把结果返回给 A的60端口 了。

如果B也是用60端口去访问的话,也是一样,可以把它映射到90端口。

这种方法地址的映射转换,我们也称之为网络地址转换,英文为 Network Address Translation,简称NAT。

而像A、B、C这样的IP地址我们也称之为内网IP,即内网IP;而像网关,这样的IP我们称之为外网IP。

所以,一个典型的内网访问公网的原理,就像下图这样就可以实现了:

现在知道外网IP和内网IP了吧?

6、本文小结

为了解决IP地址短缺,技术专家们发明了内网技术,而内网技术的理论支撑就是NAT技术,所以搞网络通信的程序员非常有必要对NAT技术有一个深入的理解。

如果你想详细了解NAT路由转换技术,不防从下面几篇文章开始:

《P2P 技术详解:NAT详解——详细原理、P2P简介》《P2P 技术详解:P2P中的NAT穿越方案详解》《通俗易懂:快速理解P2P技术中的NAT穿透原理》《网络编程懒人入门:史上最通俗的集线器、交换机、路由器功能原理入门》

几点需要注意的地方:

1)对于全球IP,显然每个IP都是唯一的,而对于私有IP,同一个局域网内,也得是唯一的,但在两个不同的局域网中,是可以有相同的私有IP的;

2)局域网内主机之间的通信,是不需要进行地址转换的,而如果需要访问外网,才需要进行地址转换。

实际上,我们也可以把这种地址转换称之为一种代理。网关就相当于一个代理,把局域网内的主机的一些信息都给隐藏了起来。就像本内里所描述的那样,并不知道是主机A访问它,他只知道是网关访问了它。

附录:更多网络编程方面的文章

[1] 网络编程基础资料:《TCP/IP详解 - 第11章·UDP:用户数据报协议》《TCP/IP详解 - 第17章·TCP:传输控制协议》《TCP/IP详解 - 第18章·TCP连接的建立与终止》《TCP/IP详解 - 第21章·TCP的超时与重传》《技术往事:改变世界的TCP/IP协议》《通俗易懂-深入理解TCP协议:理论基础》《通俗易懂-深入理解TCP协议:RTT、滑动窗口、拥塞处理》《理论经典:TCP协议的3次握手与4次挥手过程详解》《理论联系实际:Wireshark抓包分析TCP 3次握手、4次挥手过程》《计算机网络通讯协议关系图》《UDP中一个包的大小最大能多大?》《P2P技术详解:NAT详解——详细原理、P2P简介》《P2P技术详解:P2P中的NAT穿越方案详解》《P2P技术详解:P2P技术之STUN、TURN、ICE详解》《通俗易懂:快速理解P2P技术中的NAT穿透原理》《高性能网络编程:单台服务器并发TCP连接数到底可以有多少》《高性能网络编程:上一个10年,著名的C10K并发连接问题》《高性能网络编程:下一个10年,是时候考虑C10M并发问题了》《高性能网络编程:从C10K到C10M高性能网络应用的理论探索》《高性能网络编程:一文读懂高性能网络编程中的I/O模型》《高性能网络编程:一文读懂高性能网络编程中的线程模型》《不为人知的网络编程:浅析TCP协议中的疑难杂症》《不为人知的网络编程:浅析TCP协议中的疑难杂症》《不为人知的网络编程:关闭TCP连接时为什么会TIME_WAIT、CLOSE_WAIT》《不为人知的网络编程:深入研究分析TCP的异常关闭》《不为人知的网络编程:UDP的连接性和负载均衡》《不为人知的网络编程:深入地理解UDP协议并用好它》《不为人知的网络编程:如何让不可靠的UDP变的可靠?》《网络编程懒人入门:快速理解网络通信协议》《网络编程懒人入门:快速理解网络通信协议》《网络编程懒人入门:快速理解TCP协议一篇就够》《网络编程懒人入门:快速理解TCP和UDP的差异》《网络编程懒人入门:快速理解为什么说UDP有时比TCP更有优势》《网络编程懒人入门:史上最通俗的集线器、交换机、路由器功能原理入门》《网络编程懒人入门:深入浅出,全面理解HTTP协议》《网络编程懒人入门:手把手教你写基于TCP的Socket长连接》《网络编程懒人入门:通俗讲解,有了IP地址,为何还要用MAC地址?》《技术扫盲:新一代基于UDP的低延时网络传输层协议——QUIC详解》《让互联网更快:新一代QUIC协议在腾讯的技术实践分享》《现代移动端网络短连接的优化手段总结:请求速度、弱网适应、安全保障》《聊聊iOS中网络编程长连接的那些事》《移动端IM开发者必读:通俗易懂,理解移动网络的“弱”和“慢”》《移动端IM开发者必读:史上最全移动弱网络优化方法总结》《IPv6技术详解:基本概念、应用现状、技术实践》《IPv6技术详解:基本概念、应用现状、技术实践》《从HTTP/0.9到HTTP/2:一文读懂HTTP协议的历史演变和设计思路》《以网游服务端的网络接入层设计为例,理解实时通信的技术挑战》《迈向高阶:优秀Android程序员必知必会的网络基础》>> 更多同类文章 ……[2] NIO异步网络编程资料:《Java新一代网络编程模型AIO原理及Linux系统AIO介绍》《有关“为何选择Netty”的11个疑问及解答》《开源NIO框架八卦——到底是先有MINA还是先有Netty 》《选Netty还是Mina:深入研究与对比》《选Netty还是Mina:深入研究与对比》《NIO框架入门:服务端基于Netty4的UDP双向通信Demo演示》《NIO框架入门:服务端基于MINA2的UDP双向通信Demo演示》《NIO框架入门:iOS与MINA2、Netty4的跨平台UDP双向通信实战》《NIO框架入门:Android与MINA2、Netty4的跨平台UDP双向通信实战》《Netty 4.x学习:ByteBuf详解》《Netty 4.x学习:Channel和Pipeline详解》《Netty 4.x学习:线程模型详解》《Apache Mina框架高级篇:IoFilter详解》《Apache Mina框架高级篇:IoHandler详解》《MINA2 线程原理总结》《Apache MINA2.0 开发指南[附件下载]》《MINA、Netty的源代码已整理发布》《解决MINA数据传输中TCP的粘包、缺包问题》《解决Mina中多个同类型Filter实例共存的问题》《实践总结:Netty3.x升级Netty4.x遇到的那些坑》《实践总结:Netty3.x VS Netty4.x的线程模型》《详解Netty的安全性:原理介绍、代码演示》《详解Netty的安全性:原理介绍、代码演示》《详解Netty的优雅退出机制和原理》《NIO框架详解:Netty的高性能之道》《Twitter:如何使用Netty 4来减少JVM的GC开销》《绝对干货:基于Netty实现海量接入的推送服务技术要点》《Netty干货分享:京东京麦的生产级TCP网关技术实践总结》《新手入门:目前为止最透彻的的Netty高性能原理和框架架构解析》>> 更多同类文章 ……

 
友情链接
鄂ICP备19019357号-22