多网卡下对ServerSocket以TCP协议绑定IP和端口的测试
一、引言:之前开发TCP协议的程序(C#里是Socket为主)都是基于主机上只有一个IP的,后来项目里涉及到了主机需要同时连接内外和外网的情况,在该主机上部署着一套WCS系统和一套WMS系统;WCS系统主要是跟内外的设备打交道(通过西门子OPC服务)),故主机上有个网卡和设备的PLC是在一个内网里的,而WMS则是可以由外网的办公人员使用,故主机上的另一个网卡和外网处于同一网段;这样外网的WMS管理员通过WMS客户端提交仓库作业给服务端,WMS服务端则将任务下发给WCS,然后由WCS通过OPC将任务逐步下发给具体设备。
前几天讨论业务时涉及到一个问题就是OPC服务只能绑定一个网卡,从而导致如果要对其它PLC进行组态必须将PLC加进内网,但是当时的实际情况不允许这么做;在讨论过程中个人产生了一些疑惑,在印象里IP只是用来确定一台主机,而确定主机上应用的只是协议和端口而已,但是OPC服务的组态问题又于自己以往的理解相悖,带着这些疑惑在今天空闲之际终于做完了这些测试。
二、待测问题:
注:主机的两个网卡的IP分别是192.168.1.251和188.168.1.251,客户端电脑Telnet主机时都会先将网络切换到要Telnet的IP所在的网络。
①能否以同一IP和同一端口号和同一协议(TCP)绑定2次/多次;
②能否以同一IP和同一端口号和不同协议(TCP-UDP)绑定2次/多次;
③能否以不同IP和同一端口号和同一协议(TCP)绑定2次/多次;
④ServerSocket对象绑定192.168.1.251,端口为30000后能否被Telnet通(Telnet的地址分别为192.168.1.251:30000和188.168.1.251:30000);
⑤ServerSocket对象绑定127.0.0.1,端口为30000后能否被Telnet通(Telnet的地址为192.168.1.251:30000);
⑥ServerSocket对象绑定0.0.0.0,端口为30000后能否被Telnet通(Telnet的地址分别为192.168.1.251:30000和188.168.1.251:30000);
⑦以同一种协议和端口用两个ServerSocket对象分别绑定192.168.1.251和188.168.1.251后Telnet是否能通(Telnet的地址分别为192.168.1.251:30000和188.168.1.251:30000);
⑧四个ServerSocket对象以同一协议和端口分别绑定IP为127.0.0.1 、 0.0.0.0 、 192.168.1.251和188.168.1.251是否报错。
三、测试方式和结果:
①代码:
ServerSocket socket = new ServerSocket(30000, 3, InetAddress.getByName("192.168.1.251"));
ServerSocket socket2 = new ServerSocket(30000, 3, InetAddress.getByName("192.168.1.251"));
结果:报错,两个Socket不能一起以同一协议、IP、端口进行bind。
②代码:
ServerSocket socket = new ServerSocket(30000, 3, InetAddress.getByName("192.168.1.251"));
DatagramSocket udp = new DatagramSocket(30000, InetAddress.getByName("192.168.1.251"));
结果:不报错,对应测试也能测通。
③代码:
ServerSocket socket = new ServerSocket(30000, 3, InetAddress.getByName("188.168.1.251"));
ServerSocket socket2 = new ServerSocket(30000, 3, InetAddress.getByName("192.168.1.251"));
结果:不报错,说明TCP应用的唯一性不是只取决于端口还包括IP,尽管这些IP都属于一台电脑。
④代码:
ServerSocket socket2 = new ServerSocket(30000, 3, InetAddress.getByName("192.168.1.251"));
结果:客户端连上192.168.1.*网络后Telnet 192.168.1.251:30000能通,此时Telnet 188.168.1.251:30000不通(注意这里客户端只连上192.168.1.*网络的情况下也ping不通188.168.1.251,对于路由器而言from和to不在一个网段又没有DNS故此ping无效);客户端连上188.168.1.*网络后能ping通但Telnet 188.168.1.251:30000不通;
⑤代码:
ServerSocket socket2 = new ServerSocket(30000, 3, InetAddress.getByName("127.0.0.1"));
结果:两个网均ping通但都Telnet不通,故绑定127.0.0.1的TCP应用只能被本机访问。
⑥代码:
ServerSocket socket2 = new ServerSocket(30000, 3, InetAddress.getByName("0.0.0.0"));
结果:两个网络均能Telnet通(0.0.0.0就是编程语言里的ADDRESS_ANY),这个0.0.0.0的IP类似url-pattern的/匹配路径。
⑦代码:
ServerSocket socket = new ServerSocket(30000, 3, InetAddress.getByName("192.168.1.251"));
ServerSocket socket2 = new ServerSocket(30000, 3, InetAddress.getByName("188.168.1.251"));
结果:Telnet 192.168.1.251:30000和188.168.1.251:30000能分别通,结合③④可知Telnet 192.168.1.251:30000通是通了socket,而Telnet 188.168.1.251:30000通是通了socket2;
⑧代码:
ServerSocket socket = new ServerSocket(30000, 3, InetAddress.getByName("188.168.1.251"));
ServerSocket socket2 = new ServerSocket(30000, 3, InetAddress.getByName("192.168.1.251"));
ServerSocket socket3 = new ServerSocket(30000, 3, InetAddress.getByName("127.0.0.1"));
ServerSocket socket0 = new ServerSocket(30000, 3, InetAddress.getByName("0.0.0.0"));
结果:不报错,0.0.0.0更应该理解为类似<url-pattern>/</url-pattern>的“路径匹配”
四、其它:网络上查找主机是通过IP查找的,网关只能处理同网段的IP,其它网段或域名要由DNS解析,若是未配置DNS则将不能请求DNS处理非此网段的IP或域名;
找到主机后,主机会查看请求的IP是否是自己的且符合要求的(比如其它电脑请求自己不能是用127.0.0.1和自己没有的IP);
符合则检查协议和IP和端口“发给”具体的协议的上层应用。
多网卡下对ServerSocket以TCP协议绑定IP和端口的测试的更多相关文章
- http协议,tcp协议,ip协议,dns服务之前的关系和区别
长期以来都有一个问题,大家都在说http协议,tcp协议,ip协议,他们之间到底什么区别,有什么用,没人告诉我,最近看了这本<图解http>明白了一些,以下图片摘自这本书 一.理解一个传输 ...
- JavaWeb 获取请求网络协议、IP、端口号、项目根路径
JavaWeb 获取请求网络协议.IP.端口号.项目根路径 CreateTime--2018年6月1日16点32分 Author:Marydon 1.需求 在项目中,需要使用Java向本程序发送r ...
- js 获取请求网络协议、IP、端口号、项目名称
js 获取请求网络协议.IP.端口号.项目名称 CreationTime--2018年6月19日15点54分 Author:Marydon /** * 获取url请求前缀 * @return ht ...
- 两张图说明http协议,tcp协议,ip协议,dns服务之间的关系和区别
一.理解一个传输流再去扩展 用http举例来说,首先作为发送端的客户端在应用层(http协议)发出一个想看某个web页面的http请求. 接着,为了传输方便,在传输层(tcp协议)把从应用层处收到的数 ...
- JavaSE——TCP协议网络编程(一)
实现客户端与服务端的连接: 创建TCP服务端的 ServerSocket ServerSocket :此类实现服务器套接字.服务器套接字请求通过网络传入,基于该请求执行某些操作,然后可能向请求者返回结 ...
- 学习笔记——网络编程3(基于TCP协议的网络编程)
TCP协议基础 IP协议是Internet上使用的一个关键协议,它的全称是Internet Protocol,即Internet协议,通常简称IP协议. 使用ServerSocket创建TCP服务 ...
- 基于网络编程 TCP协议 及 socket 基本语法
socket是什么 Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面, ...
- iOS-----使用CFNetwork实现TCP协议的通信
使用CFNetwork实现TCP协议的通信 TCP/IP通信协议是一种可靠的网络协议,它在通信的两端各建立一个通信接口,从而在通信的两端之间形成网络虚拟链路.一旦建立了虚拟的网络链路,两端的程序就可以 ...
- 第3章 TCP协议详解
第3章 TCP协议详解 3.1 TCP服务的特点 传输协议主要有两个:TCP协议和UDP协议,TCP协议相对于UDP协议的特点是 面向连接使用TCP协议通信的双方必须先建立连接,完成数据交换后,通信双 ...
随机推荐
- apiCloud上传头像
apiCloud上传头像 1.拍照 2.从相机中选择 aui布局 <li class="aui-list-item"> <div class="aui- ...
- dubbo dubbo.xsd 报错
构建dubbo项目的时候会遇到: Multiple annotations found at this line: - cvc-complex-type.2.4.c: The matching wil ...
- Windows XP with SP3大客户免激活日文版
原贴地址:http://www.humin.com.cn/ja_windows_xp_professional_with_service_pack_3_x86_dvd_vl_x14-74058-iso ...
- html标签对应的英文原文(转载)
标签 对应英文 说明 <!--> / 注释 <!DOCTYPE> document type 文档类型 <a> anchor 超链接 <abbr> a ...
- Usage of “symmetrical” and “symmetric”
What is the appropriate usage of "symmetrical" and "symmetric" (using the geomet ...
- SVN 客户端的安装与配置
127.0.0.1这个IP地址代表连接本机,其实https://127.0.0.1:443/svn/Test/和https://ZhongZhenhua-PC/svn/Test/是一样的,因为我这里S ...
- RMQ(或运算)
RMQ https://ac.nowcoder.com/acm/contest/283/J 题目描述 按位或运算:处理两个长度相同的二进制数,两个相应的二进位中只要有一个为1,该位的结果值为1.例如5 ...
- xcode - 显示安装过的低版本模拟器
1. 更改版本
- 14- Servlet.service() for servlet [mvc-dispatcher] in context with path [/collegeservice] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root caus
有的service没有依赖注入:
- TokuMX唯一索引不支持dropDups选项
TokuMX v1.5.0的唯一索引(unique index)不支持dropDups选项, 如果源数据包含相同目标key的文档,将无法建立唯一索引. 问题场景: 从MongoDB到TokuMX的数据 ...