2017-09-06 41 views
2

我想使用packet_mmap发送数据包以获得高数据包传输速率。我设法送使用原始模式的分组插座,其中用于这一目的,我创建L2,L3等数据包,并在缓冲区和使用如何使用packet_mmap发送SOCK_DGRAM数据包而不关心MAC地址?

sendto(fd_socket, NULL, 0, 0, NULL, sizeof(struct sockaddr_ll)); 

但是把它,我不想和目的MAC地址来打扰。所以我转而使用Dgram。如果我想使用sendto,则会有目标MAC地址的参数。虽然这不是我在不被关注的ARP缓存并指定目的地的MAC地址而言祝愿:

sendto(fd_socket, NULL, 0, 0, (struct sockaddr *) ps_sockaddr, sizeof(struct sockaddr_ll)); 

不过,我发现,发送也允许使用数据包插座使用。 http://man7.org/linux/man-pages/man7/packet.7.html 因此,我用ip头等填充缓冲区。在这种情况下,发送返回零,因为没有发现任何东西被发送,如果发送数据包时发生错误,我希望它不是零。

有没有办法使用packet_mmap而不关心L2地址?

回答

0

不会。当您在SOCK_DGRAM模式下使用包套接字时,您不需要构造L2报头,但仍然必须提供L2地址,然后系统会为您构造报头。 (因此,这将有利于为您实际构建数据包的L2部分,并且您不需要指定源MAC地址,但仍需要指定希望发送数据包的接口和目标MAC地址)

系统将如何知道在哪里发送数据包?我相信你是希望,系统会查看你已经在包缓冲区中构建的IP头,然后代表你进行接口选择和ARP查找,但通过使用包套接字,你绕过了网络堆栈的那部分。 (另外,如果IP地址不在本地局域网上,将有一个路由选择步骤需要 - 通常只是找到了 MAC地址默认网关和arping的)

现在你可以得到最(我认为)你想用raw插座(http://man7.org/linux/man-pages/man7/raw.7.html)。在这种情况下,您告诉内核您正在使用IP,但不会将其用于任何较高层(> L3)。在这种情况下,您也可以构建自己的IP报头,并使用IP_HDRINCL选项根据该报头进行路由决策。

+0

感谢您的回复。我得出了同样的结论,即在使用数据包套接字时无法从内核获取目标MAC地址。 至于原始套接字,不是真的。我想使用Linux内核免费提供的内核旁路方法,以获得比普通套接字更高的吞吐量。 – Mass

相关问题