Java笔记-Java端口扫描功能(含TCP包分析以及原理)
端口掃描主要是掃描其TCP端口。因?yàn)樗腥挝帐?#xff0c;握上了,如果有加密才進(jìn)行傳輸層的加密。
寫個(gè)程序,去連接那個(gè)端口,能握手,就說(shuō)明端口是開著的。
?
關(guān)于UDP的端口掃描,有但意義不是很大,因?yàn)閡dp不會(huì)面向連接的。主要看服務(wù)端會(huì)不會(huì)回包,以及使用了什么協(xié)議如DTLS,如果服務(wù)端寫成,客戶端發(fā)送過(guò)來(lái)的數(shù)據(jù)異常,就回個(gè)異常的,這樣就能掃描到,如果沒(méi)寫成這樣,那就沒(méi)辦法了。
?
Java代碼如下:
public class PortScanJava {public boolean isPortOpen(String address, Integer port){boolean ret = false;try{Socket socket = new Socket();socket.bind(new InetSocketAddress(8888));socket.connect(new InetSocketAddress(address, port), 1000);socket.close();ret = true;}catch (Exception e){e.printStackTrace();}return ret;} }這里把端口固定為8888是為了抓包的方便。
調(diào)用如下:
boolean portOpen = portScanComponent.isPortOpen("www.baidu.com", 80); System.out.println(portOpen);程序運(yùn)行截圖如下:
抓到的包是這樣的:
端口狀態(tài)是這樣的:
這樣就有點(diǎn)問(wèn)題了,可見(jiàn)他的四次分手,客戶端只發(fā)出FIN包,就沒(méi)有下文了,服務(wù)端沒(méi)有發(fā)送ACK,讓其進(jìn)入FIN_WAIT2狀態(tài),并且握手的時(shí)候
這里再此出深究是哪個(gè)的問(wèn)題了。先來(lái)看下TCP三次握手,當(dāng)TCB把TCP都建立起來(lái)后,客戶端發(fā)送標(biāo)志位為SYN的包給服務(wù)端,服務(wù)端接收到后會(huì)回SYN和ACK的包,這里不知道是什么原因沒(méi)有抓到,可能是我過(guò)濾得有問(wèn)題,但是可以肯定,客戶端一定是收到了,不然客戶端不會(huì)會(huì)ACK的包給服務(wù)端,分手就是發(fā)FIN。
這里來(lái)看下完整的流程:
用的是QNetworkAccessManager,后端是用SpringBoot搭建的??梢?jiàn)其完整的流程。
總結(jié)
以上是生活随笔為你收集整理的Java笔记-Java端口扫描功能(含TCP包分析以及原理)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 信息安全工程师笔记-案例分析(二)
- 下一篇: Java笔记-CXF增加拦截器与自定义拦