2017-01-01 1 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가 내장 사용하고 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 진수로 날 떠나 버릴 까봐?)

답변

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

일반적인 방법입니다 ByteArrayOutputStreamDataOutputStream에 싸여 있습니다.

관련 문제