多网卡下对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协议通信的双方必须先建立连接,完成数据交换后,通信双 ...
随机推荐
- 4 并发编程-(进程)-守护进程&互斥锁
一.守护进程 主进程创建子进程,然后将该进程设置成守护自己的进程,守护进程就好比崇祯皇帝身边的老太监,崇祯皇帝已死老太监就跟着殉葬了. 关于守护进程需要强调两点: 其一:守护进程会在主进程代码执行结束 ...
- 一本很好的书LearnOpenGL
这本书好像不怎么出名,但读起来非常易懂,知识全面 https://learnopengl.com/Advanced-Lighting/Normal-Mapping 基于物理的渲染 – 理论篇 < ...
- Python3 impyla 连接 hiveserver2
简介: 接到一个任务,需要从 hive 中读取数据,生成报表. 于是找到了官方文档:https://cwiki.apache.org/confluence/display/Hive/Setting+U ...
- JAVA 打印流与转换流
转换流主要有两个 InputStreamReader 和 OutputStreamWriter 1. InputStreamReader 主要是将字节流输入流转换成字符输入流 2. OutputStr ...
- mark_2017_2_27
工作总结web_acl 535 git clone “ssh://git@outergit.yonyou.com:49622/esn_web/web_acl.git" 600 git bra ...
- linux下字符串的比较方式
A="$1" B="$2" #判断字符串是否相等 if [ "$A" = "$B" ];then echo &qu ...
- 把Excel导入SQL server时出现错误
在把Excel导入SQL server时出现“未在本地计算机上注册 Microsoft.ACE.OLEDB.12.0 ”该 错误信息:未在本地计算机上注册“microsoft.ACE.oledb.12 ...
- Matrix(二分套二分)
Matrix http://poj.org/problem?id=3685 Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 8 ...
- python的paramiko模块简单应用
用法1,SSHClient 分别可以使用密码和秘钥登陆,然后执行命令,并且获取执行结果 import paramiko #创建一个SSH对象 ssh = paramiko.SSHClient() #允 ...
- 解读超轻量级DI容器-Guice与Spring框架的区别【转载】
依赖注入,DI(Dependency Injection),它的作用自然不必多说,提及DI容器,例如spring,picoContainer,EJB容器等等,近日,google诞生了更轻巧的DI容器… ...