2

raw ソケットの質問パケット フラグメンテーションのフォローアップ

そのように実装された生のソケットがある場合:

  if ((sip_socket = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0)
      {
    cout << "Unable to create the SIP sockets."<< sip_socket<<" \n";
    return -3;
      }

   if ( setsockopt(sip_socket, IPPROTO_IP, IP_HDRINCL, &one, sizeof(one)) == -1)
      {
   cerr << "Unable to set option to Raw Socket.\n";
   return -4;
      };  

サイズが 1756 (IP ヘッダーを含まない) のパケットがある場合、どうすればipHdr->fragment_offset (3 ビット フラグを含む 16 ビット)を設定できますか?
サイズ 1480 とサイズ 276 の 2 つのパケットを準備し、両方のパケットに IP ヘッダーをスラップする必要がありますか?

誰でもこれのサンプルコードを指摘できますか?

4

1 に答える 1

2

はい、それぞれ独自の IP ヘッダーを持つ 2 つのパケットを準備する必要があります。

最初のパケットに 1480 バイトのデータを入れ、2 番目のパケットに 276 バイトのデータを入れた場合、IP ヘッダーは次のフィールドを除いて同一である必要があります。

  • Fragment Offset:0最初のパケットと14802 番目のパケットに設定します。
  • Total Length: 1480 に最初のパケットのヘッダー長を加えた値、および 276 に 2 番目のパケットのヘッダー長を加えた値に設定します。
  • MFフラグ:1最初のパケットと02 番目のパケットに設定されます。
  • Header Checksum: 必要に応じて、さまざまなヘッダーで再計算されます。
于 2010-11-16T05:00:20.067 に答える