关于内网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就成功实现通信啦!
- 关于内网IP和外网IP的一些发现
- 关于内网IP和外网IP
- 关于---内网IP和外网IP
- 内网IP和外网IP
- 路由器局域网IP(内网IP)和外网IP的关系
- 内网的ip
- 内网ip和公网ip的转换
- 内网IP和公网IP的区别
- 内网IP和公网IP的区别
- 内网ip和公网ip的转换
- 内网IP和公网IP的区别
- 内网IP和公网IP的区别
- 内网IP和公网IP的区别
- 内网IP和公网IP的区别
- 公网IP和内网IP
- 公网ip和内网ip
- 关于session失效的问题(内网IP与外网IP)
- 如何区别内网ip和外网ip?
- 常见的排序方法(javascript)
- 关于API < 23的权限适配解决问题
- mysql中向数据库中插入多条数据的方法
- 如何取得Spring管理的bean
- Qt之在运行时加载共享库
- 关于内网IP和外网IP的一些发现
- C++之split字符串分割
- Gitlab CI 自动部署 asp.net core web api 到Docker容器
- 【项目】哈夫曼树的应用:文件压缩
- win10系统崩溃(unexpected_store_exception):Kernel-Processor-Power(ID:37)原因以及修复办法
- Python: sklearn库中数据预处理函数fit_transform()和transform()的区别
- 剑指Offer RotateArray 旋转数组的最小数字
- 并查集总结
- 组件套包Essential Studio for UWP 2017 v3发布,为图表添加新的选择器控件