私はネットワークがどのように機能しているかを理解しようとしています、私はいくつかのテストをして、いくつかのパッケージを送っています...とにかく
私のポイントは、_"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
struct ip
とstruct iphdr
は、同じ基本構造の2つの異なる定義であり、異なる場所から取り込まれます。
struct ip
は<netinet/ip.h>
で定義されています。これは、UNIXシステムの合理的な標準ヘッダーです。
struct iphdr
は<linux/ip.h>
で定義されています。このヘッダー(および構造)はLinux固有であり、他のオペレーティングシステムには存在しません。
どちらを使用するかわからない場合は、struct ip
を使用してください。この構造を使用するコードは、Linux以外のシステムに移植できる可能性が高くなります。
struct icmp
とstruct 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メッセージのコンテンツを定義します。