web-dev-qa-db-ja.com

struct ipとstruct iphdrの違い

私はネットワークがどのように機能しているかを理解しようとしています、私はいくつかのテストをして、いくつかのパッケージを送っています...とにかく

私のポイントは、_"protocol" structure_と_"protocol header" structure_の本当の違いを見つけることができないということです。

Ip構造の場合、サイズは両方とも20バイトです。しかし、例:

  • _struct ip_および_struct iphdr_サイズ20バイト
  • _struct icmp_サイズ28バイト
  • _struct icmphdr_サイズ8バイト

_struct icmp_に_struct ip/iphdr?_が含まれていると思いますか?

そして、私が見たすべてのプロトコルには同じ種類の構造があります。 _struct udp_/_struct udphdr_、

setsockopt()で設定された_IP_HDRINCL_にリンクされていますか?

だから私の質問は、それらの本当の違いは何ですか?そして良いものを使うとき。

ipおよびiphdr構造体:

_struct iphdr {
    #if defined(__LITTLE_ENDIAN_BITFIELD)
        __u8    ihl:4,
                version:4;
    #Elif defined (__BIG_ENDIAN_BITFIELD)
        __u8    version:4,
                ihl:4;
    #else
        #error  "Please fix <asm/byteorder.h>"
    #endif
         __u8   tos;
         __u16  tot_len;
         __u16  id;
         __u16  frag_off;
         __u8   ttl;
         __u8   protocol;
         __u16  check;
         __u32  saddr;
         __u32  daddr;
         /*The options start here. */
};
_

そしてIP HDR

_struct ip {
#if BYTE_ORDER == LITTLE_ENDIAN 
    u_char  ip_hl:4,        /* header length */
        ip_v:4;         /* version */
#endif
#if BYTE_ORDER == BIG_ENDIAN 
    u_char  ip_v:4,         /* version */
        ip_hl:4;        /* header length */
#endif
    u_char  ip_tos;         /* type of service */
    short   ip_len;         /* total length */
    u_short ip_id;          /* identification */
    short   ip_off;         /* fragment offset field */
#define IP_DF 0x4000            /* dont fragment flag */
#define IP_MF 0x2000            /* more fragments flag */
    u_char  ip_ttl;         /* time to live */
    u_char  ip_p;           /* protocol */
    u_short ip_sum;         /* checksum */
    struct  in_addr ip_src,ip_dst;  /* source and dest address */
};
_

ここにICMP構造コード: https://www.cymru.com/Documents/ip_icmp.h

8
albttx

struct ipstruct iphdrは、同じ基本構造の2つの異なる定義であり、異なる場所から取り込まれます。

struct ip<netinet/ip.h>で定義されています。これは、UNIXシステムの合理的な標準ヘッダーです。

struct iphdr<linux/ip.h>で定義されています。このヘッダー(および構造)はLinux固有であり、他のオペレーティングシステムには存在しません。

どちらを使用するかわからない場合は、struct ipを使用してください。この構造を使用するコードは、Linux以外のシステムに移植できる可能性が高くなります。


struct icmpstruct icmphdrは厄介な状況です。

  • <netinet/icmp.h>両方struct icmpおよびstruct icmphdrを定義します。
  • <linux/icmp.h>struct icmphdrからの定義と同様の構造(ただし、通常は異なるフィールド名)で<netinet/icmp.h>を定義します。

最初:十分な理由がない限り、<linux/icmp.h>を含めないでください。あなたはできません両方のヘッダーを含めることができます-それらは競合します-そしてほとんどのソフトウェアはnetinetの定義を期待します。

2番目:struct icmphdrは、名前が示すようにヘッダーです。 struct icmpは、宛先到達不能メッセージのような構造化ICMPメッセージのコンテンツを定義します。

14