收到的两个数据包的IP标头显示不同

时间:2013-11-24 17:47:22

标签: c network-programming ip

我有以下代码:

struct ip_header {
    unsigned char ip_hl:4;  /* header length 4 bits*/
    unsigned char ip_ver:4; /* version 4 bits*/ 
    unsigned char ip_dscp:6;/* dscp (previously part of type of service) 6 bits*/
    unsigned char ip_ecn:2; /* ecn (previously part of type of service) 2 bits*/
    unsigned int ip_len:16;  /* total length 2 bytes*/
    unsigned int ip_id:16;  /* identification 2 bytes*/
    unsigned char ip_rf:1;  /* reserved fragment flag */
    unsigned char ip_df:1;  /* dont fragment flag */
    unsigned char ip_mf:1;  /* more fragments flag */
    unsigned int ip_off:13; /* fragment offset */
    unsigned int ip_ttl:8;  /* time to live */
    unsigned int ip_p:8;    /* protocol */
    unsigned int ip_sum:16; /* checksum */
    unsigned char ip_src[4];/* source address */
    unsigned char ip_dst[4];/* dest */
};
...
    void decode_ip(const unsigned char *header_start) {
        int i;

    const struct ip_header *ip_hdr;

    ip_hdr = (const struct ip_header *)(header_start + ETHERNET_HEADER_SIZE);


    printf("\tIP Reserved Flag  : %u\n", (unsigned int)ip_hdr->ip_rf);  
    printf("\tIP Dont Fragment  : %u\n", (unsigned int)ip_hdr->ip_df);  
    printf("\tIP More Fragments : %u\n", (unsigned int)ip_hdr->ip_mf);  
    printf("\tIP Offset         : %u\n", (unsigned int)ip_hdr->ip_off); 
    printf("\tIP Source         : %u", (unsigned int)ip_hdr->ip_src[0]);
    for (i=1;i<4; i++) printf(".%u", (unsigned int)ip_hdr->ip_src[i]);
    printf("\n\tIP Destination    : %u", (unsigned int)ip_hdr->ip_dst[0]);  
    for (i=1;i<4; i++) printf(".%u", (unsigned int)ip_hdr->ip_dst[i]);   
}

以下是代码的输出:

enter image description here

您可以注意到bootom数据包很好,但最重要的不是。 FOr实例所有标志都为0,但是碎片偏移量为8,然后IP源和IP目标混合在一起。#

有人可以告诉我发生了什么吗?

1 个答案:

答案 0 :(得分:0)

根据RFC(See the wikipedia article here):

对于分段数据包,除最后一个之外的所有分段都设置了MF标志。最后一个片段具有非零片段偏移字段,将其与未分段的数据包区分开来。

您可能在这里看到的是碎片集的最后一个数据包。

关于混合IP:它们看起来很好 - 一个数据包是单向传输而另一个数据包传输另一个数据包。