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包分析以及原理)的主要内容,如果未能解决你的问题,请参考以下文章

智慧社区技术总结

第一章信息收集—扫描技术与抓包分析

使用TCP协议批量扫描端口

Java TCP/IP SocketUDP Socket(含代码)

Java TCP/IP SocketUDP Socket(含代码)

Java开发技术:Socket编程端口扫描小程序(完整源码)