It seems to be achievable but one needs to use another low-level implementation of the TCP for java.
This library might help: https://github.com/mlaccetti/rocksaw/blob/master/src/main/java/com/savarese/rocksaw/net/RawSocket.java
An example of low-level sending SYN
command:
https://github.com/dangan249/RawSocket/blob/master/ccs/neu/edu/andang/RawSocketClient.java#L181-L182
private final byte SYN_FLAG = (byte) 2;
private final byte ACK_FLAG = (byte) 16;
...
// send the SYN packet
sendMessage(null, this.getCurrentSeqNum(), this.getCurrentACKNum(), SYN_FLAG);
which boils down to just writing a proper packet into the socket:
TCPHeader header = new TCPHeader( this.sourcePort, this.destPort, sequenceNum ,
ackNum, flags , AD_WINDOW_SIZE ) ;
TCPPacket packet = new TCPPacket( header );
...
this.rSock.write( this.destAddress, packet.toByteArray() ) ;
By doing that one can implement a needed sequence of operations including the wanted SYN->SYNC-ACK<-RST