일부 수동으로 생성 된 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가 내장 사용하고 GET 이더넷 및 IPV 헤더 기능을 얻을)
업데이트 : 나는 그것을처럼 보이는이 조각을 발견 바이트 배열에 16 진수 값을 넣어야하는 유틸리티입니다 :
byte[] pktBytes = FormatUtils.toByteArray("0015c672234c90e6ba92661608004500002d358c4000800600000a000b050a090028c26e270fb8b256e3a2009f785018faf01f550000746573740a");
JMemoryPacket packet = new JMemoryPacket(pktBytes);
그래서 여기에 들어가기 위해 값을 변환합니까? 문자 그대로 16 진수가 서로 덧붙여 질까요?
그래서 내 16 비트 destinationPort = 80; 0050 ... 및 32 비트 시퀀스 Num = 0이된다; 0000 0000 ... 4 비트가된다. dataOffset = 5; 그건 효과가있는 것처럼 보입니다. 나는 그것을 시도해 볼 것입니다.
는 (그들은, 118 16 진수가 TCP 헤더에 그 권리인가? 내 값이 아마 그들은뿐만 아니라 페이로드 (payload) 또는 IP/이더넷 헤더를 가지고, 40 16 진수로 날 떠나 버릴 까봐?)