Как форматировать значения заголовка TCP и push к массиву байтов для пакетного теста в Java

Я пытаюсь выяснить, как отправить некоторые данные заголовка TCP, созданные вручную, в массив байтов. Я смогу использовать JnetPcap.send (Byte [] packet) and see it with wireshark, all I needed now is to create the packet as a byte array so I can send it along. Я хочу сделать это вручную, так как есть много библиотечных функций, которые я мог бы использовать для создания заголовка.

Я просто не могу найти никакого объяснения тому, как форматировать значения или загружать их в массив. Я также не уверен, что значения, которые я использую, будут действительными. Это то, что я думаю использовать…

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 и получить функции заголовка 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 / Ethernet?)

2 ответа

  1. Я обнаружил, что могу использовать функции 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.