2017-01-01 44 views
0

我想弄清楚如何將一些手動創建的TCP報頭數據推送到字節數組。我將能夠使用JnetPcap.send(byte []數據包)並使用wireshark查看它,現在我需要的只是將數據包創建爲字節數組,以便我可以將它發送出去。我想手動執行此操作,因爲我可以使用許多庫函數來創建標題。如何格式化TCP報頭值並推送到字節數組以測試Java中的數據包測試

我簡直無法找到任何解釋如何格式化值或將它們加載到數組。我也不確定我使用的值是否有效。這就是我在想使用...

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內置以太網獲取,並得到量Ipv頭功能)

更新: 我發現這個片段看起來像它是我需要把十六進制值,以字節數組的實用程序:

byte[] pktBytes = FormatUtils.toByteArray("0015c672234c90e6ba92661608004500002d358c4000800600000a000b050a090028c26e270fb8b256e3a2009f785018faf01f550000746573740a"); 
JMemoryPacket packet = new JMemoryPacket(pktBytes); 

那我怎麼翻譯我的價值觀在這裏去。它是字面上相互附加的十六進制翻譯嗎?

所以我的16位destinationPort = 80;變成0050 ...和32位sequenceNum = 0;變成0000 0000 ... 4位dataOffset = 5;成爲5.這似乎可以工作,我會試試看。

(他們有118個十六進制數字,是TCP報頭,對嗎?我的價值觀會離開我用40個十六進制數字,也許他們有一個有效載荷或IP /以太網報頭呢?)

回答

0

我發現我可以使用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頭部到發送功能。

0

通常的方法是通過ByteArrayOutputStream包裹在DataOutputStream