5

セキュリティコースの割り当てとしてスニファを実行する必要があります。私はCとpcapライブラリを使用しています。私はすべてがうまく機能しました(インターネットからコードを取得して変更したため)。しかし、コードについていくつか質問があります。

u_int ip_len = (ih->ver_ihl & 0xf) * 4;   

ihはタイプip_headerであり、現在、パケット内のIPヘッダーを指しています。
ver_ihlIPのバージョンを示します。
私は何であるか理解できません:& 0xf) * 4;

4

3 に答える 3

3

&はビット単位の演算子です。この場合、ver_ihlを0xfで使用しています。これは、最下位4以外のすべてのビットをクリアする効果があります。

0xff&0x0f = 0x0f

ver_ihlは、最初の4ビット=バージョン+2番目の4=インターネットヘッダーの長さとして定義されます。and操作はバージョンデータを削除し、長さデータをそのまま残します。長さは32ビットワードのカウントとして記録されるため、*4はip_lenをヘッダーのバイト数に変換します

あなたのコメントに応えて:

ビット単位で、オペランドの対応するビットをandsします。あなたと0のあるものはすべて0になり、1のあるものは同じままです。

0xf =0x0f=バイナリ00001111

したがって、あなたと0x0fが何かを持っている場合、最初の4ビットは0に設定され(0に対してアンディングしているため)、最後の4ビットは他のオペランドと同じように残ります(1に対してアンディングしているため)。これは、ビットマスキングと呼ばれる一般的な手法です。

http://en.wikipedia.org/wiki/Bitwise_operation#AND

于 2010-03-16T06:58:12.900 に答える
1

IPv4を定義するRFC791からの読み取り:

インターネットヘッダーの内容の要約は次のとおりです。

 0                   1                   2                   3   
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Version|  IHL  |Type of Service|          Total Length         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

IPヘッダーの最初の8ビットは、バージョンとIHLフィールドの組み合わせです。

IHL:4ビット

インターネットヘッダーの長さは、32ビットワード単位のインターネットヘッダーの長さであり、データの先頭を指します。正しいヘッダーの最小値は5であることに注意してください。

あなたがしているコードは、そこで最初の8ビットを取り、IHL部分を切り取って、それをバイト数に変換することです。ビット単位0xFのANDbyはIHLフィールドを分離し、32ビットワードには4バイトがあるため、4を掛けることができます。

于 2010-03-16T21:25:27.333 に答える
0

ver_ihlフィールドには、2つの4ビット整数が含まれ、下位ニブルと上位ニブルとしてパックされます。長さは32ビットワードの数として指定されます。したがって、20バイトのヘッダーを持つバージョン4のIPフレームがある場合、ver_ihlフィールドの値は69になります。次に、次のようになります。

  01000101
& 00001111
  --------
  00000101

したがって、はい、「&0xf」は下位4ビットをマスクします。

于 2010-03-16T10:01:08.800 に答える