多网卡下对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协议通信的双方必须先建立连接,完成数据交换后,通信双 ...
随机推荐
- Maven可执行jar包
参考文章: Maven生成可以直接运行的jar包的多种方式(http://blog.csdn.net/xiao__gui/article/details/47341385) 一般,我们通过 > ...
- Hystrix-超时设置
由于客户端请求服务端方法时,服务端方法响应超过1秒将会触发降级,所以我们可以配置Hystrix默认的超时配置 如果我们没有配置默认的超时时间,Hystrix将取default_executionTim ...
- jquery 获取和设置Select选项常用方法总结
1.获取select 选中的 text:$("#cusChildTypeId").find("option:selected").text();$(" ...
- pod优先级与抢占测试
# kubectl describe node k8s-n2Name: k8s-n2Roles: <none>Labels: ...
- Maven常用命令及Eclipse应用
一般来说,github上大多的java项目都是使用maven,ant等进行构建的.由于之前没有使用过maven,因此这几天对maven进行了简单的学习.古话说:“温故而知新”,一些命令长时间不使用都会 ...
- jsp页面添加时间
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <body& ...
- HSTS详解
1. 缘起:启用HTTPS也不够安全 有不少网站只通过HTTPS对外提供服务,但用户在访问某个网站的时候,在浏览器里却往往直接输入网站域名(例如www.example.com),而不是输入完整的URL ...
- hibernate联合主键
@Entity @Table(name = "TABLE_NAME") @IdClass(PK.class) public class TableName implements S ...
- Access to the path 'C:\inetpub\wwwroot\mysite\images\savehere' is denied.
访问路径被拒绝 我解决了这个设置: IIS>应用程序池> [您的站点]>高级设置...>标识>内置帐户> LocalSystem
- <script language = "javascript">, <script type = "text/javascript">和<script language = "application/javascript">(转)
application/javascript是服务器端处理js文件的mime类型,text/javascript是浏览器处理js的mime类型,后者兼容性更好(虽然application/ ...