关于内网IP和外网IP的一些发现

来源:互联网 发布:败类 网络歌手 编辑:程序博客网 时间:2024/05/16 08:18

    昨天准备测试一个抓包工具,所以查询了一下自己的IP。关键的是,我用了两张查询IP的方式。一种通过命令行输入ipconfig,一种是直接网上百度搜IP,惊奇的发现这个两个IP竟然不是一样的。以前一直的观点是一个网络适配器应该对应一个IP呀,为什么会出现这种情况呢?而且这两个IP的“网络号”都不是一样的。这就可以排除了这俩货处于一个局域网的可能了。但是这样就更奇怪。我用的一个wifi登陆的两个啥玩意儿IP竟然不在一个局域网。简直颠覆了我对IP世界观的理解(可能还是太小白)。多番考究之后才发现,这俩一个是公网IP,一个是内网IP。我们处在的这个网应该叫做专用网。这个很好理解。对外我们都是一家人,对内我们各自分开住。这样可以兼顾协同性,同时又有区分度。他们之间的转换是用到一个叫做NAT的转换协议。更普及的版本现在叫做NAPT,甚至不只是IP的转换,还加上了端口信息的转换,这样就好像说得通了。

    But,事情远没有在这里结束!如果外网的服务器想要与我通信咋办呢,它顶破天只能知道我的公网IP呀(内网IP就压根出不了它的内网)。但是生活中直观,别人想主动对我发起会话显然是可以的呀。我为此特意去翻了《计算机网络》,但是看到上面的答复是——显然,通过NAT路由器的通信必须由专用网内的主机发起。这个和直观显然不匹配呀!是我的理解错误吗?简直再一次陷入怀疑人生的境地。怀着伟大的人类绝对不会允许这种bug存在的精神,网上搜索了一下,结果才恍然大悟,感慨人类智慧的光辉要照耀千秋万代。原来这之间涉及到了一个UDP打孔技术。

  这里简单摘要大神的一段话,作为大概技术讲解。

  “处于不同内网的主机A和主机B,各自先连接服务器,从而在各自NAT设备上打开了一个“孔”,服务器收到主机A和主机B的连接后,知道A与B的公网地址和NAT分配给它们的端口号,然后把这些NAT地址与端口号告诉A与B,由于在完全锥形NAT的特点,A和B给服务器所打开的“孔”,能给别的任何的主机使用。故A与B可连接对方的公网地址和端口直接进行通信。服务器在这里充当“介绍人”,告诉A与B对方的地址和端口号。”

  也就是说,A和B想直接通信不行,那我们就加个中间人呗,也就是服务器。每次A、B登陆的时候,就先告诉服务器,假定为C,我的通信NAT端口和公网IP(这个端口在内网中是我独有的)是多少。然后A想找B唠嗑了,A就先沟通上C,说我想跟B聊天啦,你把它的端口号和公网IP告诉我呗。C自然很听话地执行了这个请求,然后A就根据这个公网IP跟B的NAT联系上了,然后告诉NAT端口号,NAT就知道A想联系的是B咯。这样A和B就成功实现通信啦!

原创粉丝点击