如何在Java中格式化TCP头值并将其推送到字节数组以进行数据包测试

如何在Java中格式化TCP头值并将其推送到字节数组以进行数据包测试,java,arrays,tcp,packets,jnetpcap,Java,Arrays,Tcp,Packets,Jnetpcap,我试图弄清楚如何将一些手动创建的TCP头数据推送到字节数组。我将能够使用JnetPcap.send(byte[]packet)并使用wireshark查看它,现在我所需要的只是将该数据包创建为字节数组,这样我就可以发送它了。我想手动执行此操作,因为有很多库函数可用于创建标题 我根本找不到任何关于如何格式化值或将其加载到数组的解释。我也不确定我使用的值是否有效。这就是我想用的 public static int sourcePort = 1234; //16 bits public static

我试图弄清楚如何将一些手动创建的TCP头数据推送到字节数组。我将能够使用JnetPcap.send(byte[]packet)并使用wireshark查看它,现在我所需要的只是将该数据包创建为字节数组,这样我就可以发送它了。我想手动执行此操作,因为有很多库函数可用于创建标题

我根本找不到任何关于如何格式化值或将其加载到数组的解释。我也不确定我使用的值是否有效。这就是我想用的

public static int sourcePort = 1234; //16 bits
public static int destinationPort = 80; //16 bits
public static int sequenceNum = 0; //32 bits - Can this be arbitrary?
public static int ackNum = 0; //32 bits - sequenceNumber + next data start
public static int dataOffset = 5; //4 bits - Minimum value of 5
public static int reserved = 0; //4 bits - Always 0
public static int controlFlags = 0; //8 bits - Not sure if I need any
public static int windowSize = 0; //16 bits Can this be arbitrary?
public static int checkSum = 0; //16 bits - ?use TCP.calculateChecksum() 
public static int urgent = 0; //16 bits

byte[] packet = new byte[160];
//Now load the values into the byte[]
(我还使用JnetPcap内置的get ethernet和get Ipv头函数)

更新: 我发现了这个片段,它看起来像是我需要将十六进制值放入字节数组的实用程序:

byte[] pktBytes = FormatUtils.toByteArray("0015c672234c90e6ba92661608004500002d358c4000800600000a000b050a090028c26e270fb8b256e3a2009f785018faf01f550000746573740a");
JMemoryPacket packet = new JMemoryPacket(pktBytes);
那么,我该如何将我的价值观转化为这里的价值观呢。它会是字面上的十六进制翻译附加在一起吗

因此,我的16位destinationPort=80;变成0050。。。32位sequenceNum=0;变成0000 0000。。。4位数据偏移量=5;变成5。看来它能用,我要试试


(它们有118个十六进制数字,对TCP报头正确吗?我的值会留下40个十六进制数字,可能它们也有一个有效负载或IP/以太网报头?)

通常的方法是通过
ByteArrayOutputStream
包装在
数据输出流中
我发现我可以使用jNetPcap函数加载标头:

Tcp tcp = packet.getHeader(new Tcp());  
tcp.source(sourcePort);  
tcp.destination(destinationPort); 
tcp.seq(sequenceNum);
tcp.ack(ackNum);
tcp.hlen(dataOffset);
tcp.flags(controlFlags);
tcp.window(windowSize);       
tcp.checksum(tcp.calculateChecksum()); 
tcp.urgent(urgent);
这对我来说是可行的,但我也可以手动设置字节数组,并将整个数组连同完整的2-3-4层头传递给send函数