前言
相信大家一直都有一种疑问,为什么别人不可以直接通过IP访问我的路由器呢?如果早年折腾过类似于MC联机的朋友,可能也会有此疑问,而且按照网上的教程弄了什么路由器的端口映射,照样还是没效果,为此头疼不以,最后通过类似于端口转发和逆向代理等技术实现了联机,但是这种联机效果非常差,延迟很高,有没有什么方法打破这种艰难的局面呢?
IP
在解答这个问题之前,我们需要先明白一个概念:IP
试想下,如果你要给你的女朋友冰冰发一个快递,那么你需要知道他的什么才准确地送到她家呢?
你只需要知道她家的地址,而且这个地址必须是唯一存在在地球上的,你就可以把这个快递寄到她家门口了。
ok,让我们回到网络世界,如果你的电脑(A)想要发消息到冰冰的电脑(B),则需要经过什么呢?
我们将这一个过程简化一下,你的数据包想要发送到别的电脑,需要经过若干个宽带运营商的服务器进行转发,你可以把这些服务器想象成是邮局:当你知道了冰冰的地址之后,去邮局发快递,邮局会根据冰冰的地址自动制定运输路线,最终快递会到冰冰的手中。IP在此处就相当于冰冰的邮寄地址,当你的电脑知道了冰冰电脑的地址(IP)之后,就可以把消息发送给宽带运营商的服务器中,最后由这些服务器一层一层转发到冰冰的电脑中。
总结一下:IP地址就是每台设备在互联网世界的地址,不同设备之间通过这个地址进行通讯。
局域网

在解释 “为什么你的IP无法被公网所访问” 这个问题之前,我们需要先弄清楚 『局域网』这一概念。
局域网,顾名思义,就是这个网络的作用范围是局域的,举个简单而且最常见的例子:
我们家里用的路由器,其实就是一个小型的局域网服务器,当你的电脑或者手机通过WIFI或是网线连接到路由器的时候,路由器内有一个自带的 DHCP 服务,这个服务会给每一个连接到该路由器的设备都分配一个IP,这个IP只能在连接到这台路由器中的设备之间进行通信(譬如连接到同一个路由的两台手机)。这些设备就形成了一个小型的局域网。局域网之内的设备可以用他们的局域IP在相互之间进行通讯。
那么你就可能会好奇了,你的手机是如何连接到外部的互联网来上网冲浪的呢?
事实上,当你的路由器启动之后,他会向你的光猫(现在也有把路由器和光猫做到一个设备里的)发出拨号申请,然后在营运商那里获取到一个IP,这个IP是通向外部的网络世界的,路由器本身可以用这个IP进行上网。
这时问题来了,你要上网给冰冰发消息啊,但是你的电脑只有一个局域网IP,只能给连接到同一台路由器的设备发讯息,这时候你的电脑就不高兴了,他跑去跟路由器诉苦:我要是发不了消息给冰冰,待会我的主人砸了我咋办?路由器一听就慌了,这可不兴砸电脑,于是路由器说:“这样吧,你把你的快递和对方的地址给我,我来帮你发!”。你电脑一听可开心了,终于可以给你心心念念的冰冰发消息了。
但是消息发出去了N久,你还是没收到冰冰的回复,你寻思这咋回事呢,原来是冰冰寄给你的快递到不了你手里!为什么呢?你发送给冰冰用的地址是路由器的地址(从宽带运营商那里获取的),所以冰冰发给你的消息全都发给你的路由器了,被他吃了独食!
这可不行!于是你的电脑又跑去跟路由器协商,跟路由器说以后冰冰寄回来的快递都是我的,往我这边拿!
于是你就跟冰冰过上了幸福快乐的生活!
总结一下:
IP是每一台主机在互联网上的地址,但是由于IPV4(是IP协议的一种主流版本规范,大家都在用的就是这个)的地址数量有限,不能给所有的设备都分配一个地址,所以有了路由器这种东西,路由器去宽带营运商那里申请了一个地址,然后用这个地址来给所有连接到这台路由器的设备共享使用。
局域网就是处在同一个网段(比如一台路由器)内所有设备组成的网络总和,这些设备之间可以相互访问。

互联网、广域网、城域网
事实上,互联网、广域网,城域网,你可以理解为是套娃版的局域网,由N多个局域网组成城域网、广域网、随后由城域网和广域网组成我们如今的互联网世界。
实际上,互联网的组成可能是这样的:

实际上真真的情况比这可能复杂千百倍,但是,你只需要知道:
不同大小的局域网组成了我们现在的互联网世界!
端口
你的电脑上有N多个程序需要同时联网,这些程序通过你的IP地址发送了N多个数据包,这时候你的电脑就懵逼了,这些数据包到底是哪个程序发的,回信应该回给那个程序?
这时候,端口就有作用了!
你可以把你的电脑想象成是一个银行,如果说,银行里所有的业务员都扎堆站在一起,而且他们的职能各不相同,比如业务员A是负责办卡的,业务员B是负责存款的,业务员C是负责理财的,而且业务员A不能处理业务员B的任务。这些业务员就对应你电脑里而N多个程序,QQ的数据不能由微信来处理吧。这时候银行内就乱套了,某大爷进了银行懵逼了,人山人海不知道要去找哪个业务员办理业务。
现在银行进行了整改,现在这个银行开设了N多个窗口,这些窗口对应计算机内的端口,这些窗口有不同的职能,比如存款,取款,办卡,理财等等。这就对应了你电脑内的N多个程序,每个程序单独占有一个端口(也可以是多个),专门处理属于自己职能内的数据。这时候大爷进了银行舒服多了,可以到对应的窗口办理数据。
这也就是端口存在的原因和意义。在只有IP的情况下,虽然我们可以知道对方电脑的地址,能与其进行通讯。但是对面电脑上的程序有N个,你到底要与哪一个程序通讯呢?所以我们让他们的程序每个都有专门的端口,只要我们预先知道他们的端口号,就可以准确地发送数据到相应的程序中了。
理论上,一台计算机中最大的端口数量是65535个。
再配合我们之前讲到的路由器的知识,对面电脑发送给你的数据包会先发送到你路由器的某个端口,然后再由你的路由器转发到你计算机的某个端口中。
端口映射
我们已经理解了端口的概念,但是你有没有想过一个问题:
每台计算机的端口数量都是一致的,要是出现了端口冲突咋整呢?
比如:现在一个局域网内两台电脑,他们都运行了微信程序,微信需要用到端口1234来传输数据,现在,电脑A需要1234端口,电脑B也需要1234端口,路由器就犯难了,我只有一个1234端口,咋能对应两个呢?这时候路由器想了一个办法,用两个不同的端口号,分别对应两台主机的1234端口!
意思就是,电脑1需要的1234端口,在路由器上可能会变成2234端口,然后用这个2234端口收发数据;电脑2需要的1234端口,在路由器上可能会变成5678端口,用它来收发数据。
于是,我们本机的端口,就和路由器的端口不对应了!
回到之前的情景,我们在MC联机的时候,如果你的MC联机服务开放在4444端口上,但是对应到路由器,他就会变成另外一个随机的端口,现在你的朋友知道了你的IP,但是无法知道这个被映射到路由器的随机的端口是哪个,于是就没办法和你联机了。
但是,我们可以通过端口映射来人为改变这种情况!
现在的路由器基本都带有端口映射功能,也就是在你的干预之下,强制把你电脑的端口和路由器的端口进行绑定,而且这个地址是固定的,不会再被随机分配,就解决了如上的问题。这样你的朋友就能确切的知道你的IP和你的端口与你联机了!

以笔者的路由器为例,假设我的MC联机服务开放在端口23857,我们就在上面的内部端口填上 23857 ,这对应的是笔者电脑的端口地址,然后再外部端口填上25565,这就意味着:你电脑的 23857 端口会绑定映射到路由器的 25565 上。这样,我的朋友就可以通过这个25565端口来访问我计算机的 23857 端口跟我一起联机了!
DMZ主机
你要是觉得,如果我每次都要重新修改这个映射关系,很麻烦,那么你可以开启路由器的DMZ主机功能:

这个功能的主要作用,就是让你电脑的端口和路由器的端口一一对应。当外界访问你路由器的3366端口时,路由器会把这个请求转发到你电脑上的3366端口,这样就可以直接使用游戏内的端口进行联机了,省去每次都配置端口映射关系的麻烦。
但是这样做有个很大的安全隐患:如果路由器获取到的公网IP地址是真实有效且独立的,这就会意味着你的计算机完全暴露在互联网上,很容易被攻击!
NAT映射——没有公网IP的罪魁祸首!
上面我们讲到,目前IPV4的地址已经完全不够用(已经全部都被分配出去了),所以宽带运营商不可能给你们每个人都分配一个IP地址,所以就有了名为NAT映射的技术。这跟局域网类似,其实就是大号的局域网。运营商给你们小区或者是更大范围的人,只分配一个IP地址,然后你们这些人的路由器连接到运营商时,获取到的IP其实是一个局域网IP,由很多个人共享同一个IP地址上网。这样就可以解决IP地址不够用的问题。
但是!问题就来了!经过这一层路由,你就没有了独立的公网IP地址,我们前面讲到,路由器会把我们的端口随机进行映射,那么运营商的大路由也会做类似的事情。但是不同的是,你的路由,你是有控制权的。放到运营商的路由上,你没有对其的控制权限,意思就是,它把你的1234端口映射到哪去了,你完全不知道!也不能修改!所以,你的朋友和你就不能联机了。
除此之外,因为多了一层转发关系,所以网络的延迟势必会增大(可能感知不明显)
好处,当然也有!还记得前几年风靡一时的 深海之蓝 病毒吗?这个病毒就是通过扫描互联网上计算机的某个端口,从中找出漏洞,进而实现入侵!但是,经过层层的NAT服务转发,这个病毒根本就扫描不到你的电脑,从某种意义上,其实是保护了你的安全!(当然你使用路由器也有这种功能)


当你在路由器内查询到的ip和百度提供的你的ip地址不相同的时候(如上图),99%就是你被NAT了
IPV6
上面我们讲到,IPV4的地址已经告罄了,面对现在的物联网时代,让每一个设备都能拥有一个属于自己的独立IP,可以省去很多不必要的麻烦(比如数据转发中心)。于是乎,IPV6就诞生了。这是一种新的IP协议,号称地球上的每一粒沙子都可以拥有一个编号!
有了这一种IP,我们的每一台电脑就可以在互联网上拥有属于自己的地址了,这样我和我的朋友又可以愉快的联机而不需要通过类似于端口转发这一种能效超级低的服务了!
目前有一个问题就是,IPV6在中国的普及力度还是非常有限的,很大一部分地区的运营商还未支持IPV6协议,而且就算营运商支持了,大家在用的路由器也很老旧,不支持IPV6协议(包括目前TP-LINK等厂家在售的的很多路由器也不支持)。
怎么知道我自己是否有ipv6地址呢?
如果你的路由器很老旧,而且是诸如TP-LINK,水星,FAST等一众厂商的低端路由器,基本上就是不支持。如果是华为,小米等新兴路由厂商这两年发布的路由器,多半是支持的。
首先,按下 win+R键,输入powershell 然后回车
随后,输入 ipconfig 然后回车,你大概会看到类似于以下的结果:

如果你能看到你有多个或者一个IPV6地址(注意不是fe80开头的),那么说明你多半有IPV6地址的支持
为什么说是多半?因为你可能只是有地址,但是根本不能使用。以笔者的地址为例,笔者是汕头的移动宽带,笔者的这个IPV6实际上只是一个省内的广域网(业务员告诉我的),如果省外的IPV6网络想要访问我,或者我想要访问省外的IPV6地址,是不行的,更不要说出国!。意思就是这个IPV6地址只能在省内使用!
如何知道你的IPV6地址是不是真的能用的地址呢?
我们可以打开这个网址:IPv6 测试 (test-ipv6.com),然后网址会告诉你测试的结果,如果你打不开,或者是测试不通过,就说明你的IPV6可能是被阉割过的!

这是笔者的测试结果,说明在笔者写这篇文章的时候,广东的IPV6服务也许已经是可用的服务了!
拓展阅读:
一文搞懂网络知识,IP、子网掩码、网关、DNS、端口号 – 知乎 (zhihu.com)
[…] 生动形象讲懂网络知识:什么是IP、局域网?为什么我们获取到的IP不是公网… […]
[…] 生动形象讲懂网络知识:什么是IP、局域网?为什么我们获取到的IP不是公网… […]