2


1

rawソケットのudpパケットの断片化

質問のフォローアップhttps://stackoverflow.com/questions/4187850/packet-fragmentation-for-raw-sockets[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ヘッダーを叩く必要がありますか?

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

1 Answer


2


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

最初のパケットに1480バイトのデータを入れ、2番目のパケットに276バイトのデータを入れると、これらのフィールドを除いてIPヘッダーは同一になります。

  • 「フラグメントオフセット」:最初のパケットで「0」に設定し、 第二;

  • Total Length:1480に最初のヘッダー長を加えた値に設定 パケット、および276と2番目のパケットのヘッダー長。

  • 「MF」フラグ:最初のパケットで「1」に、2番目のパケットで「0」に設定します。

  • Header Checksum:異なるヘッダーで再計算 適切な。