多网卡下对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协议通信的双方必须先建立连接,完成数据交换后,通信双 ...
随机推荐
- UI5-文档-4.8-Translatable Texts
在这一步中,我们将UI的文本移动到一个单独的资源文件中. 这样,他们都在一个中心位置,可以很容易地翻译成其他语言.这个国际化过程(简称i18n)是在SAPUI5中通过使用一种特殊的资源模型和标准的数据 ...
- MPP、SMP、NUMA概念介绍
一.MPP,SMP,NUMA概念介绍 1.1. MPP架构介绍 MPP (Massively Parallel Processing),大规模并行处理系统,这样的系统是由许多松耦合的处理单 ...
- Spring,Hibernate 集成解决多hbm.xml文件繁多的方案
开发一个大一点的项目有很多的hbm.xml文件,有时候上百个也不稀奇,如果用 <property name="mappingLocations"> <list&g ...
- SQL Server 2008用'sa'登录失败,启用'sa'登录的办法
首先”为什么用sa登录不了,提示登录失败呢?" 当然,自己装SQL Server 2008的时候根本就没有用sa登录的方法,装数据库的时候是用windows身份登录的. 如果要启用用户名为“ ...
- java列表转成 int[] 的格式
java 稀疏矩阵中输入的索引系列和对应的值系列需要用 int[] r_indices = new int[featureIdxList.size()]; 的数据格式. 但是实际中可能实现没法确定 f ...
- KKT条件的物理意义(转)
最好的解释:https://www.quora.com/What-is-an-intuitive-explanation-of-the-KKT-conditions# 作者:卢健龙链接:https:/ ...
- 使用Font Awesome替换你的网站图标(icons 图标)
http://www.thinkcmf.com/font/icons/ 第一次使用 Font Awesome 发现相当的爽呀!它的图标很全,能够帮你节约时间去找图片.下面就来一起学习吧: 1: 去官方 ...
- TZOJ 4746 Xiangqi(模拟棋盘数组)
描述 Xiangqi is one of the most popular two-player board games in China. The game represents a battle ...
- 【vs2010】转换到 COFF 期间失败: 文件无效或损坏
不知怎么本来编译好好的VS2010环境,忽然出现“转换到COFF 期间失败:文件无效或损坏”的链接错误.花了好多天,试了好多方法,最终解决了这个问题. 现在罗列一下这几种解决方案: 方案1: ...
- [leetcode]215. Kth Largest Element in an Array 数组中第k大的元素
Find the kth largest element in an unsorted array. Note that it is the kth largest element in the so ...