多網卡下對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和端口“發給”具體的協議的上層應用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM