2017-01-01 6 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[] 

ある

UPDATE(私もGETイーサネットで構築し、IPVヘッダー機能を取得JnetPcapを使用しています): を私はそれのように見えるこのスニペットを見つけましたバイト配列に16進値を入れる必要があるユーティリティです:

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

ここで値を変換するにはどうすればいいですか?それは文字通り互いに追加された16進翻訳でしょうか?

私の16ビットのdestinationPort = 80; 0050 ...となり、32ビットsequenceNum = 0となる。 0000 0000 ... 4ビットになるdataOffset = 5;それがうまくいくように思える、私は試してみるつもりだ。

(彼らは118桁の16進数持って、TCPヘッダーのためのその権利のですか?私の値は、おそらく彼らは同様にペイロードまたはIP/Ethernetヘッダを持って、40進数で私を残すでしょうか?)

答えて

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にラップします。

関連する問題