2017-01-01 8 views
0

Я пытаюсь выяснить, как направить некоторые вручную созданные данные заголовка TCP в массив байтов. Я смогу использовать пакет JnetPcap.send (byte []) и увидеть его с помощью wirehark, теперь мне нужно создать пакет как массив байтов, чтобы я мог его отправить. Я хочу сделать это вручную, так как есть множество функций библиотеки, которые я мог бы использовать для создания заголовка.Как форматировать значения заголовков 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 построен в прибуду локальные сети и получить функции заголовка И)

UPDATE: Я нашел этот фрагмент код, который выглядит, как это это утилита, мне нужно поставить шестнадцатеричные значения в массив байтов:

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

Так как я перевожу свои ценности, чтобы идти сюда. Будут ли буквально переведены шестнадцатеричные переводы друг в друга?

Так что мой 16-битный destinationPort = 80; становится 0050 ... и 32-битной последовательностьюNum = 0; становится 0000 0000 ... 4 бит dataOffset = 5; становится 5. Кажется, что это может сработать, я попробую.

(Они имеют 118 шестнадцатеричных цифр, является то, что правильно для заголовка TCP? Мои ценности оставит меня с 40 шестнадцатеричных цифр, может быть, они имеют полезную нагрузку или заголовок IP/Ethernet, а?)

ответ

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.