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

1、引言

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

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

《P2P 技术详解(一):NAT详解——详细原理、P2P简介》

《P2P 技术详解(二):P2P中的NAT穿越(打洞)方案详解》

《通俗易懂:快速理解P2P技术中的NAT穿透原理》

《网络编程懒人入门(六):史上最通俗的集线器、交换机、路由器功能原理入门》

《网络编程懒人入门(九):通俗讲解,有了IP地址,为何还要用MAC地址?》

《脑残式网络编程入门(五):每天都在用的Ping命令,它到底是什么?》

学习交流:

- 即时通讯开发交流3群:185926912[推荐]

- 移动端IM开发入门文章:《新手入门一篇就够:从零开发移动端IM》

(本文同步发布于:http://www.52im.net/thread-2082-1-1.html)

2、系列文章

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

《脑残式网络编程入门(一):跟着动画来学TCP三次握手和四次挥手》(本文)

《脑残式网络编程入门(二):我们在读写Socket时,究竟在读写什么?》

《脑残式网络编程入门(三):HTTP协议必知必会的一些知识》

《脑残式网络编程入门(四):快速理解HTTP/2的服务器推送(Server Push)》

《脑残式网络编程入门(五):每天都在用的Ping命令,它到底是什么?》

《脑残式网络编程入门(六):什么是公网IP和内网IP?NAT转换又是什么鬼?》

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

答案:不是。

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

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

内网(学名应叫局域网(Local Area Network,LAN))是在一个局部的地理范围内,一般可以是是几米内(比如家庭内网),也可以是方圆几千米以内(比如一个大学内网),将各种计算机、外部设备和数据库等互相联接起来组成的计算机通信网。

内网主要作用有:

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

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

3)误码率低:因为通信距离很近,所以误码率很低,换句话说就是网络很稳定(老一点的程序员都知道,读大学的时候同一个宿舍内网联网玩C/S游戏,几乎不会遇到断网或卡顿的事情,除非有人下毛片或者把网络给拔了,哈哈)。

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

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

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

答否。我们不一定需要去申请3个IP的,在我们这个内网里,我们可以指定自己的规则,例如,我们可以给这三台电脑随便分配三个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和内网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高性能原理和框架架构解析》

>> 更多同类文章 ……

(本文同步发布于:http://www.52im.net/thread-2082-1-1.html)

脑残式网络编程入门(六):什么是公网IP和内网IP?NAT转换又是什么鬼?相关推荐

  1. 脑残式网络编程入门(八):你真的了解127.0.0.1和0.0.0.0的区别?

    本文由"小姐姐养的狗"原创发布于"小姐姐味道"公众号,原题<127.0.0.1和0.0.0.0地址的区别>,收录时有优化和改动.感谢原作者的分享. ...

  2. 脑残式网络编程入门(三):HTTP协议必知必会的一些知识

    为什么80%的码农都做不了架构师?>>>    本文原作者:"竹千代",原文由"玉刚说"写作平台提供写作赞助,原文版权归"玉刚说&q ...

  3. 脑残式网络编程入门(五):每天都在用的Ping命令,它到底是什么?

    本文引用了公众号纯洁的微笑作者奎哥的技术文章,感谢原作者的分享. 1.前言 老于网络编程熟手来说,在测试和部署网络通信应用(比如IM聊天.实时音视频等)时,如果发现网络连接超时,第一时间想到的就是使用 ...

  4. 脑残式网络编程入门(一):跟着动画来学TCP三次握手和四次挥手

    转自即时通讯网:http://www.52im.net/ 1.引言 网络编程中TCP协议的三次握手和四次挥手的问题,在面试中是最为常见的知识点之一.很多读者都知道"三次"和&quo ...

  5. 脑残式网络编程入门(二):我们在读写Socket时,究竟在读写什么?

    转载自 http://www.52im.net/thread-1732-1-1.html 1.引言 本文接上篇<脑残式网络编程入门(一):跟着动画来学TCP三次握手和四次挥手>,继续脑残式 ...

  6. 通俗讲网络通讯之IP地址(公网IP,内网IP)

      IP地址对于经常上网的人应该都不陌生,ip地址又可以分成内网ip地址和公网ip地址.   通常我们所说的内网也就是局域网,是内网的计算机以网络地址转换协议,通过一个公共的网关访问Internet. ...

  7. 浅谈公司网络的外网IP和内网IP

    小型公司,通常会有外网需求,需要联系当地电信运营商开通.运营商提供的线路和设备,到公司机房,一般是一个调制解调器,向外是光纤,对内连公司的路由器,这个路由器就是公司网络和外部网络连接的接口了.运营商分 ...

  8. web网络知识(一)公网IP、内网IP

    一.公网和内网的区别 1.什么是出口ip? 就是你上网时候暴露在公网的ip. 2.内网ip和实际的出口ip有什么不同? 通过系统查看的ip是在局域网内的ip,也就是内网ip,但是需要上网的话会通过NA ...

  9. 网络编程入门从未如此简单(一):假如你来设计网络,会怎么做?

    本文原题"如果让你来设计网络",有修订和改动,收录已征得作者同意,转载请联系作者.本文已同步发布于52im社区:http://www.52im.net/thread-3330-1- ...

  10. Linux网络编程 入门

    Linux网络编程入门 (转载) (一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍 客户端和服务端          网络程序和普通的程序有一个最大的区别是网络程序是由两个 ...

最新文章

  1. WPF模板(二)应用
  2. 008 Spark中standalone模式的HA(了解,知道怎么配置即可)
  3. pandas用均值填充nan_Pandas学习笔记(三)
  4. WinXP下替代IIS的新思路
  5. warning LNK4098: defaultlib MSVCRT conflicts with use of other libs; use /NODE
  6. 数据库的四个范式之间的区别
  7. Java队列Queue的使用
  8. 梯度下降的线性回归用python_学习笔记:使用python 实现线性回归里的梯度下降...
  9. 考虑SOC蓄电池 双向DC/DC 充放电控制 matlab仿真模型 buck boost
  10. jenkins 常用插件
  11. linux SFTP用户创建 不允许用户登录,并且连接只允许在制定的目录下进行操作
  12. Java 大厂面试必刷题 Day1:何为面向对象编程的思想?面向对象三大特征是什么?
  13. FCW前车碰撞预警的两个重要指标——THW、TTC
  14. CnOpenData中国上市公司全部公告数据
  15. Digital Photo Professional 4 如何导出jpg
  16. 壹佰大米时代公司研究报告
  17. 博文视点官方博客http://blog.csdn.net/bvbook
  18. 搭建react脚手架
  19. #DAYU200#Ability入门
  20. 设计几何体素描_初学者必看——结构素描单个几何体的详细画法

热门文章

  1. 信安小白,一篇博文讲明白暴力破解和SQL注入
  2. 服务器断开消息,Websockets - 断开服务器消息
  3. jaxen-1.1-beta-6.jar的用处
  4. R pdf大小_PDF如何压缩?这两招教您快速压缩PDF!
  5. 关于jpa的mappedBy用法
  6. List集合去重的几种方法
  7. 文件内存映射(一):它是什么
  8. 2021年亚马逊测评的最新经验技巧分享
  9. 【案例】中国城市规划设计研究院:新型城镇化监控与评估平台
  10. 三农数据(1996-2020)三:居民收入来源详情、消费支出详情、医疗卫生、文化、养老等整理好的面板数据,省级层面,excel或stata版本