我有以下代码:
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]);
}
以下是代码的输出:
您可以注意到bootom数据包很好,但最重要的不是。 FOr实例所有标志都为0,但是碎片偏移量为8,然后IP源和IP目标混合在一起。#
有人可以告诉我发生了什么吗?
答案 0 :(得分:0)
根据RFC(See the wikipedia article here):
对于分段数据包,除最后一个之外的所有分段都设置了MF标志。最后一个片段具有非零片段偏移字段,将其与未分段的数据包区分开来。
您可能在这里看到的是碎片集的最后一个数据包。
关于混合IP:它们看起来很好 - 一个数据包是单向传输而另一个数据包传输另一个数据包。