对IP进行强制分片,发现PING包大量丢包,不知什么原因

晋南大黄牛 2011-11-12 02:17:24
在有线驱动中对接收到的主机的IP报文进行强制分片,从STA向主机PING包,然后在STA与主机同时抓包,发现STA ping包时,如果一个正常收到回复(回复的报文是分片的),之后就会丢好几个包,从主机上抓包看,发现STA发送的request包在主机上没有收到,只有当主机收到1个LLC报文,主机才会正常接收与回复。因此,怀疑在进行分片时,哪些参数没有设置对,请各位大侠给指点一下!
...全文
850 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiahehao 2011-11-16
  • 打赏
  • 举报
回复
"看它ping通的时候,会重新做一次arp过程。"这个细节很有意思。做ARP动作,表示它只知道对方的目的IP而不知道MAC。那你每次分包后,把每个包的源/目的IP,MAC全打出来。观察是不是全是一样的?
再用“arp -a”,看你的系统学习到了对方的MAC没有?或者你设的多长时间会刷新一次ARP表?
晋南大黄牛 2011-11-16
  • 打赏
  • 举报
回复
我打了一下客户端发送过来的包,发现客户端的包传不上来,而我只是改的下行的啊!觉得很是奇怪,而arp -a,发现没有学习到!而这个应该与学习的时间长短没有关系了吧,我把这段代码去掉,就可以正常ping通!
晋南大黄牛 2011-11-15
  • 打赏
  • 举报
回复
只拆分数据部分。
代码段,还请大侠指点:
{
hlen = iph->ihl * 4;
left = skb->len - hlen-ETH_HLEN;
ptr = raw + hlen+ETH_HLEN;
offset = (ntohs(iph->frag_off) & 0x1fff) << 3;
not_last_frag = iph->frag_off & htons(IP_MF);
while(left > 0){
len = left;
if (len > 1424)
len = 1424;
if (len < left) {
len &= ~7;
}
if ((skb2 = alloc_skb(len+hlen+ETH_HLEN,GFP_ATOMIC)) ==NULL)
{
printk("IP: frag: no memory for new fragment!\n");
return 0;
}
ip_copy_metadata_copy(skb2, skb);
skb_put(skb2, len + hlen+ETH_HLEN);
if (skb->sk)
skb_set_owner_w(skb2, skb->sk);
memcpy(skb2->data, skb->data, hlen+ETH_HLEN);
memcpy(skb2->data+hlen+ETH_HLEN, skb->data+ptr,len);
skb2->nh.raw = skb2->data+ETH_HLEN;
skb2->h.raw = skb2->data + hlen+ETH_HLEN;
skb2->mac.raw = skb2->data;
left -= len;
iphnew = (struct iphdr *)(skb2->data + ETH_HLEN);
iphnew->frag_off = htons((offset >> 3));
if (offset == 0)
ip_options_fragment_copy(skb);

if (left > 0 || not_last_frag)
iphnew->frag_off |= htons(IP_MF);
ptr += len;
offset += len;
iphnew->tot_len = htons(len + hlen);
ip_send_check(iphnew);
ret = dev_queue_xmit(skb2);
}
if (skb != NULL)
kfree_skb(skb);
return 1;
}
}
晋南大黄牛 2011-11-15
  • 打赏
  • 举报
回复
拆分数据后,每个分片都有ETH头与IP头的,抓包的时候能抓到ping通的包,只是ping通后,之后会有很多包会丢,然后过了十个包左右,又会通一个包。看它ping通的时候,会重新做一次arp过程。不知道在分包的时候是不是参数没设置对还是怎么的?
充电宝111 2011-11-15
  • 打赏
  • 举报
回复
只拆分数据部分?拆分后每个都有头么?没头当然丢了
jiahehao 2011-11-14
  • 打赏
  • 举报
回复
你是如何分片的?只拆分包的数据部分?请帖代码。

4,436

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧