社区
Linux_Kernel
帖子详情
对IP进行强制分片,发现PING包大量丢包,不知什么原因
晋南大黄牛
2011-11-12 02:17:24
在有线驱动中对接收到的主机的IP报文进行强制分片,从STA向主机PING包,然后在STA与主机同时抓包,发现STA ping包时,如果一个正常收到回复(回复的报文是分片的),之后就会丢好几个包,从主机上抓包看,发现STA发送的request包在主机上没有收到,只有当主机收到1个LLC报文,主机才会正常接收与回复。因此,怀疑在进行分片时,哪些参数没有设置对,请各位大侠给指点一下!
...全文
932
6
打赏
收藏
对IP进行强制分片,发现PING包大量丢包,不知什么原因
在有线驱动中对接收到的主机的IP报文进行强制分片,从STA向主机PING包,然后在STA与主机同时抓包,发现STA ping包时,如果一个正常收到回复(回复的报文是分片的),之后就会丢好几个包,从主机上抓包看,发现STA发送的request包在主机上没有收到,只有当主机收到1个LLC报文,主机才会正常接收与回复。因此,怀疑在进行分片时,哪些参数没有设置对,请各位大侠给指点一下!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
打赏
举报
回复
你是如何分片的?只拆分包的数据部分?请帖代码。
如何利用
ping
命令轻松解决路由器网络问题.docx
- **-f**:
强制
不
分片
发送数据
包
,用于检测MTU问题。 - **-a**:将
IP
地址解析为主机名。 - **-s**:
ping
时附带TCP同步报文段,用于探测防火墙策略。 4. **分析结果** - **请求超时**:可能网络路径中有设备未...
【Linux】Linux
ping
参数解析/禁止报文
分片
-M/ 设置
包
长-s/ 指定出接口-I/ 指定
ping
包
个数-c / 发送
ping
包
时间间隔-i
不管在windows平台,还是在linux平台,
ping
都是非常常用的网络命令;
ping
命令通过ICMP(Internet控制消息协议)工作;
ping
可以用来测试本机与目标主机是否联通、联通速度如何、稳定性如何。 一、
ping
用法:
ping
...
关于 Linux
ping
命令分析介绍
这里表示,我们发出的ICMP报文...④ 发出去的
包
数,返回的
包
数,
丢
包
率,耗费时间;默认情况下,Linux系统的TTL值为64或255,Windows NT/2000/XP系统的TTL值为128,Windows 98系统的TTL值为32,UNIX主机的TTL值为255。
【网络篇】第十八篇——
ping
的工作原理
当遇到问题的时候,总不能死的不明不白,没头没脑的作风不是计算机...协议访问对端主机时,能找到对端的主机了,可是对端主机的防火墙已经禁止。当路由表中没有该主机的信息,或者该主机没有连接到网络,那么会通过。
UDP大数据传输:
IP
层
分片
还是应用层切块?
当数据超过网络MTU时,
IP
层会自动
分片
传输,但
分片
容易
丢
包
且不可靠。理论上UDP数据报最大长度65535字节,实际应用中建议不超过1472字节(以太网MTU限制)。可靠的做法是在应用层自行
分片
、编号和重发,而非依赖
IP
分...
Linux_Kernel
4,468
社区成员
17,461
社区内容
发帖
与我相关
我的任务
Linux_Kernel
Linux/Unix社区 内核源代码研究区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章