Java笔记-Java端口扫描功能(含TCP包分析以及原理)
Posted IT1995
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java笔记-Java端口扫描功能(含TCP包分析以及原理)相关的知识,希望对你有一定的参考价值。
端口扫描主要是扫描其TCP端口。因为他有三次握手,握上了,如果有加密才进行传输层的加密。
写个程序,去连接那个端口,能握手,就说明端口是开着的。
关于UDP的端口扫描,有但意义不是很大,因为udp不会面向连接的。主要看服务端会不会回包,以及使用了什么协议如DTLS,如果服务端写成,客户端发送过来的数据异常,就回个异常的,这样就能扫描到,如果没写成这样,那就没办法了。
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是为了抓包的方便。
调用如下:
boolean portOpen = portScanComponent.isPortOpen("www.baidu.com", 80);
System.out.println(portOpen);
程序运行截图如下:
抓到的包是这样的:
端口状态是这样的:
这样就有点问题了,可见他的四次分手,客户端只发出FIN包,就没有下文了,服务端没有发送ACK,让其进入FIN_WAIT2状态,并且握手的时候
这里再此出深究是哪个的问题了。先来看下TCP三次握手,当TCB把TCP都建立起来后,客户端发送标志位为SYN的包给服务端,服务端接收到后会回SYN和ACK的包,这里不知道是什么原因没有抓到,可能是我过滤得有问题,但是可以肯定,客户端一定是收到了,不然客户端不会会ACK的包给服务端,分手就是发FIN。
这里来看下完整的流程:
用的是QNetworkAccessManager,后端是用SpringBoot搭建的。可见其完整的流程。
以上是关于Java笔记-Java端口扫描功能(含TCP包分析以及原理)的主要内容,如果未能解决你的问题,请参考以下文章
Java TCP/IP SocketUDP Socket(含代码)