免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4106 | 回复: 5
打印 上一主题 下一主题

[网络] linux中tap虚拟网卡问题,请各位大侠帮帮忙,简单看下 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-01-04 11:42 |只看该作者 |倒序浏览
我跑的linux内核版本是Linux version 2.6.14
现在在板子上使用虚拟网卡tap后,将eth0设置为杂收模式,在测试ping时出现了如下问题:
# ping 192.168.1.66
PING 192.168.1.66 (192.168.1.66): 56 data bytes
84 bytes from 192.168.1.66: icmp_seq=0 ttl=64 time=31.6 ms
84 bytes from 192.168.1.66: icmp_seq=0 ttl=64 time=35.7 ms (DUP!)
84 bytes from 192.168.1.66: icmp_seq=1 ttl=64 time=2.0 ms
84 bytes from 192.168.1.66: icmp_seq=1 ttl=64 time=5.2 ms (DUP!)
84 bytes from 192.168.1.66: icmp_seq=2 ttl=64 time=2.0 ms
84 bytes from 192.168.1.66: icmp_seq=2 ttl=64 time=5.3 ms (DUP!)
84 bytes from 192.168.1.66: icmp_seq=3 ttl=64 time=2.0 ms
84 bytes from 192.168.1.66: icmp_seq=3 ttl=64 time=5.2 ms (DUP!)
84 bytes from 192.168.1.66: icmp_seq=4 ttl=64 time=2.0 ms
84 bytes from 192.168.1.66: icmp_seq=4 ttl=64 time=5.3 ms (DUP!)
84 bytes from 192.168.1.66: icmp_seq=5 ttl=64 time=2.0 ms
84 bytes from 192.168.1.66: icmp_seq=5 ttl=64 time=5.3 ms (DUP!)
84 bytes from 192.168.1.66: icmp_seq=6 ttl=64 time=2.0 ms
84 bytes from 192.168.1.66: icmp_seq=6 ttl=64 time=5.9 ms (DUP!)
84 bytes from 192.168.1.66: icmp_seq=7 ttl=64 time=2.0 ms
84 bytes from 192.168.1.66: icmp_seq=7 ttl=64 time=5.3 ms (DUP!)
每一个ping后都有1个(DUP!)。

这个是我的网卡配置:
# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:19:54:31:12:02  
          UP BROADCAST RUNNING PROMISC MULTICAST  MTU:1500  Metric:1
          RX packets:7539 errors:0 dropped:0 overruns:0 frame:0
          TX packets:284 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:824273 (804.9 KiB)  TX bytes:28980 (28.3 KiB)
          Interrupt:6 Base address:0x6000

tap       Link encap:Ethernet  HWaddr 00:19:54:31:12:02  
          inet addr:192.168.1.171  Bcast:192.168.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:7541 errors:0 dropped:0 overruns:0 frame:0
          TX packets:282 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:500
          RX bytes:794201 (775.5 KiB)  TX bytes:28896 (28.2 KiB)

想请问一下造成这个(DUP!),重传现象是因为我将eth0的mac和tap的mac设置成一样引起的吗?
我网上查了一下,都说的是网里有回路,但是我现在是计算机和板子直连的,没有通过hub或路由器。
我后面又将tap的物理地址改为了和eth0不同,但是结果是测试ping时,无法ping通,通过net抓包工具分析看是有ICMP包发给计算机,计算机也回复了对应的包,但是板子上程序就是始终无法收取到,但是板子上的程序是可以收取arp包的。
请各位达人帮忙,看下我这个为什么eth0和tap的mac地址不一致时就无法收包?一致时就会有DUP!是什么问题??

论坛徽章:
0
2 [报告]
发表于 2013-01-04 18:04 |只看该作者
你具体怎么做的,没有自己做程序吗?正常而言,一个tap其实是通过一个字符设备文件和外界交换数据包的,向字符设备写入一个包就是tap从外界收到一个包,而tap向外发的包是需要通过字符设备来收取的。

论坛徽章:
0
3 [报告]
发表于 2013-01-09 14:15 |只看该作者
你好,感谢你的回复!
我有自己做程序,你说的这个字符设备文件应该就说该文件吧在/dev/net/tun
我是通过eth0设置为杂收模式,然后读取eth0的数据,写入到tap的,最后是通过读取tap的数据写入到eth0的。

论坛徽章:
0
4 [报告]
发表于 2013-01-11 15:09 |只看该作者
看不到程序,只能去猜了,你应该是用PF_PACKET做的?设置为混杂模式之后eth0应该是把ping的响应收到内核了,然后你的应用层程序又向内核写入一个,就导致重复的ICMP echo reply。

论坛徽章:
0
5 [报告]
发表于 2013-01-11 15:55 |只看该作者
你好!十分感谢你的回复!
确实我们这边用的是PF_PACKET。
“设置为混杂模式之后eth0应该是把ping的响应收到内核了,然后你的应用层程序又向内核写入一个,就导致重复的ICMP echo reply”
你说的这种情况确实跟我现在的现象相符,但是我这个程序在不仅仅只在一个嵌入式平台上运行过,相同的程序在另一个平台上,却是很正常的。
但是在我现在运行的平台上就出现(DUP!),平台不同所以对应的kernel及其网卡驱动程序是不同的。
我想不通为什么非要将tap的物理地址改为了和eth0一样,才能ping通?如果tap和eth0的mac地址不同,就无法ping通。

论坛徽章:
0
6 [报告]
发表于 2013-02-04 13:53 |只看该作者
回复 5# qwerty1231


    是不是你的网口有MAC过滤功能,外部来的数据目标MAC非MC/BC、非它自己的地址就直接过滤掉了?你说的另一个平台上是不显示的,未必就是内核没有收到吧。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP