多网卡下对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协议通信的双方必须先建立连接,完成数据交换后,通信双 ...
随机推荐
- mongodb基础学习10-手动预分片
手动预分片是提前对分片创建一定数量足够使用的chunk,这样避免了IO上的压力 先对要演示的表进行分片 调用splitAt函数进行手动预分片,第一个参数指定要预分片的表,第二个参数指定分片规则,即当u ...
- Group by 内部排序
1.right join # update_time gid=>sid, group_status => s_table select a.* from comment as a ri ...
- blast及其格式输出简介
1)blast产生背景 双序列比对可以采用是基于动态规划算法的Needleman-Wunsch(NW)和Smith-Waterman algorithm(SW)算法,虽然精度高,但计算消耗大.当与数据 ...
- Zookeeper—学习笔记(一)
1.Zookeeper基本功能 (增 删 改 查:注册,监听) 两点: 1.放数据(少量). 2.监听节点. 注意: Zookeeper中的数据不同于数据库中的数据,没有表,没有记录,没有字段: Z ...
- rabbitmq web管理界面 用户管理
安装最新版本的rabbitmq(3.3.1),并启用management plugin后,使用默认的账号guest登陆管理控制台,却提示登陆失败. 翻看官方的release文档后,得知由于账号gues ...
- java基础四 [构造器和垃圾回收](阅读Head First Java记录)
本章讲解了对象的创建到被回收的过程,讲述了对象的生命周期 堆(heap)与栈(stack) 实例变量:实例变量是只声明在类下,方法外的变量(实例变量默认值为0/0.0/false,引用的默认值为n ...
- 使用Fiddler发送POST请求
使用Fiddler发送POST请求 在测试过程中,有时会遇到需要修改请求中带的参数,去验证权限的安全问题,但是一些post请求,我们在浏览器中不能直接修改他的参数,然后去提交验证. 而fiddler可 ...
- LocalDateTime json格式化
参考https://www.cnblogs.com/xiaozhang9/p/jackson.html?utm_source=itdadao&utm_medium=referral <d ...
- 关于插入date型数据
create table student (name varchar2(10) not null primary key , enrolldate date not null);//创建student ...
- Python issubclass() 函数
Python issubclass() 函数 Python 内置函数 描述 issubclass() 方法用于判断参数 class 是否是类型参数 classinfo 的子类. 语法 以下是 iss ...